[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
0

Configure Feed

Select the types of activity you want to include in your feed.

deploy: f48990e31f9657d77f12cc4d5a7616275131c72a

github-actions[bot] (Jan 15, 2026, 3:42 PM UTC) 4bfbde50 5276b57b

+489 -380
+3 -3
404.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Multi-Scrobbler</title><meta data-rh="true" property="og:title" content="Multi-Scrobbler"><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/404.html/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/404.html/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/404.html/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/404.html/" hreflang="x-default"><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
FAQ/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">FAQ | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/FAQ/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="FAQ | Multi-Scrobbler"><meta data-rh="true" name="description" content="Connection Issues"><meta data-rh="true" property="og:description" content="Connection Issues"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/FAQ/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/FAQ/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/FAQ/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"FAQ","item":"https://foxxmd.github.io/multi-scrobbler/FAQ"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+1 -1
aio.json
··· 1 - {"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"sourceDefaults":{"$ref":"#/definitions/SourceDefaults"},"clientDefaults":{"$ref":"#/definitions/ClientDefaults"},"sources":{"type":"array","items":{"$ref":"#/definitions/SourceAIOConfig"}},"clients":{"type":"array","items":{"$ref":"#/definitions/ClientAIOConfig"}},"webhooks":{"type":"array","items":{"$ref":"#/definitions/WebhookConfig"}},"port":{"type":"number","description":"Set the port the multi-scrobbler UI will be served from","default":9078,"examples":[9078]},"baseUrl":{"type":"string","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.","default":"http://localhost","examples":["http://localhost","http://192.168.0.101","https://ms.myDomain.tld"]},"logging":{"$ref":"#/definitions/LogOptions"},"disableWeb":{"type":"boolean","description":"Disable web server from running/listening on port.\n\nThis will also make any ingress sources (Plex, Jellyfin, Tautulli, etc...) unusable"},"debugMode":{"type":"boolean","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","default":false,"examples":[false]},"cache":{"$ref":"#/definitions/CacheConfigOptions"},"transformers":{"type":"array","items":{"$ref":"#/definitions/TransformerCommonConfig"}}},"definitions":{"SourceDefaults":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"SourceDefaults"},"LogLevel":{"type":"string","enum":["silent","fatal","error","warn","info","log","verbose","debug"],"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.","title":"LogLevel"},"FileLogOptions":{"type":"object","properties":{"timestamp":{"type":"string","enum":["unix","iso","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","default":"auto"},"size":{"type":["number","string"],"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.","default":"10MB"},"frequency":{"anyOf":[{"type":"string","enum":["daily"]},{"type":"string","enum":["hourly"]},{"type":"number"}],"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.","default":"daily"},"path":{"anyOf":[{"type":"string"},{"$comment":"() => string"}],"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","default":"./logs/app.log"},"level":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false}],"description":"Specify the minimum log level to output to rotating files. If `false` no log files will be created."}},"title":"FileLogOptions"},"ScrobbleThresholds":{"type":"object","properties":{"duration":{"type":["number","null"],"description":"The number of seconds a track has been listened to before it should be considered scrobbled.\n\nSet to null to disable.","default":240,"examples":[240]},"percent":{"type":["number","null"],"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.","default":50,"examples":[50]}},"title":"ScrobbleThresholds"},"PlayTransformOptions":{"type":"object","properties":{"log":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["all"]}]},"preCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"},"compare":{"type":"object","properties":{"candidate":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"},"existing":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"}}},"postCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"}},"title":"PlayTransformOptions"},"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm)>":{"anyOf":[{"$ref":"#/definitions/PlayTransformPartsArray%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"}],"description":"Represents the weakly-defined user config. May be an array of parts or one parts object","title":"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm)>"},"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>":{"type":"array","items":{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},"title":"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>"},"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>":{"anyOf":[{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeMetadata"},"name":{"type":"string"},"score":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeUser"},"name":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string","enum":["native"]},"name":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"name":{"type":"string"}}},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{},"artists":{},"albumArtists":{},"album":{},"duration":{},"meta":{},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"}},"required":["type"]}],"title":"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>"},"WhenConditionsConfig":{"$ref":"#/definitions/WhenConditions%3Cstring%3E","title":"WhenConditionsConfig"},"WhenConditions<string>":{"type":"array","items":{"$ref":"#/definitions/WhenParts%3Cstring%3E"},"title":"WhenConditions<string>"},"WhenParts<string>":{"$ref":"#/definitions/PlayTransformPartsAtomic%3Cstring%3E","title":"WhenParts<string>"},"PlayTransformPartsAtomic<string>":{"type":"object","properties":{"title":{"type":"string"},"artists":{"type":"string"},"albumArtists":{"type":"string"},"album":{"type":"string"},"duration":{"type":"string"},"meta":{"type":"string"}},"title":"PlayTransformPartsAtomic<string>"},"Whennable":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"}},"title":"Whennable"},"FlowControlTerm":{"type":"string","enum":["continue","stop"],"title":"FlowControlTerm"},"StageTypeMetadata":{"type":"string","enum":["spotify","musicbrainz","native"],"title":"StageTypeMetadata"},"SearchAndReplaceTerm":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ConditionalSearchAndReplaceTerm"}],"title":"SearchAndReplaceTerm"},"ConditionalSearchAndReplaceTerm":{"$ref":"#/definitions/ConditionalSearchAndReplaceRegExp","title":"ConditionalSearchAndReplaceTerm"},"ConditionalSearchAndReplaceRegExp":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["replace","search"],"title":"ConditionalSearchAndReplaceRegExp"},"SearchAndReplaceRegExp":{"type":"object","properties":{"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["search","replace"],"title":"SearchAndReplaceRegExp"},"ExternalMetadataTerm":{"anyOf":[{"type":"boolean"},{"not":{}},{"$ref":"#/definitions/Whennable"}],"title":"ExternalMetadataTerm"},"StageTypeUser":{"type":"string","enum":["user"],"title":"StageTypeUser"},"ClientDefaults":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"ClientDefaults"},"MatchLoggingOptions":{"type":"object","properties":{"onNoMatch":{"type":"boolean","description":"Log to DEBUG when a new track does NOT match an existing scrobble","default":false,"examples":[false]},"onMatch":{"type":"boolean","description":"Log to DEBUG when a new track DOES match an existing scrobble","default":false,"examples":[false]},"confidenceBreakdown":{"type":"boolean","description":"Include confidence breakdowns in track match logging, if applicable","default":false,"examples":[false]}},"description":"Scrobble matching (between new source track and existing client scrobbles) logging options. Used for debugging.","title":"MatchLoggingOptions"},"SourceAIOConfig":{"anyOf":[{"$ref":"#/definitions/SpotifySourceAIOConfig"},{"$ref":"#/definitions/PlexSourceAIOConfig"},{"$ref":"#/definitions/PlexApiSourceAIOConfig"},{"$ref":"#/definitions/TautulliSourceAIOConfig"},{"$ref":"#/definitions/DeezerSourceAIOConfig"},{"$ref":"#/definitions/DeezerInternalAIOConfig"},{"$ref":"#/definitions/ListenbrainzEndpointSourceAIOConfig"},{"$ref":"#/definitions/LastFMEndpointSourceAIOConfig"},{"$ref":"#/definitions/SubsonicSourceAIOConfig"},{"$ref":"#/definitions/JellySourceAIOConfig"},{"$ref":"#/definitions/JellyApiSourceAIOConfig"},{"$ref":"#/definitions/LastFmSouceAIOConfig"},{"$ref":"#/definitions/YTMusicSourceAIOConfig"},{"$ref":"#/definitions/MPRISSourceAIOConfig"},{"$ref":"#/definitions/MopidySourceAIOConfig"},{"$ref":"#/definitions/ListenBrainzSourceAIOConfig"},{"$ref":"#/definitions/JRiverSourceAIOConfig"},{"$ref":"#/definitions/KodiSourceAIOConfig"},{"$ref":"#/definitions/WebScrobblerSourceAIOConfig"},{"$ref":"#/definitions/ChromecastSourceAIOConfig"},{"$ref":"#/definitions/MalojaSourceAIOConfig"},{"$ref":"#/definitions/MusikcubeSourceAIOConfig"},{"$ref":"#/definitions/MusicCastSourceAIOConfig"},{"$ref":"#/definitions/MPDSourceAIOConfig"},{"$ref":"#/definitions/VLCSourceAIOConfig"},{"$ref":"#/definitions/IcecastSourceAIOConfig"},{"$ref":"#/definitions/AzuracastSourceAIOConfig"},{"$ref":"#/definitions/KoitoSourceAIOConfig"},{"$ref":"#/definitions/TealSourceAIOConfig"},{"$ref":"#/definitions/RockskySourceAIOConfig"}],"title":"SourceAIOConfig"},"SpotifySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SpotifySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["spotify"]}},"required":["data","type"],"title":"SpotifySourceAIOConfig"},"SpotifySourceData":{"type":"object","properties":{"interval":{"type":"number","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","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"spotify client id","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"clientSecret":{"type":"string","description":"spotify client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"spotify redirect URI -- required only if not the default shown here. URI must end in \"callback\"","default":"http://localhost:9078/callback","examples":["http://localhost:9078/callback"]}},"required":["clientId","clientSecret"],"title":"SpotifySourceData"},"CommonSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonSourceOptions"},"PlexSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["plex"]}},"required":["data","type"],"title":"PlexSourceAIOConfig"},"PlexSourceData":{"type":"object","properties":{"user":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"libraries":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"servers":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"PlexSourceData"},"PlexApiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/PlexApiOptions"},"type":{"type":"string","enum":["plex"]}},"required":["data","options","type"],"title":"PlexApiSourceAIOConfig"},"PlexApiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"token":{"type":"string"},"url":{"type":"string","description":"http(s)://HOST:PORT of the Plex server to connect to"},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"}},"required":["url"],"title":"PlexApiData"},"PlexApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"ignoreInvalidCert":{"type":"boolean","description":"Ignore invalid cert errors when connecting to Plex\n\nUseful for Plex servers using \"Required\" Secure Connections with self-signed certificates\n\nDo not enable unless you know you need this.","default":false}},"title":"PlexApiOptions"},"TautulliSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["tautulli"]}},"required":["data","type"],"title":"TautulliSourceAIOConfig"},"DeezerSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["deezer"]}},"required":["data","type"],"title":"DeezerSourceAIOConfig"},"DeezerData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"deezer client id","examples":["a89cba1569901a0671d5a9875fed4be1"]},"clientSecret":{"type":"string","description":"deezer client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"deezer redirect URI -- required only if not the default shown here. URI must end in \"callback\"","default":"http://localhost:9078/deezer/callback","examples":["http://localhost:9078/deezer/callback"]}},"required":["clientId","clientSecret"],"title":"DeezerData"},"DeezerInternalAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerInternalData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/DeezerInternalSourceOptions"},"type":{"type":"string","enum":["deezer"]}},"required":["data","type"],"title":"DeezerInternalAIOConfig"},"DeezerInternalData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"arl":{"type":"string","description":"ARL retrieved from Deezer response header"},"userAgent":{"type":"string","description":"User agent","default":"Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0"}},"required":["arl"],"title":"DeezerInternalData"},"DeezerInternalSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"fuzzyDiscoveryIgnore":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["aggressive"]}]}},"title":"DeezerInternalSourceOptions"},"ListenbrainzEndpointSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenbrainzEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["endpointlz"]}},"required":["type"],"title":"ListenbrainzEndpointSourceAIOConfig"},"ListenbrainzEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\n\nIf you are using multiple Listenbrainz endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/listenbrainz/usera\n* slug: 'originb' => API URL: http://localhost:9078/api/listenbrainz/originb\n\nIf no slug is found from an extension's incoming webhook event the first Listenbrainz source without a slug will be used"},"token":{"type":["string","null"],"description":"If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source\n\nSee: https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#add-the-user-token-to-your-requests"}},"title":"ListenbrainzEndpointData"},"LastFMEndpointSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFMEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["endpointlfm"]}},"required":["type"],"title":"LastFMEndpointSourceAIOConfig"},"LastFMEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\n\nIf you are using multiple Last.fm endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/lastfm/usera\n* slug: 'originb' => API URL: http://localhost:9078/api/lastfm/originb\n\nIf no slug is found from an extension's incoming webhook event the first Last.fm source without a slug will be used"}},"title":"LastFMEndpointData"},"SubsonicSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SubsonicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["subsonic"]}},"required":["data","type"],"title":"SubsonicSourceAIOConfig"},"SubsonicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL of the subsonic media server to query","examples":["http://airsonic.local"]},"user":{"type":"string","description":"Username to login to the server with","examples":[["MyUser"]]},"password":{"type":"string","description":"Password for the user to login to the server with","examples":["MyPassword"]},"ignoreTlsErrors":{"type":"boolean","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.","default":false},"legacyAuthentication":{"type":"boolean","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","default":false},"usersAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf undefined or an empty string/list MS will scrobble activity from all users"}},"required":["url","user","password"],"title":"SubsonicData"},"JellySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["jellyfin"]}},"required":["data","type"],"title":"JellySourceAIOConfig"},"JellyData":{"type":"object","properties":{"users":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"servers":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"JellyData"},"JellyApiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/JellyApiOptions"},"type":{"type":"string","enum":["jellyfin"]}},"required":["data","options","type"],"title":"JellyApiSourceAIOConfig"},"JellyApiData":{"type":"object","properties":{"url":{"type":"string","description":"HOST:PORT of the Jellyfin server to connect to"},"user":{"type":"string","description":"The username of the user to authenticate for or track scrobbles for"},"password":{"type":"string","description":"Password of the username to authenticate for\n\nRequired if `apiKey` is not provided."},"apiKey":{"type":"string","description":"API Key to authenticate with.\n\nRequired if `password` is not provided."},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"},"additionalAllowedLibraryTypes":{"type":"array","items":{},"description":"Allow MS to scrobble audio media in libraries classified other than 'music'\n\n`librariesAllow` will achieve the same result as this but this is more convenient if you do not want to explicitly list every library name or are only using `librariesBlock`"},"allowUnknown":{"type":"boolean","description":"Force media with a type of \"Unknown\" to be counted as Audio","default":false},"frontendUrlOverride":{"type":"string","description":"HOST:PORT of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from)\nIf unspecified it will use the normal server HOST and PORT from the `url`\nNecessary if you are using a reverse proxy or other network configuration that prevents the frontend from accessing the server directly\n\nENV: JELLYFIN_FRONTEND_URL_OVERRIDE"}},"required":["url","user"],"title":"JellyApiData"},"JellyApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"JellyApiOptions"},"LastFmSouceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFmSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `lastfm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["lastfm"]}},"required":["data","type"],"title":"LastFmSouceAIOConfig"},"LastFmSourceData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]},"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"}},"required":["apiKey","secret"],"title":"LastFmSourceData"},"YTMusicSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/YTMusicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"type":"object","properties":{"logAuth":{"type":"boolean","description":"When true MS will log to DEBUG all of the credentials data it receives from YTM"},"logDiff":{"type":"boolean","description":"Always log history diff\n\nBy default MS will log to `WARN` if history diff is inconsistent but does not log if diff is expected (on new tracks found)\nSet this to `true` to ALWAYS log diff on new tracks. Expected diffs will log to `DEBUG` and inconsistent diffs will continue to log to `WARN`","default":false},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}}},"type":{"type":"string","enum":["ytmusic"]}},"required":["type"],"title":"YTMusicSourceAIOConfig"},"YTMusicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"cookie":{"type":"string","description":"The cookie retrieved from the Request Headers of music.youtube.com after logging in.\n\nSee https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers for how to retrieve this value.","examples":["VISITOR_INFO1_LIVE=jMp2xA1Xz2_PbVc; __Secure-3PAPISID=3AxsXpy0M/AkISpjek; ..."]},"clientId":{"type":"string","description":"Google Cloud Console project OAuth Client ID\n\nGenerated from a custom OAuth Client, see docs"},"clientSecret":{"type":"string","description":"Google Cloud Console project OAuth Client Secret\n\nGenerated from a custom OAuth Client, see docs"},"redirectUri":{"type":"string","description":"Google Cloud Console project OAuth Client Authorized redirect URI\n\nGenerated from a custom OAuth Client, see docs. multi-scrobbler will generate a default based on BASE_URL.\nOnly specify this if the default does not work for you."},"innertubeOptions":{"$ref":"#/definitions/InnertubeOptions","description":"Additional options for authorization and tailoring YTM client"}},"title":"YTMusicData"},"InnertubeOptions":{"type":"object","properties":{"po_token":{"type":"string","description":"Proof of Origin token\n\nMay be required if YTM starts returning 403"},"visitor_data":{"type":"string","description":"Visitor ID value found in VISITOR_INFO1_LIVE or visitorData cookie\n\nMay be required if YTM starts returning 403"},"account_index":{"type":"number","description":"If account login results in being able to choose multiple account, use a zero-based index to choose which one to monitor","examples":[0,1]},"location":{"type":"string"},"lang":{"type":"string"},"generate_session_locally":{"type":"boolean"},"device_category":{"type":"string"},"client_type":{"type":"string"},"timezone":{"type":"string"}},"title":"InnertubeOptions"},"MPRISSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPRISData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["mpris"]}},"required":["data","type"],"title":"MPRISSourceAIOConfig"},"MPRISData":{"type":"object","properties":{"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any players that START WITH these values, case-insensitive","examples":[["spotify","vlc"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"MPRISData"},"MopidySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MopidyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["mopidy"]}},"required":["data","type"],"title":"MopidySourceAIOConfig"},"MopidyData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"ws://localhost:6680/mopidy/ws/"},"uriBlacklist":{"type":"array","items":{"type":"string"},"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."},"uriWhitelist":{"type":"array","items":{"type":"string"},"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."},"albumBlacklist":{"type":"array","items":{"type":"string"},"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"]],"default":["Soundcloud"]}},"title":"MopidyData"},"ListenBrainzSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenBrainzSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `listenbrainz.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["listenbrainz"]}},"required":["data","type"],"title":"ListenBrainzSourceAIOConfig"},"ListenBrainzSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzSourceData"},"JRiverSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JRiverData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["jriver"]}},"required":["data","type"],"title":"JRiverSourceAIOConfig"},"JRiverData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"http://localhost:52199/MCWS/v1/"},"username":{"type":"string","description":"If you have enabled authentication, the username you set"},"password":{"type":"string","description":"If you have enabled authentication, the password you set"}},"required":["url"],"title":"JRiverData"},"KodiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KodiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["kodi"]}},"required":["data","type"],"title":"KodiSourceAIOConfig"},"KodiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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"],"default":"http://localhost:8080/jsonrpc"},"username":{"type":"string","description":"The username set for Remote Control via Web Sever"},"password":{"type":"string","description":"The password set for Remote Control via Web Sever"}},"required":["url","username","password"],"title":"KodiData"},"WebScrobblerSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/WebScrobblerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["webscrobbler"]}},"required":["type"],"title":"WebScrobblerSourceAIOConfig"},"WebScrobblerData":{"type":"object","properties":{"slug":{"type":["string","null"],"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"},"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Block scrobbling from specific WebScrobbler Connectors","examples":[["youtube"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only allow scrobbling from specific WebScrobbler Connectors","examples":[["mixcloud","soundcloud","bandcamp"]]}},"title":"WebScrobblerData"},"ChromecastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ChromecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["chromecast"]}},"required":["data","type"],"title":"ChromecastSourceAIOConfig"},"ChromecastData":{"type":"object","properties":{"blacklistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"whitelistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"blacklistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any application that START WITH these values, case-insensitive","examples":[["spotify","pandora"]]},"whitelistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"useAvahi":{"type":"boolean","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.","default":false},"useAutoDiscovery":{"type":"boolean","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"},"devices":{"type":"array","items":{"$ref":"#/definitions/ChromecastDeviceInfo"},"description":"A list of Google Cast devices to monitor\n\nIf this is used then `useAutoDiscovery` is set to FALSE, if not explicitly set"},"allowUnknownMedia":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"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","default":false},"forceMediaRecognitionOn":{"type":"array","items":{"type":"string"},"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"}},"title":"ChromecastData"},"ChromecastDeviceInfo":{"type":"object","properties":{"name":{"type":"string","description":"A friendly name to identify this device","examples":["MySmartTV"]},"address":{"type":"string","description":"The IP address of the device","examples":["192.168.0.115"]}},"required":["name","address"],"title":"ChromecastDeviceInfo"},"MalojaSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MalojaSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `maloja.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["maloja"]}},"required":["data","type"],"title":"MalojaSourceAIOConfig"},"MalojaSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaSourceData"},"MusikcubeSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusikcubeData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["musikcube"]}},"required":["data","type"],"title":"MusikcubeSourceAIOConfig"},"MusikcubeData":{"type":"object","properties":{"url":{"type":"string","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"],"default":"ws://localhost:7905"},"password":{"type":"string","description":"Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation\n\n* musikcube -> settings -> server setup -> password"},"device_id":{"type":"string"}},"required":["password"],"title":"MusikcubeData"},"MusicCastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusicCastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["musiccast"]}},"required":["data","type"],"title":"MusicCastSourceAIOConfig"},"MusicCastData":{"type":"object","properties":{"url":{"type":"string","description":"The host or URL of the YamahaExtendedControl endpoint to use","examples":[["192.168.0.101","http://192.168.0.101/YamahaExtendedControl"]]}},"required":["url"],"title":"MusicCastData"},"MPDSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPDData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/MPDSourceOptions"},"type":{"type":"string","enum":["mpd"]}},"required":["data","options","type"],"title":"MPDSourceAIOConfig"},"MPDData":{"type":"object","properties":{"url":{"type":"string","description":"URL:PORT of the MPD server to connect to\n\nTo use this you must have TCP connections enabled for your MPD server https://mpd.readthedocs.io/en/stable/user.html#client-connections","examples":["localhost:6600"],"default":"localhost:6600"},"path":{"type":"string","description":"If using socket specify the path instead of url.\n\ntrailing `~` is replaced by your home directory"},"password":{"type":"string","description":"Password for the server, if set https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords"}},"title":"MPDData"},"MPDSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"MPDSourceOptions"},"VLCSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/VLCData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/VLCSourceOptions"},"type":{"type":"string","enum":["vlc"]}},"required":["data","type"],"title":"VLCSourceAIOConfig"},"VLCData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL:PORT of the VLC server to connect to\n\nTo use this you must have the Web (http) interface module enabled and a password set https://foxxmd.github.io/multi-scrobbler/docs/configuration#vlc","examples":["localhost:8080"],"default":"localhost:8080"},"password":{"type":"string","description":"Password for the server"}},"required":["password"],"title":"VLCData"},"VLCSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"filenamePatterns":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"A list of regular expressions to use to extract metadata (title, album, artist) from a filename\n\nUsed when VLC reports only the filename for the current audio track"},"logFilenamePatterns":{"type":"boolean","description":"Log to DEBUG when a filename-only track is matched or not matched by filenamePatterns","default":false},"dumpVlcMetadata":{"type":"boolean","description":"Dump all the metadata VLC reports for an audio track to DEBUG.\n\nUse this if reporting an issue with VLC not correctly capturing metadata for a track.","default":false}},"title":"VLCSourceOptions"},"IcecastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/IcecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/IcecastSourceOptions"},"type":{"type":"string","enum":["icecast"]}},"required":["data","type"],"title":"IcecastSourceAIOConfig"},"IcecastData":{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/definitions/IcecastSource"}},"icestatsEndpoint":{"type":"string"},"statsEndpoint":{"type":"string"},"nextsongsEndpoint":{"type":"string"},"sevenhtmlEndpoint":{"type":"string"},"icyMetaInt":{"type":"number"},"url":{"type":"string","description":"The Icecast stream URL"}},"required":["url"],"title":"IcecastData"},"IcecastSource":{"type":"string","enum":["icy","ogg","icestats","stats","sevenhtml","nextsongs"],"title":"IcecastSource"},"IcecastSourceOptions":{"type":"object","properties":{"systemScrobble":{"type":"boolean","description":"For Sources that support manual listening, should MS default to scrobbling when no user interaction has occurred?\n\nIf not specified MS will use a Source's specific behavior, see Source's documentation."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"IcecastSourceOptions"},"AzuracastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/AzuracastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["azuracast"]}},"required":["data","type"],"title":"AzuracastSourceAIOConfig"},"AzuracastData":{"type":"object","properties":{"url":{"type":"string","description":"Base URL of the Azuracast instance\n\nThis does NOT include the station. If a station is included it will be ignored. Use `station` field to specify station, if necessary","examples":["https://radio.mydomain.tld","http://localhost:80"]},"station":{"type":"string","description":"The specific station to monitor\n\nScrobbling will only occur if any of the monitor conditions are met AND the station is ONLINE.\n\nTo monitor multiple stations create a Source for each station.","examples":["my-station-1"]},"monitorWhenListeners":{"type":["boolean","number"],"description":"Only activate scrobble monitoring if station\n\n* `true` => has any current listeners\n* `number` => has EQUAL TO or MORE THAN X number of listeners"},"monitorWhenLive":{"type":"boolean","description":"Only activate scrobble monitoring if station has a live DJ/Streamer","default":true},"apiKey":{"type":"string","description":"API Key used to access data about private streams\n\nhttps://www.azuracast.com/docs/developers/apis/#api-authentication"}},"required":["url","station"],"title":"AzuracastData"},"KoitoSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KoitoSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `koito.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["koito"]}},"required":["data","type"],"title":"KoitoSourceAIOConfig"},"KoitoSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoSourceData"},"TealSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/TealSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/TealSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"Should always be `souce` when using Tealfm as a Source","default":"source","examples":["source"]},"type":{"type":"string","enum":["tealfm"]}},"required":["data","type"],"title":"TealSourceAIOConfig"},"TealSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\n\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\n\n* For **App Password** Auth - your email\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\n\nThis is created under https://bsky.app/settings/app-passwords\n\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"},"serviceAllow":{"type":"array","items":{"type":"string"}},"serviceDeny":{"type":"array","items":{"type":"string"}}},"required":["identifier"],"title":"TealSourceData"},"TealSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealSourceOptions"},"RockskySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/RockskySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/RockskySourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `rocksky.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["rocksky"]}},"required":["data","type"],"title":"RockskySourceAIOConfig"},"RockskySourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\n\n* alice.bsky.social\n* foxxmd.com\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockskySourceData"},"RockskySourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockskySourceOptions"},"ClientAIOConfig":{"anyOf":[{"$ref":"#/definitions/MalojaClientAIOConfig"},{"$ref":"#/definitions/LastfmClientAIOConfig"},{"$ref":"#/definitions/ListenBrainzClientAIOConfig"},{"$ref":"#/definitions/KoitoClientAIOConfig"},{"$ref":"#/definitions/TealClientAIOConfig"},{"$ref":"#/definitions/RockSkyClientAIOConfig"}],"title":"ClientAIOConfig"},"MalojaClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/MalojaClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Maloja as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["maloja"]}},"required":["data","name","type"],"title":"MalojaClientAIOConfig"},"MalojaClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaClientData"},"CommonClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonClientOptions"},"LastfmClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LastfmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LastfmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using LastFM as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["lastfm"]}},"required":["data","name","type"],"title":"LastfmClientAIOConfig"},"LastfmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]}},"required":["apiKey","secret"],"title":"LastfmData"},"LastfmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LastfmClientOptions"},"ListenBrainzClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/ListenBrainzClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Listenbrainz as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["listenbrainz"]}},"required":["data","name","type"],"title":"ListenBrainzClientAIOConfig"},"ListenBrainzClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzClientData"},"KoitoClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/KoitoClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Koito as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["koito"]}},"required":["data","name","type"],"title":"KoitoClientAIOConfig"},"KoitoClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoClientData"},"TealClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/TealClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/TealClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Tealfm as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["tealfm"]}},"required":["data","name","type"],"title":"TealClientAIOConfig"},"TealClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\n\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\n\n* For **App Password** Auth - your email\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\n\nThis is created under https://bsky.app/settings/app-passwords\n\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"}},"required":["identifier"],"title":"TealClientData"},"TealClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealClientOptions"},"RockSkyClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/RockSkyClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/RockSkyClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using RockSky as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["rocksky"]}},"required":["data","name","type"],"title":"RockSkyClientAIOConfig"},"RockSkyClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\n\n* alice.bsky.social\n* foxxmd.com\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockSkyClientData"},"RockSkyClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockSkyClientOptions"},"WebhookConfig":{"anyOf":[{"$ref":"#/definitions/GotifyConfig"},{"$ref":"#/definitions/NtfyConfig"},{"$ref":"#/definitions/AppriseConfig"}],"title":"WebhookConfig"},"GotifyConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\n\n* gotify\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"url":{"type":"string","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"]},"token":{"type":"string","description":"The token created for this Application in Gotify","examples":["AQZI58fA.rfSZbm"]},"priorities":{"$ref":"#/definitions/PrioritiesConfig","description":"Priority of messages\n\n* Info -> 5\n* Warn -> 7\n* Error -> 10"}},"required":["token","type","url"],"title":"GotifyConfig"},"PrioritiesConfig":{"type":"object","properties":{"info":{"type":"number","examples":[5]},"warn":{"type":"number","examples":[7]},"error":{"type":"number","examples":[10]}},"required":["info","warn","error"],"title":"PrioritiesConfig"},"NtfyConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\n\n* gotify\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"url":{"type":"string","description":"The URL of the Ntfy server","examples":["http://192.168.0.100:8078"]},"topic":{"type":"string","description":"The topic mutli-scrobbler should POST to"},"username":{"type":"string","description":"Required if topic is protected"},"password":{"type":"string","description":"Required if topic is protected"},"token":{"type":"string","description":"Use instead of username/password, required if topic is protected"},"priorities":{"$ref":"#/definitions/PrioritiesConfig","description":"Priority of messages\n\n* Info -> 3\n* Warn -> 4\n* Error -> 5"}},"required":["topic","type","url"],"title":"NtfyConfig"},"AppriseConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\n\n* gotify\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"host":{"type":"string","description":"The URL of the apprise-api server","examples":["http://192.168.0.100:8078"]},"urls":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"},"keys":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"},"tags":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Optional [tag(s)](https://github.com/caronc/apprise-api?tab=readme-ov-file#tagging) to send in the notification payload"}},"required":["host","type"],"title":"AppriseConfig"},"LogOptions":{"type":"object","properties":{"level":{"$ref":"#/definitions/LogLevel","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.","default":"info"},"file":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false},{"$ref":"#/definitions/FileLogOptions"}],"description":"Specify the minimum log level to output to rotating files or file output options. If `false` no log files will be created."},"console":{"$ref":"#/definitions/LogLevel","description":"Specify the minimum log level streamed to the console (or docker container)"}},"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```","title":"LogOptions"},"CacheConfigOptions":{"type":"object","properties":{"metadata":{"$ref":"#/definitions/CacheMetadataConfig"},"scrobble":{"$ref":"#/definitions/CacheScrobbleConfig"},"auth":{"$ref":"#/definitions/CacheAuthConfig"},"regex":{"type":"number","description":"Number of regex functions to cache (LRU)","default":200}},"title":"CacheConfigOptions"},"CacheMetadataConfig":{"$ref":"#/definitions/CacheConfig%3CCacheMetadataProvider%3E","title":"CacheMetadataConfig"},"CacheConfig<CacheMetadataProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheMetadataProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheMetadataProvider>"},"CacheMetadataProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheMetadataProvider"},"CacheProvider":{"type":["string","boolean"],"enum":["memory","valkey","file",false],"title":"CacheProvider"},"CacheScrobbleConfig":{"$ref":"#/definitions/CacheConfig%3CCacheScrobbleProvider%3E","title":"CacheScrobbleConfig"},"CacheConfig<CacheScrobbleProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheScrobbleProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheScrobbleProvider>"},"CacheScrobbleProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheScrobbleProvider"},"CacheAuthConfig":{"$ref":"#/definitions/CacheConfig%3CCacheAuthProvider%3E","title":"CacheAuthConfig"},"CacheConfig<CacheAuthProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheAuthProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheAuthProvider>"},"CacheAuthProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheAuthProvider"},"TransformerCommonConfig":{"type":"object","properties":{"defaults":{"type":"object"},"data":{"type":"object"},"type":{"type":"string"},"name":{"type":"string"},"options":{"$ref":"#/definitions/TransformOptions"}},"required":["type"],"title":"TransformerCommonConfig"},"TransformOptions":{"type":"object","properties":{"failOnFetch":{"type":"boolean"},"throwOnFailure":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string","enum":["artists","title","albumArtists","album","duration","meta"]}}]},"ttl":{"type":"string"}},"title":"TransformOptions"}}} 1 + {"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"sourceDefaults":{"$ref":"#/definitions/SourceDefaults"},"clientDefaults":{"$ref":"#/definitions/ClientDefaults"},"sources":{"type":"array","items":{"$ref":"#/definitions/SourceAIOConfig"}},"clients":{"type":"array","items":{"$ref":"#/definitions/ClientAIOConfig"}},"webhooks":{"type":"array","items":{"$ref":"#/definitions/WebhookConfig"}},"port":{"type":"number","description":"Set the port the multi-scrobbler UI will be served from","default":9078,"examples":[9078]},"baseUrl":{"type":"string","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.","default":"http://localhost","examples":["http://localhost","http://192.168.0.101","https://ms.myDomain.tld"]},"logging":{"$ref":"#/definitions/LogOptions"},"disableWeb":{"type":"boolean","description":"Disable web server from running/listening on port.\n\nThis will also make any ingress sources (Plex, Jellyfin, Tautulli, etc...) unusable"},"debugMode":{"type":"boolean","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","default":false,"examples":[false]},"cache":{"$ref":"#/definitions/CacheConfigOptions"},"transformers":{"type":"array","items":{"$ref":"#/definitions/TransformerCommonConfig"}}},"definitions":{"SourceDefaults":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"SourceDefaults"},"LogLevel":{"type":"string","enum":["silent","fatal","error","warn","info","log","verbose","debug"],"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.","title":"LogLevel"},"FileLogOptions":{"type":"object","properties":{"timestamp":{"type":"string","enum":["unix","iso","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","default":"auto"},"size":{"type":["number","string"],"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.","default":"10MB"},"frequency":{"anyOf":[{"type":"string","enum":["daily"]},{"type":"string","enum":["hourly"]},{"type":"number"}],"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.","default":"daily"},"path":{"anyOf":[{"type":"string"},{"$comment":"() => string"}],"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","default":"./logs/app.log"},"level":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false}],"description":"Specify the minimum log level to output to rotating files. If `false` no log files will be created."}},"title":"FileLogOptions"},"ScrobbleThresholds":{"type":"object","properties":{"duration":{"type":["number","null"],"description":"The number of seconds a track has been listened to before it should be considered scrobbled.\n\nSet to null to disable.","default":240,"examples":[240]},"percent":{"type":["number","null"],"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.","default":50,"examples":[50]}},"title":"ScrobbleThresholds"},"PlayTransformOptions":{"type":"object","properties":{"log":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["all"]}]},"preCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"},"compare":{"type":"object","properties":{"candidate":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"},"existing":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"}}},"postCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"}},"title":"PlayTransformOptions"},"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm)>":{"anyOf":[{"$ref":"#/definitions/PlayTransformPartsArray%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"}],"description":"Represents the weakly-defined user config. May be an array of parts or one parts object","title":"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm)>"},"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>":{"type":"array","items":{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},"title":"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>"},"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>":{"anyOf":[{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeMetadata"},"name":{"type":"string"},"stageHash":{"type":"string"},"score":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeUser"},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string","enum":["native"]},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"name":{"type":"string"}}},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{},"artists":{},"albumArtists":{},"album":{},"duration":{},"meta":{},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]}],"title":"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>"},"WhenConditionsConfig":{"$ref":"#/definitions/WhenConditions%3Cstring%3E","title":"WhenConditionsConfig"},"WhenConditions<string>":{"type":"array","items":{"$ref":"#/definitions/WhenParts%3Cstring%3E"},"title":"WhenConditions<string>"},"WhenParts<string>":{"$ref":"#/definitions/PlayTransformPartsAtomic%3Cstring%3E","title":"WhenParts<string>"},"PlayTransformPartsAtomic<string>":{"type":"object","properties":{"title":{"type":"string"},"artists":{"type":"string"},"albumArtists":{"type":"string"},"album":{"type":"string"},"duration":{"type":"string"},"meta":{"type":"string"}},"title":"PlayTransformPartsAtomic<string>"},"Whennable":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"}},"title":"Whennable"},"FlowControlTerm":{"type":"string","enum":["continue","stop"],"title":"FlowControlTerm"},"StageTypeMetadata":{"type":"string","enum":["spotify","musicbrainz","native"],"title":"StageTypeMetadata"},"SearchAndReplaceTerm":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ConditionalSearchAndReplaceTerm"}],"title":"SearchAndReplaceTerm"},"ConditionalSearchAndReplaceTerm":{"$ref":"#/definitions/ConditionalSearchAndReplaceRegExp","title":"ConditionalSearchAndReplaceTerm"},"ConditionalSearchAndReplaceRegExp":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["replace","search"],"title":"ConditionalSearchAndReplaceRegExp"},"SearchAndReplaceRegExp":{"type":"object","properties":{"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["search","replace"],"title":"SearchAndReplaceRegExp"},"ExternalMetadataTerm":{"anyOf":[{"type":"boolean"},{"not":{}},{"$ref":"#/definitions/Whennable"}],"title":"ExternalMetadataTerm"},"StageTypeUser":{"type":"string","enum":["user"],"title":"StageTypeUser"},"ClientDefaults":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"ClientDefaults"},"MatchLoggingOptions":{"type":"object","properties":{"onNoMatch":{"type":"boolean","description":"Log to DEBUG when a new track does NOT match an existing scrobble","default":false,"examples":[false]},"onMatch":{"type":"boolean","description":"Log to DEBUG when a new track DOES match an existing scrobble","default":false,"examples":[false]},"confidenceBreakdown":{"type":"boolean","description":"Include confidence breakdowns in track match logging, if applicable","default":false,"examples":[false]}},"description":"Scrobble matching (between new source track and existing client scrobbles) logging options. Used for debugging.","title":"MatchLoggingOptions"},"SourceAIOConfig":{"anyOf":[{"$ref":"#/definitions/SpotifySourceAIOConfig"},{"$ref":"#/definitions/PlexApiSourceAIOConfig"},{"$ref":"#/definitions/DeezerSourceAIOConfig"},{"$ref":"#/definitions/DeezerInternalAIOConfig"},{"$ref":"#/definitions/ListenbrainzEndpointSourceAIOConfig"},{"$ref":"#/definitions/LastFMEndpointSourceAIOConfig"},{"$ref":"#/definitions/SubsonicSourceAIOConfig"},{"$ref":"#/definitions/JellyApiSourceAIOConfig"},{"$ref":"#/definitions/LastFmSouceAIOConfig"},{"$ref":"#/definitions/LibrefmSouceAIOConfig"},{"$ref":"#/definitions/YTMusicSourceAIOConfig"},{"$ref":"#/definitions/MPRISSourceAIOConfig"},{"$ref":"#/definitions/MopidySourceAIOConfig"},{"$ref":"#/definitions/ListenBrainzSourceAIOConfig"},{"$ref":"#/definitions/JRiverSourceAIOConfig"},{"$ref":"#/definitions/KodiSourceAIOConfig"},{"$ref":"#/definitions/WebScrobblerSourceAIOConfig"},{"$ref":"#/definitions/ChromecastSourceAIOConfig"},{"$ref":"#/definitions/MalojaSourceAIOConfig"},{"$ref":"#/definitions/MusikcubeSourceAIOConfig"},{"$ref":"#/definitions/MusicCastSourceAIOConfig"},{"$ref":"#/definitions/MPDSourceAIOConfig"},{"$ref":"#/definitions/VLCSourceAIOConfig"},{"$ref":"#/definitions/IcecastSourceAIOConfig"},{"$ref":"#/definitions/AzuracastSourceAIOConfig"},{"$ref":"#/definitions/KoitoSourceAIOConfig"},{"$ref":"#/definitions/TealSourceAIOConfig"},{"$ref":"#/definitions/RockskySourceAIOConfig"}],"title":"SourceAIOConfig"},"SpotifySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SpotifySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["spotify"]}},"required":["data","type"],"title":"SpotifySourceAIOConfig"},"SpotifySourceData":{"type":"object","properties":{"interval":{"type":"number","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","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"spotify client id","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"clientSecret":{"type":"string","description":"spotify client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"spotify redirect URI -- required only if not the default shown here. URI must end in \"callback\"","default":"http://localhost:9078/callback","examples":["http://localhost:9078/callback"]}},"required":["clientId","clientSecret"],"title":"SpotifySourceData"},"CommonSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonSourceOptions"},"PlexApiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/PlexApiOptions"},"type":{"type":"string","enum":["plex"]}},"required":["data","type"],"title":"PlexApiSourceAIOConfig"},"PlexApiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"token":{"type":"string"},"url":{"type":"string","description":"http(s)://HOST:PORT of the Plex server to connect to"},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"}},"required":["url"],"title":"PlexApiData"},"PlexApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"ignoreInvalidCert":{"type":"boolean","description":"Ignore invalid cert errors when connecting to Plex\n\nUseful for Plex servers using \"Required\" Secure Connections with self-signed certificates\n\nDo not enable unless you know you need this.","default":false}},"title":"PlexApiOptions"},"DeezerSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["deezer"]}},"required":["data","type"],"title":"DeezerSourceAIOConfig"},"DeezerData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"deezer client id","examples":["a89cba1569901a0671d5a9875fed4be1"]},"clientSecret":{"type":"string","description":"deezer client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"deezer redirect URI -- required only if not the default shown here. URI must end in \"callback\"","default":"http://localhost:9078/deezer/callback","examples":["http://localhost:9078/deezer/callback"]}},"required":["clientId","clientSecret"],"title":"DeezerData"},"DeezerInternalAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerInternalData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/DeezerInternalSourceOptions"},"type":{"type":"string","enum":["deezer"]}},"required":["data","type"],"title":"DeezerInternalAIOConfig"},"DeezerInternalData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"arl":{"type":"string","description":"ARL retrieved from Deezer response header"},"userAgent":{"type":"string","description":"User agent","default":"Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0"}},"required":["arl"],"title":"DeezerInternalData"},"DeezerInternalSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"fuzzyDiscoveryIgnore":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["aggressive"]}]}},"title":"DeezerInternalSourceOptions"},"ListenbrainzEndpointSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenbrainzEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["endpointlz"]}},"required":["type"],"title":"ListenbrainzEndpointSourceAIOConfig"},"ListenbrainzEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\n\nIf you are using multiple Listenbrainz endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/listenbrainz/usera\n* slug: 'originb' => API URL: http://localhost:9078/api/listenbrainz/originb\n\nIf no slug is found from an extension's incoming webhook event the first Listenbrainz source without a slug will be used"},"token":{"type":["string","null"],"description":"If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source\n\nSee: https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#add-the-user-token-to-your-requests"}},"title":"ListenbrainzEndpointData"},"LastFMEndpointSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFMEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["endpointlfm"]}},"required":["type"],"title":"LastFMEndpointSourceAIOConfig"},"LastFMEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\n\nIf you are using multiple Last.fm endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/lastfm/usera\n* slug: 'originb' => API URL: http://localhost:9078/api/lastfm/originb\n\nIf no slug is found from an extension's incoming webhook event the first Last.fm source without a slug will be used"}},"title":"LastFMEndpointData"},"SubsonicSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SubsonicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["subsonic"]}},"required":["data","type"],"title":"SubsonicSourceAIOConfig"},"SubsonicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL of the subsonic media server to query","examples":["http://airsonic.local"]},"user":{"type":"string","description":"Username to login to the server with","examples":[["MyUser"]]},"password":{"type":"string","description":"Password for the user to login to the server with","examples":["MyPassword"]},"ignoreTlsErrors":{"type":"boolean","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.","default":false},"legacyAuthentication":{"type":"boolean","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","default":false},"usersAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf undefined or an empty string/list MS will scrobble activity from all users"}},"required":["url","user","password"],"title":"SubsonicData"},"JellyApiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/JellyApiOptions"},"type":{"type":"string","enum":["jellyfin"]}},"required":["data","options","type"],"title":"JellyApiSourceAIOConfig"},"JellyApiData":{"type":"object","properties":{"url":{"type":"string","description":"HOST:PORT of the Jellyfin server to connect to"},"user":{"type":"string","description":"The username of the user to authenticate for or track scrobbles for"},"password":{"type":"string","description":"Password of the username to authenticate for\n\nRequired if `apiKey` is not provided."},"apiKey":{"type":"string","description":"API Key to authenticate with.\n\nRequired if `password` is not provided."},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"},"additionalAllowedLibraryTypes":{"type":"array","items":{},"description":"Allow MS to scrobble audio media in libraries classified other than 'music'\n\n`librariesAllow` will achieve the same result as this but this is more convenient if you do not want to explicitly list every library name or are only using `librariesBlock`"},"allowUnknown":{"type":"boolean","description":"Force media with a type of \"Unknown\" to be counted as Audio","default":false},"frontendUrlOverride":{"type":"string","description":"HOST:PORT of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from)\nIf unspecified it will use the normal server HOST and PORT from the `url`\nNecessary if you are using a reverse proxy or other network configuration that prevents the frontend from accessing the server directly\n\nENV: JELLYFIN_FRONTEND_URL_OVERRIDE"}},"required":["url","user"],"title":"JellyApiData"},"JellyApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"JellyApiOptions"},"LastFmSouceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFmSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `lastfm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["lastfm"]}},"required":["data","type"],"title":"LastFmSouceAIOConfig"},"LastFmSourceData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm/Libre.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm/Libre.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]},"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"}},"required":["apiKey","secret"],"title":"LastFmSourceData"},"LibrefmSouceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LibrefmData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `librefm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["librefm"]}},"required":["data","type"],"title":"LibrefmSouceAIOConfig"},"LibrefmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"Optional Secret for Libre.fm account\n\nThis can be anything, or it will be generated by multi-scrobbler","examples":["anyValue"]},"secret":{"type":"string","description":"Optional Secret for Libre.fm account\n\nThis can be anything, or it will be generated by multi-scrobbler","examples":["anyValue"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"path":{"type":"string"},"urlBase":{"type":"string","description":"(Optional) The host and path prefix for your Libre.fm instance","default":"https://libre.fm/2.0/"},"redirectUri":{"type":"string","description":"Optional URI to use for callback. Specify this if callback should be different than the default. MUST have \"librefm/callback\" in the URL somewhere.","default":"http://localhost:9078/librefm/callback","examples":["http://localhost:9078/librefm/callback"]}},"title":"LibrefmData"},"YTMusicSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/YTMusicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"type":"object","properties":{"logAuth":{"type":"boolean","description":"When true MS will log to DEBUG all of the credentials data it receives from YTM"},"logDiff":{"type":"boolean","description":"Always log history diff\n\nBy default MS will log to `WARN` if history diff is inconsistent but does not log if diff is expected (on new tracks found)\nSet this to `true` to ALWAYS log diff on new tracks. Expected diffs will log to `DEBUG` and inconsistent diffs will continue to log to `WARN`","default":false},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}}},"type":{"type":"string","enum":["ytmusic"]}},"required":["type"],"title":"YTMusicSourceAIOConfig"},"YTMusicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"cookie":{"type":"string","description":"The cookie retrieved from the Request Headers of music.youtube.com after logging in.\n\nSee https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers for how to retrieve this value.","examples":["VISITOR_INFO1_LIVE=jMp2xA1Xz2_PbVc; __Secure-3PAPISID=3AxsXpy0M/AkISpjek; ..."]},"clientId":{"type":"string","description":"Google Cloud Console project OAuth Client ID\n\nGenerated from a custom OAuth Client, see docs"},"clientSecret":{"type":"string","description":"Google Cloud Console project OAuth Client Secret\n\nGenerated from a custom OAuth Client, see docs"},"redirectUri":{"type":"string","description":"Google Cloud Console project OAuth Client Authorized redirect URI\n\nGenerated from a custom OAuth Client, see docs. multi-scrobbler will generate a default based on BASE_URL.\nOnly specify this if the default does not work for you."},"innertubeOptions":{"$ref":"#/definitions/InnertubeOptions","description":"Additional options for authorization and tailoring YTM client"}},"title":"YTMusicData"},"InnertubeOptions":{"type":"object","properties":{"po_token":{"type":"string","description":"Proof of Origin token\n\nMay be required if YTM starts returning 403"},"visitor_data":{"type":"string","description":"Visitor ID value found in VISITOR_INFO1_LIVE or visitorData cookie\n\nMay be required if YTM starts returning 403"},"account_index":{"type":"number","description":"If account login results in being able to choose multiple account, use a zero-based index to choose which one to monitor","examples":[0,1]},"location":{"type":"string"},"lang":{"type":"string"},"generate_session_locally":{"type":"boolean"},"device_category":{"type":"string"},"client_type":{"type":"string"},"timezone":{"type":"string"}},"title":"InnertubeOptions"},"MPRISSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPRISData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["mpris"]}},"required":["data","type"],"title":"MPRISSourceAIOConfig"},"MPRISData":{"type":"object","properties":{"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any players that START WITH these values, case-insensitive","examples":[["spotify","vlc"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"MPRISData"},"MopidySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MopidyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["mopidy"]}},"required":["data","type"],"title":"MopidySourceAIOConfig"},"MopidyData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"ws://localhost:6680/mopidy/ws/"},"uriBlacklist":{"type":"array","items":{"type":"string"},"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."},"uriWhitelist":{"type":"array","items":{"type":"string"},"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."},"albumBlacklist":{"type":"array","items":{"type":"string"},"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"]],"default":["Soundcloud"]}},"title":"MopidyData"},"ListenBrainzSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenBrainzSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `listenbrainz.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["listenbrainz"]}},"required":["data","type"],"title":"ListenBrainzSourceAIOConfig"},"ListenBrainzSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzSourceData"},"JRiverSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JRiverData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["jriver"]}},"required":["data","type"],"title":"JRiverSourceAIOConfig"},"JRiverData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"http://localhost:52199/MCWS/v1/"},"username":{"type":"string","description":"If you have enabled authentication, the username you set"},"password":{"type":"string","description":"If you have enabled authentication, the password you set"}},"required":["url"],"title":"JRiverData"},"KodiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KodiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["kodi"]}},"required":["data","type"],"title":"KodiSourceAIOConfig"},"KodiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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"],"default":"http://localhost:8080/jsonrpc"},"username":{"type":"string","description":"The username set for Remote Control via Web Sever"},"password":{"type":"string","description":"The password set for Remote Control via Web Sever"}},"required":["url","username","password"],"title":"KodiData"},"WebScrobblerSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/WebScrobblerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["webscrobbler"]}},"required":["type"],"title":"WebScrobblerSourceAIOConfig"},"WebScrobblerData":{"type":"object","properties":{"slug":{"type":["string","null"],"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"},"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Block scrobbling from specific WebScrobbler Connectors","examples":[["youtube"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only allow scrobbling from specific WebScrobbler Connectors","examples":[["mixcloud","soundcloud","bandcamp"]]}},"title":"WebScrobblerData"},"ChromecastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ChromecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["chromecast"]}},"required":["data","type"],"title":"ChromecastSourceAIOConfig"},"ChromecastData":{"type":"object","properties":{"blacklistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"whitelistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"blacklistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any application that START WITH these values, case-insensitive","examples":[["spotify","pandora"]]},"whitelistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"useAvahi":{"type":"boolean","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.","default":false},"useAutoDiscovery":{"type":"boolean","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"},"devices":{"type":"array","items":{"$ref":"#/definitions/ChromecastDeviceInfo"},"description":"A list of Google Cast devices to monitor\n\nIf this is used then `useAutoDiscovery` is set to FALSE, if not explicitly set"},"allowUnknownMedia":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"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","default":false},"forceMediaRecognitionOn":{"type":"array","items":{"type":"string"},"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"}},"title":"ChromecastData"},"ChromecastDeviceInfo":{"type":"object","properties":{"name":{"type":"string","description":"A friendly name to identify this device","examples":["MySmartTV"]},"address":{"type":"string","description":"The IP address of the device","examples":["192.168.0.115"]}},"required":["name","address"],"title":"ChromecastDeviceInfo"},"MalojaSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MalojaSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `maloja.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["maloja"]}},"required":["data","type"],"title":"MalojaSourceAIOConfig"},"MalojaSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaSourceData"},"MusikcubeSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusikcubeData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["musikcube"]}},"required":["data","type"],"title":"MusikcubeSourceAIOConfig"},"MusikcubeData":{"type":"object","properties":{"url":{"type":"string","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"],"default":"ws://localhost:7905"},"password":{"type":"string","description":"Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation\n\n* musikcube -> settings -> server setup -> password"},"device_id":{"type":"string"}},"required":["password"],"title":"MusikcubeData"},"MusicCastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusicCastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["musiccast"]}},"required":["data","type"],"title":"MusicCastSourceAIOConfig"},"MusicCastData":{"type":"object","properties":{"url":{"type":"string","description":"The host or URL of the YamahaExtendedControl endpoint to use","examples":[["192.168.0.101","http://192.168.0.101/YamahaExtendedControl"]]}},"required":["url"],"title":"MusicCastData"},"MPDSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPDData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/MPDSourceOptions"},"type":{"type":"string","enum":["mpd"]}},"required":["data","options","type"],"title":"MPDSourceAIOConfig"},"MPDData":{"type":"object","properties":{"url":{"type":"string","description":"URL:PORT of the MPD server to connect to\n\nTo use this you must have TCP connections enabled for your MPD server https://mpd.readthedocs.io/en/stable/user.html#client-connections","examples":["localhost:6600"],"default":"localhost:6600"},"path":{"type":"string","description":"If using socket specify the path instead of url.\n\ntrailing `~` is replaced by your home directory"},"password":{"type":"string","description":"Password for the server, if set https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords"}},"title":"MPDData"},"MPDSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"MPDSourceOptions"},"VLCSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/VLCData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/VLCSourceOptions"},"type":{"type":"string","enum":["vlc"]}},"required":["data","type"],"title":"VLCSourceAIOConfig"},"VLCData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL:PORT of the VLC server to connect to\n\nTo use this you must have the Web (http) interface module enabled and a password set https://foxxmd.github.io/multi-scrobbler/docs/configuration#vlc","examples":["localhost:8080"],"default":"localhost:8080"},"password":{"type":"string","description":"Password for the server"}},"required":["password"],"title":"VLCData"},"VLCSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"filenamePatterns":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"A list of regular expressions to use to extract metadata (title, album, artist) from a filename\n\nUsed when VLC reports only the filename for the current audio track"},"logFilenamePatterns":{"type":"boolean","description":"Log to DEBUG when a filename-only track is matched or not matched by filenamePatterns","default":false},"dumpVlcMetadata":{"type":"boolean","description":"Dump all the metadata VLC reports for an audio track to DEBUG.\n\nUse this if reporting an issue with VLC not correctly capturing metadata for a track.","default":false}},"title":"VLCSourceOptions"},"IcecastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/IcecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/IcecastSourceOptions"},"type":{"type":"string","enum":["icecast"]}},"required":["data","type"],"title":"IcecastSourceAIOConfig"},"IcecastData":{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/definitions/IcecastSource"}},"icestatsEndpoint":{"type":"string"},"statsEndpoint":{"type":"string"},"nextsongsEndpoint":{"type":"string"},"sevenhtmlEndpoint":{"type":"string"},"icyMetaInt":{"type":"number"},"url":{"type":"string","description":"The Icecast stream URL"}},"required":["url"],"title":"IcecastData"},"IcecastSource":{"type":"string","enum":["icy","ogg","icestats","stats","sevenhtml","nextsongs"],"title":"IcecastSource"},"IcecastSourceOptions":{"type":"object","properties":{"systemScrobble":{"type":"boolean","description":"For Sources that support manual listening, should MS default to scrobbling when no user interaction has occurred?\n\nIf not specified MS will use a Source's specific behavior, see Source's documentation."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"IcecastSourceOptions"},"AzuracastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/AzuracastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["azuracast"]}},"required":["data","type"],"title":"AzuracastSourceAIOConfig"},"AzuracastData":{"type":"object","properties":{"url":{"type":"string","description":"Base URL of the Azuracast instance\n\nThis does NOT include the station. If a station is included it will be ignored. Use `station` field to specify station, if necessary","examples":["https://radio.mydomain.tld","http://localhost:80"]},"station":{"type":"string","description":"The specific station to monitor\n\nScrobbling will only occur if any of the monitor conditions are met AND the station is ONLINE.\n\nTo monitor multiple stations create a Source for each station.","examples":["my-station-1"]},"monitorWhenListeners":{"type":["boolean","number"],"description":"Only activate scrobble monitoring if station\n\n* `true` => has any current listeners\n* `number` => has EQUAL TO or MORE THAN X number of listeners"},"monitorWhenLive":{"type":"boolean","description":"Only activate scrobble monitoring if station has a live DJ/Streamer","default":true},"apiKey":{"type":"string","description":"API Key used to access data about private streams\n\nhttps://www.azuracast.com/docs/developers/apis/#api-authentication"}},"required":["url","station"],"title":"AzuracastData"},"KoitoSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KoitoSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `koito.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["koito"]}},"required":["data","type"],"title":"KoitoSourceAIOConfig"},"KoitoSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoSourceData"},"TealSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/TealSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/TealSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"Should always be `souce` when using Tealfm as a Source","default":"source","examples":["source"]},"type":{"type":"string","enum":["tealfm"]}},"required":["data","type"],"title":"TealSourceAIOConfig"},"TealSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\n\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\n\n* For **App Password** Auth - your email\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\n\nThis is created under https://bsky.app/settings/app-passwords\n\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"},"serviceAllow":{"type":"array","items":{"type":"string"}},"serviceDeny":{"type":"array","items":{"type":"string"}}},"required":["identifier"],"title":"TealSourceData"},"TealSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealSourceOptions"},"RockskySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/RockskySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/RockskySourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `rocksky.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["rocksky"]}},"required":["data","type"],"title":"RockskySourceAIOConfig"},"RockskySourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\n\n* alice.bsky.social\n* foxxmd.com\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockskySourceData"},"RockskySourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockskySourceOptions"},"ClientAIOConfig":{"anyOf":[{"$ref":"#/definitions/MalojaClientAIOConfig"},{"$ref":"#/definitions/LastfmClientAIOConfig"},{"$ref":"#/definitions/LibrefmClientAIOConfig"},{"$ref":"#/definitions/ListenBrainzClientAIOConfig"},{"$ref":"#/definitions/KoitoClientAIOConfig"},{"$ref":"#/definitions/TealClientAIOConfig"},{"$ref":"#/definitions/RockSkyClientAIOConfig"}],"title":"ClientAIOConfig"},"MalojaClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/MalojaClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Maloja as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["maloja"]}},"required":["data","name","type"],"title":"MalojaClientAIOConfig"},"MalojaClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaClientData"},"CommonClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonClientOptions"},"LastfmClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LastfmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LastfmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using LastFM as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["lastfm"]}},"required":["data","name","type"],"title":"LastfmClientAIOConfig"},"LastfmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm/Libre.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm/Libre.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]}},"required":["apiKey","secret"],"title":"LastfmData"},"LastfmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LastfmClientOptions"},"LibrefmClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LibrefmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LibrefmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Librefm as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["librefm"]}},"required":["data","name","type"],"title":"LibrefmClientAIOConfig"},"LibrefmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LibrefmClientOptions"},"ListenBrainzClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/ListenBrainzClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Listenbrainz as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["listenbrainz"]}},"required":["data","name","type"],"title":"ListenBrainzClientAIOConfig"},"ListenBrainzClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzClientData"},"KoitoClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/KoitoClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Koito as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["koito"]}},"required":["data","name","type"],"title":"KoitoClientAIOConfig"},"KoitoClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoClientData"},"TealClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/TealClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/TealClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Tealfm as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["tealfm"]}},"required":["data","name","type"],"title":"TealClientAIOConfig"},"TealClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\n\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\n\n* For **App Password** Auth - your email\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\n\nThis is created under https://bsky.app/settings/app-passwords\n\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"}},"required":["identifier"],"title":"TealClientData"},"TealClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealClientOptions"},"RockSkyClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/RockSkyClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/RockSkyClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using RockSky as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["rocksky"]}},"required":["data","name","type"],"title":"RockSkyClientAIOConfig"},"RockSkyClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\n\n* alice.bsky.social\n* foxxmd.com\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockSkyClientData"},"RockSkyClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockSkyClientOptions"},"WebhookConfig":{"anyOf":[{"$ref":"#/definitions/GotifyConfig"},{"$ref":"#/definitions/NtfyConfig"},{"$ref":"#/definitions/AppriseConfig"}],"title":"WebhookConfig"},"GotifyConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\n\n* gotify\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"url":{"type":"string","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"]},"token":{"type":"string","description":"The token created for this Application in Gotify","examples":["AQZI58fA.rfSZbm"]},"priorities":{"$ref":"#/definitions/PrioritiesConfig","description":"Priority of messages\n\n* Info -> 5\n* Warn -> 7\n* Error -> 10"}},"required":["token","type","url"],"title":"GotifyConfig"},"PrioritiesConfig":{"type":"object","properties":{"info":{"type":"number","examples":[5]},"warn":{"type":"number","examples":[7]},"error":{"type":"number","examples":[10]}},"required":["info","warn","error"],"title":"PrioritiesConfig"},"NtfyConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\n\n* gotify\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"url":{"type":"string","description":"The URL of the Ntfy server","examples":["http://192.168.0.100:8078"]},"topic":{"type":"string","description":"The topic mutli-scrobbler should POST to"},"username":{"type":"string","description":"Required if topic is protected"},"password":{"type":"string","description":"Required if topic is protected"},"token":{"type":"string","description":"Use instead of username/password, required if topic is protected"},"priorities":{"$ref":"#/definitions/PrioritiesConfig","description":"Priority of messages\n\n* Info -> 3\n* Warn -> 4\n* Error -> 5"}},"required":["topic","type","url"],"title":"NtfyConfig"},"AppriseConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\n\n* gotify\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"host":{"type":"string","description":"The URL of the apprise-api server","examples":["http://192.168.0.100:8078"]},"urls":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"},"keys":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"},"tags":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Optional [tag(s)](https://github.com/caronc/apprise-api?tab=readme-ov-file#tagging) to send in the notification payload"}},"required":["host","type"],"title":"AppriseConfig"},"LogOptions":{"type":"object","properties":{"level":{"$ref":"#/definitions/LogLevel","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.","default":"info"},"file":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false},{"$ref":"#/definitions/FileLogOptions"}],"description":"Specify the minimum log level to output to rotating files or file output options. If `false` no log files will be created."},"console":{"$ref":"#/definitions/LogLevel","description":"Specify the minimum log level streamed to the console (or docker container)"}},"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```","title":"LogOptions"},"CacheConfigOptions":{"type":"object","properties":{"metadata":{"$ref":"#/definitions/CacheMetadataConfig"},"scrobble":{"$ref":"#/definitions/CacheScrobbleConfig"},"auth":{"$ref":"#/definitions/CacheAuthConfig"},"regex":{"type":"number","description":"Number of regex functions to cache (LRU)","default":200}},"title":"CacheConfigOptions"},"CacheMetadataConfig":{"$ref":"#/definitions/CacheConfig%3CCacheMetadataProvider%3E","title":"CacheMetadataConfig"},"CacheConfig<CacheMetadataProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheMetadataProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheMetadataProvider>"},"CacheMetadataProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheMetadataProvider"},"CacheProvider":{"type":["string","boolean"],"enum":["memory","valkey","file",false],"title":"CacheProvider"},"CacheScrobbleConfig":{"$ref":"#/definitions/CacheConfig%3CCacheScrobbleProvider%3E","title":"CacheScrobbleConfig"},"CacheConfig<CacheScrobbleProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheScrobbleProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheScrobbleProvider>"},"CacheScrobbleProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheScrobbleProvider"},"CacheAuthConfig":{"$ref":"#/definitions/CacheConfig%3CCacheAuthProvider%3E","title":"CacheAuthConfig"},"CacheConfig<CacheAuthProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheAuthProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheAuthProvider>"},"CacheAuthProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheAuthProvider"},"TransformerCommonConfig":{"type":"object","properties":{"defaults":{"type":"object"},"data":{"type":"object"},"type":{"type":"string"},"name":{"type":"string"},"options":{"$ref":"#/definitions/TransformOptions"}},"required":["type"],"title":"TransformerCommonConfig"},"TransformOptions":{"type":"object","properties":{"failOnFetch":{"type":"boolean"},"throwOnFailure":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string","enum":["artists","title","albumArtists","album","duration","meta"]}}]},"ttl":{"type":"string"}},"title":"TransformOptions"}}}
-1
assets/css/styles.5e084d52.css
··· 1 - :root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-500:var(--ifm-color-gray-500);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:.2s;--ifm-transition-slow:.4s;--ifm-transition-timing-default:cubic-bezier(.08,.52,.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:.1rem;--ifm-code-padding-vertical:.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:.875rem;--ifm-h6-font-size:.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:.8rem;--ifm-breadcrumb-padding-vertical:.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 256 256\"><g><g><polygon points=\"79.093,0 48.907,30.187 146.72,128 48.907,225.813 79.093,256 207.093,128\"/></g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></svg>");--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-color:var(--ifm-font-color-base-inverse);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:.5rem;--ifm-toc-padding-horizontal:.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:.75rem;--ifm-menu-link-padding-vertical:.375rem;--ifm-menu-link-sublist-icon:url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16px\" height=\"16px\" viewBox=\"0 0 24 24\"><path fill=\"rgba(0,0,0,0.5)\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z\"></path></svg>");--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:.75rem;--ifm-navbar-item-padding-vertical:.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-hover-color:var(--ifm-color-primary);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url("data:image/svg+xml;utf8,<svg fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" height=\"16px\" width=\"16px\"><path d=\"M6.02945,10.20327a4.17382,4.17382,0,1,1,4.17382-4.17382A4.15609,4.15609,0,0,1,6.02945,10.20327Zm9.69195,4.2199L10.8989,9.59979A5.88021,5.88021,0,0,0,12.058,6.02856,6.00467,6.00467,0,1,0,9.59979,10.8989l4.82338,4.82338a.89729.89729,0,0,0,1.29912,0,.89749.89749,0,0,0-.00087-1.29909Z\" /></svg>");--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base)var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{word-wrap:break-word;margin:0}iframe{color-scheme:normal;border:0}.container{max-width:var(--ifm-container-width);padding:0 var(--ifm-spacing-horizontal);width:100%;margin:0 auto}.container--fluid{max-width:inherit}.row{margin:0 calc(var(--ifm-spacing-horizontal)*-1);flex-wrap:wrap;display:flex}.row--no-gutters{margin-left:0;margin-right:0}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;max-width:var(--ifm-col-width);padding:0 var(--ifm-spacing-horizontal);flex:1 0;width:100%;margin-left:0}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:calc(1/12*100%)}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:calc(2/12*100%)}.col--offset-2{margin-left:16.6667%}.col--3{--ifm-col-width:calc(3/12*100%)}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:calc(4/12*100%)}.col--offset-4{margin-left:33.3333%}.col--5{--ifm-col-width:calc(5/12*100%)}.col--offset-5{margin-left:41.6667%}.col--6{--ifm-col-width:calc(6/12*100%)}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:calc(7/12*100%)}.col--offset-7{margin-left:58.3333%}.col--8{--ifm-col-width:calc(8/12*100%)}.col--offset-8{margin-left:66.6667%}.col--9{--ifm-col-width:calc(9/12*100%)}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:calc(10/12*100%)}.col--offset-10{margin-left:83.3333%}.col--11{--ifm-col-width:calc(11/12*100%)}.col--offset-11{margin-left:91.6667%}.col--12{--ifm-col-width:calc(12/12*100%)}.col--offset-12{margin-left:100%}.margin--none{margin:0!important}.margin-top--none{margin-top:0!important}.margin-left--none{margin-left:0!important}.margin-bottom--none{margin-bottom:0!important}.margin-right--none{margin-right:0!important}.margin-vert--none{margin-top:0!important;margin-bottom:0!important}.margin-horiz--none{margin-left:0!important;margin-right:0!important}.margin--xs{margin:.25rem!important}.margin-top--xs{margin-top:.25rem!important}.margin-left--xs{margin-left:.25rem!important}.margin-bottom--xs{margin-bottom:.25rem!important}.margin-right--xs{margin-right:.25rem!important}.margin-vert--xs{margin-top:.25rem!important;margin-bottom:.25rem!important}.margin-horiz--xs{margin-left:.25rem!important;margin-right:.25rem!important}.margin--sm{margin:.5rem!important}.margin-top--sm{margin-top:.5rem!important}.margin-left--sm{margin-left:.5rem!important}.margin-bottom--sm{margin-bottom:.5rem!important}.margin-right--sm{margin-right:.5rem!important}.margin-vert--sm{margin-top:.5rem!important;margin-bottom:.5rem!important}.margin-horiz--sm{margin-left:.5rem!important;margin-right:.5rem!important}.margin--md{margin:1rem!important}.margin-top--md{margin-top:1rem!important}.margin-left--md{margin-left:1rem!important}.margin-bottom--md{margin-bottom:1rem!important}.margin-right--md{margin-right:1rem!important}.margin-vert--md{margin-top:1rem!important;margin-bottom:1rem!important}.margin-horiz--md{margin-left:1rem!important;margin-right:1rem!important}.margin--lg{margin:2rem!important}.margin-top--lg{margin-top:2rem!important}.margin-left--lg{margin-left:2rem!important}.margin-bottom--lg{margin-bottom:2rem!important}.margin-right--lg{margin-right:2rem!important}.margin-vert--lg{margin-top:2rem!important;margin-bottom:2rem!important}.margin-horiz--lg{margin-left:2rem!important;margin-right:2rem!important}.margin--xl{margin:5rem!important}.margin-top--xl{margin-top:5rem!important}.margin-left--xl{margin-left:5rem!important}.margin-bottom--xl{margin-bottom:5rem!important}.margin-right--xl{margin-right:5rem!important}.margin-vert--xl{margin-top:5rem!important;margin-bottom:5rem!important}.margin-horiz--xl{margin-left:5rem!important;margin-right:5rem!important}.padding--none{padding:0!important}.padding-top--none{padding-top:0!important}.padding-left--none{padding-left:0!important}.padding-bottom--none{padding-bottom:0!important}.padding-right--none{padding-right:0!important}.padding-vert--none{padding-top:0!important;padding-bottom:0!important}.padding-horiz--none{padding-left:0!important;padding-right:0!important}.padding--xs{padding:.25rem!important}.padding-top--xs{padding-top:.25rem!important}.padding-left--xs{padding-left:.25rem!important}.padding-bottom--xs{padding-bottom:.25rem!important}.padding-right--xs{padding-right:.25rem!important}.padding-vert--xs{padding-top:.25rem!important;padding-bottom:.25rem!important}.padding-horiz--xs{padding-left:.25rem!important;padding-right:.25rem!important}.padding--sm{padding:.5rem!important}.padding-top--sm{padding-top:.5rem!important}.padding-left--sm{padding-left:.5rem!important}.padding-bottom--sm{padding-bottom:.5rem!important}.padding-right--sm{padding-right:.5rem!important}.padding-vert--sm{padding-top:.5rem!important;padding-bottom:.5rem!important}.padding-horiz--sm{padding-left:.5rem!important;padding-right:.5rem!important}.padding--md{padding:1rem!important}.padding-top--md{padding-top:1rem!important}.padding-left--md{padding-left:1rem!important}.padding-bottom--md{padding-bottom:1rem!important}.padding-right--md{padding-right:1rem!important}.padding-vert--md{padding-top:1rem!important;padding-bottom:1rem!important}.padding-horiz--md{padding-left:1rem!important;padding-right:1rem!important}.padding--lg{padding:2rem!important}.padding-top--lg{padding-top:2rem!important}.padding-left--lg{padding-left:2rem!important}.padding-bottom--lg{padding-bottom:2rem!important}.padding-right--lg{padding-right:2rem!important}.padding-vert--lg{padding-top:2rem!important;padding-bottom:2rem!important}.padding-horiz--lg{padding-left:2rem!important;padding-right:2rem!important}.padding--xl{padding:5rem!important}.padding-top--xl{padding-top:5rem!important}.padding-left--xl{padding-left:5rem!important}.padding-bottom--xl{padding-bottom:5rem!important}.padding-right--xl{padding-right:5rem!important}.padding-vert--xl{padding-top:5rem!important;padding-bottom:5rem!important}.padding-horiz--xl{padding-left:5rem!important;padding-right:5rem!important}code{background-color:var(--ifm-code-background);border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical)var(--ifm-code-padding-horizontal);vertical-align:middle;border:.1rem solid #0000001a}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height)var(--ifm-font-family-monospace);margin:0 0 var(--ifm-spacing-vertical);padding:var(--ifm-pre-padding);overflow:auto}pre code{font-size:100%;line-height:inherit;background-color:#0000;border:none;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);border-radius:.2rem;padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top)0 var(--ifm-heading-margin-bottom)0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:before{content:"";display:table}.markdown:after{clear:both;content:"";display:table}.markdown>:last-child{margin-bottom:0!important}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading));margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading));margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading));margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>pre,.markdown>ul,.markdown>p{margin-bottom:var(--ifm-leading)}.markdown li{word-wrap:break-word}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ul,ol{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ul ul,ul ol,ol ol,ol ul{margin:0}ul ul ol,ul ol ol,ol ul ol,ol ol ol{list-style-type:lower-alpha}table{border-collapse:collapse;margin-bottom:var(--ifm-spacing-vertical);display:block;overflow:auto}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead{background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width)solid var(--ifm-table-border-color)}table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table th,table td{border:var(--ifm-table-border-width)solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);-webkit-text-decoration:var(--ifm-link-decoration);text-decoration:var(--ifm-link-decoration);transition:color var(--ifm-transition-fast)var(--ifm-transition-timing-default)}a:hover{color:var(--ifm-link-hover-color);-webkit-text-decoration:var(--ifm-link-hover-decoration);text-decoration:var(--ifm-link-hover-decoration)}a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width)solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);margin:0 0 var(--ifm-spacing-vertical);padding:var(--ifm-blockquote-padding-vertical)var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical)0;border:0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.text--break{word-wrap:break-word!important;word-break:break-word!important}.text--no-decoration,.text--no-decoration:hover{-webkit-text-decoration:none;text-decoration:none}.clean-btn{color:inherit;cursor:pointer;background:0 0;border:none;padding:0;font-family:inherit}.clean-list{padding-left:0;list-style:none}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width)solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);color:var(--ifm-alert-foreground-color);padding:var(--ifm-alert-padding-vertical)var(--ifm-alert-padding-horizontal)}.alert__heading{font:bold var(--ifm-h5-font-size)/var(--ifm-heading-line-height)var(--ifm-heading-font-family);text-transform:uppercase;align-items:center;margin-bottom:.5rem;display:flex}.alert__icon{margin-right:.4em;display:inline-flex}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{color:var(--ifm-alert-foreground-color);margin:calc(var(--ifm-alert-padding-vertical)*-1)calc(var(--ifm-alert-padding-horizontal)*-1)0 0;opacity:.75}.alert .close:hover,.alert .close:focus{opacity:1}.alert a{-webkit-text-decoration-color:var(--ifm-alert-border-color);text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{height:var(--ifm-avatar-photo-size);width:var(--ifm-avatar-photo-size);border-radius:50%;display:block;overflow:hidden}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{text-align:var(--ifm-avatar-intro-alignment);flex-direction:column;flex:1;justify-content:center;display:flex}.avatar__name{font:bold var(--ifm-h4-font-size)/var(--ifm-heading-line-height)var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:.5rem;flex-direction:column;align-items:center}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width)solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);padding:var(--ifm-badge-padding-vertical)var(--ifm-badge-padding-horizontal);line-height:1;display:inline-block}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);--ifm-badge-border-color:var(--ifm-badge-background-color);color:var(--ifm-color-black)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger);--ifm-badge-border-color:var(--ifm-badge-background-color)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item{display:inline-block}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator)center;content:" ";filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));display:inline-block}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);color:var(--ifm-font-color-base);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier))calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-property:background,color;transition-duration:var(--ifm-transition-fast);transition-timing-function:var(--ifm-transition-timing-default);display:inline-block}.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover,.breadcrumbs__link:any-link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width)solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);color:var(--ifm-button-color);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier))calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap;transition-property:color,background,border-color;transition-duration:var(--ifm-button-transition-duration);transition-timing-function:var(--ifm-transition-timing-default);line-height:1.5;display:inline-block}.button:hover{color:var(--ifm-button-color);-webkit-text-decoration:none;text-decoration:none}.button--outline{--ifm-button-background-color:transparent;--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--outline:hover,.button--outline:active,.button--outline.button--active{--ifm-button-color:var(--ifm-font-color-base-inverse)}.button--link{--ifm-button-background-color:transparent;--ifm-button-border-color:transparent;color:var(--ifm-link-color);-webkit-text-decoration:var(--ifm-link-decoration);text-decoration:var(--ifm-link-decoration)}.button--link:hover,.button--link:active,.button--link.button--active{color:var(--ifm-link-hover-color);-webkit-text-decoration:var(--ifm-link-hover-decoration);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{width:100%;display:block}.button.button--secondary{color:var(--ifm-color-gray-900)}.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary:active,.button--primary.button--active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary:active,.button--secondary.button--active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success:active,.button--success.button--active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info:active,.button--info.button--active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning:active,.button--warning.button--active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger:active,.button--danger.button--active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{gap:var(--ifm-button-group-spacing);display:inline-flex}.button-group>.button:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.button-group>.button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.button-group--block{justify-content:stretch;display:flex}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);flex-direction:column;display:flex;overflow:hidden}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__header,.card__body,.card__footer{padding:var(--ifm-card-vertical-spacing)var(--ifm-card-horizontal-spacing)}.card__header:not(:last-child),.card__body:not(:last-child),.card__footer:not(:last-child){padding-bottom:0}.card__header>:last-child,.card__body>:last-child,.card__footer>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{padding:var(--ifm-toc-padding-vertical)0;margin-bottom:0;font-size:.8rem}.table-of-contents,.table-of-contents ul{padding-left:var(--ifm-toc-padding-horizontal);list-style:none}.table-of-contents li{margin:var(--ifm-toc-padding-vertical)var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link:hover,.table-of-contents__link:hover code,.table-of-contents__link--active,.table-of-contents__link--active code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);opacity:.5;transition:opacity var(--ifm-transition-fast)var(--ifm-transition-timing-default);padding:1rem;line-height:1}.close:hover{opacity:.7}.close:focus{opacity:.8}.dropdown{font-weight:var(--ifm-dropdown-font-weight);vertical-align:top;display:inline-flex;position:relative}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;visibility:visible;transform:translateY(-1px)}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);opacity:0;pointer-events:none;min-width:10rem;max-height:80vh;left:0;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);visibility:hidden;z-index:var(--ifm-z-index-dropdown);transition-property:opacity,transform,visibility;transition-duration:var(--ifm-transition-fast);transition-timing-function:var(--ifm-transition-timing-default);padding:.5rem;list-style:none;position:absolute;overflow-y:auto;transform:translateY(-.625rem)}.dropdown__link{color:var(--ifm-dropdown-link-color);white-space:nowrap;border-radius:.25rem;margin-top:.2rem;padding:.25rem .5rem;font-size:.875rem;display:block}.dropdown__link:hover,.dropdown__link--active{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);-webkit-text-decoration:none;text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{content:"";border:.4em solid #0000;border-top-color:currentColor;border-bottom:0 solid;margin-left:.3em;display:inline-block;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical)var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{max-width:var(--ifm-footer-logo-max-width);margin-top:1rem}.footer__title{color:var(--ifm-footer-title-color);font:bold var(--ifm-h4-font-size)/var(--ifm-heading-line-height)var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.footer__item{margin-top:0}.footer__items{margin-bottom:0}[type=checkbox]{padding:0}.hero{background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);align-items:center;padding:4rem 2rem;display:flex}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu{font-weight:var(--ifm-font-weight-semibold);overflow-x:hidden}.menu__list{margin:0;padding-left:0;list-style:none}.menu__list .menu__list{padding-left:var(--ifm-menu-link-padding-horizontal);flex:0 0 100%;margin-top:.25rem}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.menu__list-item--collapsed .menu__link--sublist:after,.menu__list-item--collapsed .menu__caret:before{transform:rotate(90deg)}.menu__list-item-collapsible{transition:background var(--ifm-transition-fast)var(--ifm-transition-timing-default);border-radius:.25rem;flex-wrap:wrap;display:flex;position:relative}.menu__list-item-collapsible:hover,.menu__list-item-collapsible--active{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link:hover,.menu__list-item-collapsible .menu__link--active{background:0 0!important}.menu__link,.menu__caret{transition:background var(--ifm-transition-fast)var(--ifm-transition-timing-default);border-radius:.25rem;align-items:center;display:flex}.menu__link:hover,.menu__caret:hover{background:var(--ifm-menu-color-background-hover)}.menu__link{color:var(--ifm-menu-color);padding:var(--ifm-menu-link-padding-vertical)var(--ifm-menu-link-padding-horizontal);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);transition:color var(--ifm-transition-fast)var(--ifm-transition-timing-default);-webkit-text-decoration:none;text-decoration:none}.menu__link--sublist-caret:after{content:"";background:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem;min-width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);width:1.25rem;height:1.25rem;transition:transform var(--ifm-transition-fast)linear;margin-left:auto;transform:rotate(180deg)}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret{padding:var(--ifm-menu-link-padding-vertical)var(--ifm-menu-link-padding-horizontal)}.menu__caret:before{content:"";background:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem;filter:var(--ifm-menu-link-sublist-icon-filter);width:1.25rem;height:1.25rem;transition:transform var(--ifm-transition-fast)linear;transform:rotate(180deg)}html[data-theme=dark],.navbar--dark{--ifm-menu-link-sublist-icon-filter:invert(100%)sepia(94%)saturate(17%)hue-rotate(223deg)brightness(104%)contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical)var(--ifm-navbar-padding-horizontal);display:flex}.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{z-index:var(--ifm-z-index-fixed);position:sticky;top:0}.navbar__inner{flex-wrap:wrap;justify-content:space-between;width:100%;display:flex}.navbar__brand{color:var(--ifm-navbar-link-color);align-items:center;min-width:0;margin-right:1rem;display:flex}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);-webkit-text-decoration:none;text-decoration:none}.navbar__title{flex:auto}.navbar__toggle{margin-right:.5rem;display:none}.navbar__logo{flex:none;height:2rem;margin-right:.5rem}.navbar__logo img{height:100%}.navbar__items{flex:1;align-items:center;min-width:0;display:flex}.navbar__items--center{flex:none}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:none;justify-content:flex-end}.navbar__item{padding:var(--ifm-navbar-item-padding-vertical)var(--ifm-navbar-item-padding-horizontal);display:inline-block}.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link{color:var(--ifm-navbar-link-color);font-weight:var(--ifm-font-weight-semibold)}.navbar__link:hover,.navbar__link--active{color:var(--ifm-navbar-link-hover-color);-webkit-text-decoration:none;text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-navbar-link-hover-color:var(--ifm-color-primary);--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color)var(--ifm-navbar-search-input-icon)no-repeat .75rem center/1rem 1rem;color:var(--ifm-navbar-search-input-color);cursor:text;border:none;border-radius:2rem;width:12.5rem;height:2rem;padding:0 .5rem 0 2.25rem;font-size:1rem;display:inline-block}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);opacity:0;visibility:hidden;width:var(--ifm-navbar-sidebar-width);transition-property:opacity,visibility,transform;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;transform:translate(-100%)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar--show .navbar-sidebar{transform:translate(0,0)}.navbar-sidebar__backdrop{opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:var(--ifm-transition-fast);background-color:#0009;transition-timing-function:ease-in-out;position:fixed;inset:0}.navbar-sidebar__brand{box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical)var(--ifm-navbar-padding-horizontal);flex:1;align-items:center;display:flex}.navbar-sidebar__items{height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast)ease-in-out;display:flex;transform:translateZ(0)}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{width:calc(var(--ifm-navbar-sidebar-width));flex-shrink:0;padding:.5rem}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);text-align:left;width:calc(100% + 1rem);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;top:-.5rem}.navbar-sidebar__close{margin-left:auto;display:flex}.pagination{column-gap:var(--ifm-pagination-page-spacing);font-size:var(--ifm-pagination-font-size);padding-left:0;display:flex}.pagination--sm{--ifm-pagination-font-size:.8rem;--ifm-pagination-padding-horizontal:.8rem;--ifm-pagination-padding-vertical:.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{background:var(--ifm-pagination-item-active-background);color:var(--ifm-pagination-color-active)}.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);padding:var(--ifm-pagination-padding-vertical)var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast)var(--ifm-transition-timing-default);display:inline-block}.pagination__link:hover{-webkit-text-decoration:none;text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr);display:grid}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast)var(--ifm-transition-timing-default);display:block}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);-webkit-text-decoration:none;text-decoration:none}.pagination-nav__link--next{text-align:right;grid-column:2/3}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills{gap:var(--ifm-pills-spacing);padding-left:0;display:flex}.pills__item{cursor:pointer;font-weight:var(--ifm-font-weight-bold);transition:background var(--ifm-transition-fast)var(--ifm-transition-timing-default);border-radius:.5rem;padding:.25rem 1rem;display:inline-block}.pills__item--active{background:var(--ifm-pills-color-background-active);color:var(--ifm-pills-color-active)}.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{text-align:center;flex-grow:1}.tabs{color:var(--ifm-tabs-color);font-weight:var(--ifm-font-weight-bold);margin-bottom:0;padding-left:0;display:flex;overflow-x:auto}.tabs__item{border-radius:var(--ifm-global-radius);cursor:pointer;padding:var(--ifm-tabs-padding-vertical)var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast)var(--ifm-transition-timing-default);border-bottom:3px solid #0000;display:inline-flex}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);color:var(--ifm-tabs-color-active);border-bottom-right-radius:0;border-bottom-left-radius:0}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-500:var(--ifm-color-gray-500);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%)sepia(11%)saturate(0%)hue-rotate(149deg)brightness(99%)contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}@media (width>=1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (width<=996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.footer__link-separator{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{width:max-content;display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__item{display:none}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}}@media (width<=576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0s;--ifm-transition-slow:0s}}@media print{.table-of-contents,.footer,.menu,.navbar,.pagination-nav{display:none}.tabs{page-break-inside:avoid}}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary)}#nprogress{pointer-events:none}#nprogress .bar{background:var(--docusaurus-progress-bar-color);z-index:1031;width:100%;height:2px;position:fixed;top:0;left:0}#nprogress .peg{width:100px;height:100%;box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);opacity:1;position:absolute;right:0;transform:rotate(3deg)translateY(-4px)}:root{--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}body:not(.navigation-with-keyboard) :not(input):focus{outline:none}#__docusaurus-base-url-issue-banner-container{display:none}.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1);padding:calc(var(--ifm-global-spacing)/2)var(--ifm-global-spacing);color:var(--ifm-color-emphasis-900);background-color:var(--ifm-background-surface-color);position:fixed;top:1rem;left:100%}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{padding:0;line-height:0}.content_knG7{text-align:center;padding:5px 0;font-size:85%}.content_knG7 a{color:inherit;-webkit-text-decoration:underline;text-decoration:underline}:root{--docusaurus-announcement-bar-height:auto}.announcementBar_mb4j{height:var(--docusaurus-announcement-bar-height);background-color:var(--ifm-color-white);color:var(--ifm-color-black);border-bottom:1px solid var(--ifm-color-emphasis-100);align-items:center;display:flex}html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{flex:0 0 30px;align-self:stretch}.announcementBarContent_xLdY{flex:auto}@media print{.announcementBar_mb4j{display:none}}@media (width>=997px){:root{--docusaurus-announcement-bar-height:30px}.announcementBarPlaceholder_vyr4,.announcementBarClose_gvF7{flex-basis:50px}}.toggle_vylO{width:2rem;height:2rem}.toggleButton_gllP{-webkit-tap-highlight-color:transparent;width:100%;height:100%;transition:background var(--ifm-transition-fast);border-radius:50%;justify-content:center;align-items:center;display:flex}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleIcon_g3eP{display:none}[data-theme-choice=system] .systemToggleIcon_QzmC,[data-theme-choice=light] .lightToggleIcon_pyhR,[data-theme-choice=dark] .darkToggleIcon_wfgR{display:initial}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}.themedComponent_mlkZ{display:none}[data-theme=light] .themedComponent--light_NVdE,[data-theme=dark] .themedComponent--dark_xIcU,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.dropdownNavbarItemMobile_J0Sd{cursor:pointer}.iconLanguage_nlXk{vertical-align:text-bottom;margin-right:5px}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);width:var(--search-local-modal-width,560px);padding:var(--search-local-spacing,12px);border-radius:6px;margin-top:8px;position:relative;left:auto!important;right:0!important}.searchInput_YFbd:focus{outline:2px solid var(--search-local-input-active-border-color,var(--ifm-color-primary));outline-offset:0px}@media (width>996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media (width<=576px){.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{width:var(--search-local-modal-width-sm,340px);max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2)}}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{cursor:pointer;background:var(--search-local-hit-background,#fff);box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);padding:0 var(--search-local-spacing,12px);width:100%;color:var(--search-local-hit-color,#444950);height:var(--search-local-hit-height,56px);border-radius:4px;flex-direction:row;align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTree_kk6K,.hitIcon_a7Zy,.hitPath_ieM4,.noResultsIcon_EBY5,.hitFooter_E9YW a{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K{align-items:center;display:flex}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;stroke-width:var(--search-local-icon-stroke-width,1.4);width:24px}.hitIcon_a7Zy{stroke-width:var(--search-local-icon-stroke-width,1.4);width:20px;height:20px}.hitWrapper_sAK8{flex-direction:column;flex:auto;justify-content:center;width:80%;margin:0 8px;font-weight:500;display:flex;overflow-x:hidden}.hitWrapper_sAK8 mark{color:var(--search-local-highlight-color,var(--ifm-color-primary));background:0 0}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden}.hitAction_NqkB{width:20px;height:20px}.hideAction_vcyE>svg{display:none}.noResults_l6Q3{padding:var(--search-local-spacing,12px)0;flex-direction:column;justify-content:center;align-items:center;display:flex}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{text-align:center;margin-top:var(--search-local-spacing,12px);font-size:.85em}.hitFooter_E9YW a{-webkit-text-decoration:underline;text-decoration:underline}.cursor_eG29 .hideAction_vcyE>svg{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 mark,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.suggestion_fB_2.cursor_eG29 mark{-webkit-text-decoration:underline;text-decoration:underline}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;position:absolute;top:6px;left:10px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:0 0;border:none;padding:0;line-height:1rem;position:absolute;top:50%;right:.8rem;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.searchHintContainer_Pkmr{pointer-events:none;justify-content:center;align-items:center;gap:4px;height:100%;display:flex;position:absolute;top:0;right:10px}.searchHint_iIMx{color:var(--ifm-navbar-search-input-placeholder-color);background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500)}@media (width<=576px){.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}}html[dir=rtl] .searchHintContainer_Pkmr{left:10px;right:auto}html[dir=rtl] .searchBarContainer_NW3z .searchClearButton_qk4g{left:.8rem;right:auto}html[dir=rtl] .searchBarContainer_NW3z .searchBarLoadingRing_YnHq{left:auto;right:10px}html[dir=rtl] .navbar__search-input{padding:0 2.25em 0 .5em}.loadingRing_RJI3{width:20px;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);display:inline-block;position:relative}.loadingRing_RJI3 div{box-sizing:border-box;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color))transparent transparent transparent;border-radius:50%;width:16px;height:16px;margin:2px;animation:1.2s cubic-bezier(.5,0,.5,1) infinite loading-ring_FB5o;display:block;position:absolute}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes loading-ring_FB5o{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.navbarSearchContainer_Bca1:empty{display:none}@media (width<=996px){.navbarSearchContainer_Bca1{right:var(--ifm-navbar-padding-horizontal);position:absolute}}@media (width>=997px){.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical)var(--ifm-navbar-item-padding-horizontal)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast)ease}.navbarHidden_jGov{transform:translateY(calc(-100% - 2px))}@media (width<=996px){.colorModeToggle_DEke{display:none}}.navbar__items--right>:last-child{padding-right:0}.errorBoundaryError_a6uf{white-space:pre-wrap;color:red}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast)var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover{opacity:1}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none;padding-left:.5rem}.hash-link:before{content:"#"}.hash-link:focus,:hover>.hash-link{opacity:1}html,body{height:100%}.mainWrapper_z2l0{flex-direction:column;flex:1 0 auto;display:flex}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{flex-direction:column;min-height:100%;display:flex}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);transition:all var(--ifm-transition-fast)ease;transition-property:border,box-shadow;box-shadow:0 1.5px 3px #00000026}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px #0003}.cardContainer_fWXF :last-child{margin-bottom:0}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.docCardListItem_W1sv{margin-bottom:2rem}.docCardListItem_W1sv>*{height:100%}:root{--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);-webkit-text-decoration:none;text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);padding:.2rem .5rem .3rem;font-size:90%}.tagWithCount_h2kH{border-left:0;align-items:center;padding:0 .5rem 0 1rem;display:flex;position:relative}.tagWithCount_h2kH:before,.tagWithCount_h2kH:after{content:"";border:1px solid var(--docusaurus-tag-list-border);transition:inherit;position:absolute;top:50%}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;width:1.18rem;height:1.18rem;right:100%;transform:translate(50%,-50%)rotate(-45deg)}.tagWithCount_h2kH:after{border-radius:50%;width:.5rem;height:.5rem;left:0;transform:translateY(-50%)}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);color:var(--ifm-color-black);border-radius:var(--ifm-global-radius);margin-left:.3rem;padding:.1rem .4rem;font-size:.7rem;line-height:1.2}.tags_jXut{display:inline}.tag_QGVx{margin:0 .4rem .5rem 0;display:inline-block}.iconEdit_Z9Sw{vertical-align:sub;margin-right:.3em}.lastUpdated_JAkA{margin-top:.2rem;font-size:smaller;font-style:italic}@media (width>=997px){.lastUpdated_JAkA{text-align:right}}.tocCollapsibleButton_TO0P{font-size:inherit;justify-content:space-between;align-items:center;width:100%;padding:.4rem .8rem;display:flex}.tocCollapsibleButton_TO0P:after{content:"";background:var(--ifm-menu-link-sublist-icon)50% 50%/2rem 2rem no-repeat;filter:var(--ifm-menu-link-sublist-icon-filter);width:1.25rem;height:1.25rem;transition:transform var(--ifm-transition-fast);transform:rotate(180deg)}.tocCollapsibleButtonExpanded_MG3E:after{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);padding:.2rem 0;font-size:15px}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tocCollapsibleExpanded_sAul{transform:none}@media (width>=997px){.tocMobile_ITEo{display:none}}@media print{.tocMobile_ITEo{display:none}}.tableOfContents_bqdL{max-height:calc(100vh - (var(--ifm-navbar-height) + 2rem));top:calc(var(--ifm-navbar-height) + 1rem);position:sticky;overflow-y:auto}@media (width<=996px){.tableOfContents_bqdL{display:none}.docItemContainer_F8PC{padding:0 .3rem}}.searchContextInput_mXoe,.searchQueryInput_CFBF{border-radius:var(--ifm-global-radius);border:var(--ifm-global-border-width)solid var(--ifm-color-content-secondary);font-size:var(--ifm-font-size-base);background:var(--ifm-background-color);width:100%;color:var(--ifm-font-color-base);margin-bottom:1rem;padding:.5rem}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItem_U687>h2{margin-bottom:0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);margin:.5rem 0 0;font-size:.8rem}.searchResultItemSummary_oZHr{margin:.5rem 0 0;font-style:italic}@media only screen and (width<=996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (width<=576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);width:3rem;height:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1);box-shadow:var(--ifm-global-shadow-lw);transition:all var(--ifm-transition-fast)var(--ifm-transition-timing-default);opacity:0;visibility:hidden;border-radius:50%;position:fixed;bottom:1.3rem;right:1.3rem;transform:scale(0)}.backToTopButton_sjWU:after{content:" ";-webkit-mask:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem no-repeat;-webkit-mask:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem no-repeat;background-color:var(--ifm-color-emphasis-1000);width:100%;height:100%;display:inline-block}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}.backToTopButtonShow_xfvO{opacity:1;visibility:visible;transform:scale(1)}:root{--docusaurus-collapse-button-bg:transparent;--docusaurus-collapse-button-bg-hover:#0000001a}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}@media (width>=997px){.collapseSidebarButton_PEFL{background-color:var(--docusaurus-collapse-button-bg);border:1px solid var(--ifm-toc-border-color);border-radius:0;height:40px;position:sticky;bottom:0;display:block!important}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:hover,.collapseSidebarButton_PEFL:focus{background-color:var(--docusaurus-collapse-button-bg-hover)}}.collapseSidebarButton_PEFL{margin:0;display:none}.menuExternalLink_NmtK{align-items:center}@media (width>=997px){.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical)var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{scrollbar-gutter:stable;padding:.5rem 0 .5rem .5rem}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width);flex-direction:column;display:flex}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{margin:0 var(--ifm-navbar-padding-horizontal);min-height:var(--ifm-navbar-height);max-height:var(--ifm-navbar-height);align-items:center;color:inherit!important;-webkit-text-decoration:none!important;text-decoration:none!important;display:flex!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}}.sidebarLogo_isFc{display:none}@media (width>=997px){.expandButton_TmdG{width:100%;height:100%;transition:background-color var(--ifm-transition-fast)ease;background-color:var(--docusaurus-collapse-button-bg);justify-content:center;align-items:center;display:flex;position:absolute;top:0;right:0}.expandButton_TmdG:hover,.expandButton_TmdG:focus{background-color:var(--docusaurus-collapse-button-bg-hover)}.expandButtonIcon_i1dp{transform:rotate(0)}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}}:root{--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.docSidebarContainer_YfHR{display:none}@media (width>=997px){.docSidebarContainer_YfHR{width:var(--doc-sidebar-width);margin-top:calc(-1*var(--ifm-navbar-height));border-right:1px solid var(--ifm-toc-border-color);will-change:width;transition:width var(--ifm-transition-fast)ease;clip-path:inset(0);display:block}.docSidebarContainerHidden_DPk8{width:var(--doc-sidebar-hidden-width);cursor:pointer}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}}.docMainContainer_TBSr{width:100%;display:flex}@media (width>=997px){.docMainContainer_TBSr{max-width:calc(100% - var(--doc-sidebar-width));flex-grow:1}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}.docRoot_UBD9{width:100%;display:flex}.docsWrapper_hBAB{flex:1 0 auto;display:flex}.details_lb9f{--docusaurus-details-summary-arrow-size:.38rem;--docusaurus-details-transition:transform .2s ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;list-style:none;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{content:"";border-width:var(--docusaurus-details-summary-arrow-size);border-style:solid;border-color:transparent transparent transparent var(--docusaurus-details-decoration-color);transition:var(--docusaurus-details-transition);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2)50%;position:absolute;top:.45rem;left:0;transform:rotate(0)}.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before{transform:rotate(90deg)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child{margin-bottom:0}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast)ease;margin:0 0 var(--ifm-spacing-vertical);border:1px solid var(--ifm-alert-border-color)}.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color);margin-bottom:var(--ifm-leading);box-shadow:var(--ifm-global-shadow-lw);border-radius:var(--ifm-code-border-radius)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockStandalone_MEMb{padding:0}.codeBlockLines_e6Vv{font:inherit;float:left;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{padding:var(--ifm-pre-padding)0;display:table}@media print{.codeBlockLines_e6Vv{white-space:pre-wrap}}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.codeLine_lJS_{counter-increment:line-count;display:table-row}.codeLineNumber_Tfdd{text-align:right;width:1%;padding:0 var(--ifm-pre-padding);background:var(--ifm-pre-background);overflow-wrap:normal;display:table-cell;position:sticky;left:0}.codeLineNumber_Tfdd:before{content:counter(line-count);opacity:.4}.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_Vdqa{opacity:1!important}.copyButtonIcons_IEyt{width:1.125rem;height:1.125rem;position:relative}.copyButtonIcon_TrPX,.copyButtonSuccessIcon_cVMy{fill:currentColor;opacity:inherit;width:inherit;height:inherit;transition:all var(--ifm-transition-fast)ease;position:absolute;top:0;left:0}.copyButtonSuccessIcon_cVMy{opacity:0;color:#00d600;top:50%;left:50%;transform:translate(-50%,-50%)scale(.33)}.copyButtonCopied_Vdqa .copyButtonIcon_TrPX{opacity:0;transform:scale(.33)}.copyButtonCopied_Vdqa .copyButtonSuccessIcon_cVMy{opacity:1;transition-delay:75ms;transform:translate(-50%,-50%)scale(1)}.tabList__CuJ{margin-bottom:var(--ifm-leading)}.tabItem_LNqP{margin-top:0!important}.tabItem_Ymn6>:last-child{margin-bottom:0}.required_k7Xu{font-size:var(--ifm-code-font-size);color:var(--ifm-color-danger)}.deprecated_iwIh{font-size:var(--ifm-code-font-size);color:var(--ifm-color-warning)}.readOnly_RjRF{font-size:var(--ifm-code-font-size);color:var(--ifm-color-info-darker)}.writeOnly_QX6I{font-size:var(--ifm-code-font-size);color:var(--ifm-color-primary-darker)}.constant_erHY{font-size:var(--ifm-code-font-size);color:var(--ifm-color-secondary-darkest)}.wordWrapButtonIcon_b1P5{width:1.2rem;height:1.2rem}.wordWrapButtonEnabled_uzNF .wordWrapButtonIcon_b1P5{color:var(--ifm-color-primary)}.buttonGroup_M5ko{right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2);column-gap:.2rem;display:flex;position:absolute}.buttonGroup_M5ko button{background:var(--prism-background-color);color:var(--prism-color);border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);transition:opacity var(--ifm-transition-fast)ease-in-out;opacity:0;align-items:center;padding:.4rem;line-height:0;display:flex}.buttonGroup_M5ko button:focus-visible,.buttonGroup_M5ko button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup_M5ko button{opacity:.4}.codeBlockContent_QJqH{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_OeMC{border-bottom:1px solid var(--ifm-color-emphasis-300);font-size:var(--ifm-code-font-size);padding:.75rem var(--ifm-pre-padding);border-top-left-radius:inherit;border-top-right-radius:inherit;font-weight:500}.codeBlockTitle_OeMC+.codeBlockContent_QJqH .codeBlock_a8dz{border-top-left-radius:0;border-top-right-radius:0}.schemaItem_buZn{padding:5px 0 5px 1rem;list-style:none;position:relative;border-left:thin solid var(--ifm-color-gray-500)!important;margin:0!important}.schemaItem_buZn:hover,.schemaItem_buZn:focus{background-color:var(--ifm-menu-color-background-active)}[class^=schemaItem]:before{border-bottom:thin solid var(--ifm-color-gray-500);content:"";vertical-align:top;width:.7rem;height:.5rem;display:inline-block;position:absolute;top:10px;left:0}.schemaName_Rg3q{opacity:.6}.strikethrough_g4yO{-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-aria-container{position:absolute;left:-999em}.monaco-editor .selection-anchor{background-color:#007acc;width:2px!important}.monaco-editor .bracket-match{box-sizing:border-box;background-color:var(--vscode-editorBracketMatch-background);border:1px solid var(--vscode-editorBracketMatch-border)}.inline-editor-progress-decoration{width:1em;height:1em;display:inline-block}.inline-progress-widget{justify-content:center;align-items:center;display:flex!important}.inline-progress-widget .icon{font-size:80%!important}.inline-progress-widget:hover .icon{animation:none;font-size:90%!important}.inline-progress-widget:hover .icon:before{content:var(--vscode-icon-x-content);font-family:var(--vscode-icon-x-font-family)}.monaco-editor .monaco-editor-overlaymessage{z-index:10000;padding-bottom:8px}.monaco-editor .monaco-editor-overlaymessage.below{z-index:10000;padding-top:8px;padding-bottom:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.monaco-editor .monaco-editor-overlaymessage.fadeIn{animation:.15s ease-out fadeIn}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.monaco-editor .monaco-editor-overlaymessage.fadeOut{animation:.1s ease-out fadeOut}.monaco-editor .monaco-editor-overlaymessage .message{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-inputValidation-infoBorder);border-radius:3px;padding:2px 4px}.monaco-editor .monaco-editor-overlaymessage .message p{margin-block:0}.monaco-editor .monaco-editor-overlaymessage .message a{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-editor-overlaymessage .message a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor.hc-black .monaco-editor-overlaymessage .message,.monaco-editor.hc-light .monaco-editor-overlaymessage .message{border-width:2px}.monaco-editor .monaco-editor-overlaymessage .anchor{z-index:1000;border:8px solid #0000;position:absolute;left:2px;width:0!important;height:0!important}.monaco-editor .monaco-editor-overlaymessage .anchor.top{border-bottom-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage .anchor.below{border-top-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage:not(.below) .anchor.top,.monaco-editor .monaco-editor-overlaymessage.below .anchor.below{display:none}.monaco-editor .monaco-editor-overlaymessage.below .anchor.top{display:inherit;top:-8px}.monaco-editor .rendered-markdown kbd{background-color:var(--vscode-keybindingLabel-background);color:var(--vscode-keybindingLabel-foreground);border-style:solid;border-width:1px;border-color:var(--vscode-keybindingLabel-border);border-bottom-color:var(--vscode-keybindingLabel-bottomBorder);box-shadow:inset 0 -1px 0 var(--vscode-widget-shadow);vertical-align:middle;border-radius:3px;padding:1px 3px}.rendered-markdown li:has(input[type=checkbox]){list-style-type:none}.monaco-text-button{box-sizing:border-box;text-align:center;cursor:pointer;border:1px solid var(--vscode-button-border,transparent);border-radius:2px;justify-content:center;align-items:center;width:100%;padding:4px;line-height:18px;display:flex}.monaco-text-button:focus{outline-offset:2px!important}.monaco-text-button:hover{-webkit-text-decoration:none!important;text-decoration:none!important}.monaco-button.disabled:focus,.monaco-button.disabled{cursor:default;opacity:.4!important}.monaco-text-button .codicon{margin:0 .2em;color:inherit!important}.monaco-text-button.monaco-text-button-with-short-label{flex-flow:wrap;height:28px;padding:0 4px;overflow:hidden}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label{flex-basis:100%}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label-short{flex-grow:1;width:0;overflow:hidden}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label,.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label-short{font-weight:400;font-style:inherit;justify-content:center;align-items:center;padding:4px 0;display:flex}.monaco-button-dropdown{cursor:pointer;display:flex}.monaco-button-dropdown.disabled{cursor:default}.monaco-button-dropdown>.monaco-button:focus{outline-offset:-1px!important}.monaco-button-dropdown.disabled>.monaco-button.disabled,.monaco-button-dropdown.disabled>.monaco-button.disabled:focus,.monaco-button-dropdown.disabled>.monaco-button-dropdown-separator{opacity:.4!important}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-right-width:0!important}.monaco-button-dropdown .monaco-button-dropdown-separator{cursor:default;padding:4px 0}.monaco-button-dropdown .monaco-button-dropdown-separator>div{width:1px;height:100%}.monaco-button-dropdown>.monaco-button.monaco-dropdown-button{border:1px solid var(--vscode-button-border,transparent);border-radius:0 2px 2px 0;align-items:center;display:flex;border-left-width:0!important}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-radius:2px 0 0 2px}.monaco-description-button{flex-direction:column;align-items:center;margin:4px 5px;display:flex}.monaco-description-button .monaco-button-description{padding:4px 20px;font-size:11px;font-style:italic}.monaco-description-button .monaco-button-label,.monaco-description-button .monaco-button-description{justify-content:center;align-items:center;display:flex}.monaco-description-button .monaco-button-label>.codicon,.monaco-description-button .monaco-button-description>.codicon{margin:0 .2em;color:inherit!important}.monaco-button.default-colors,.monaco-button-dropdown.default-colors>.monaco-button{color:var(--vscode-button-foreground);background-color:var(--vscode-button-background)}.monaco-button.default-colors:hover,.monaco-button-dropdown.default-colors>.monaco-button:hover{background-color:var(--vscode-button-hoverBackground)}.monaco-button.default-colors.secondary,.monaco-button-dropdown.default-colors>.monaco-button.secondary{color:var(--vscode-button-secondaryForeground);background-color:var(--vscode-button-secondaryBackground)}.monaco-button.default-colors.secondary:hover,.monaco-button-dropdown.default-colors>.monaco-button.secondary:hover{background-color:var(--vscode-button-secondaryHoverBackground)}.monaco-button-dropdown.default-colors .monaco-button-dropdown-separator{background-color:var(--vscode-button-background);border-top:1px solid var(--vscode-button-border);border-bottom:1px solid var(--vscode-button-border)}.monaco-button-dropdown.default-colors .monaco-button.secondary+.monaco-button-dropdown-separator{background-color:var(--vscode-button-secondaryBackground)}.monaco-button-dropdown.default-colors .monaco-button-dropdown-separator>div{background-color:var(--vscode-button-separator)}.post-edit-widget{box-shadow:0 0 8px 2px var(--vscode-widget-shadow);border:1px solid var(--vscode-widget-border,transparent);background-color:var(--vscode-editorWidget-background);border-radius:4px;overflow:hidden}.post-edit-widget .monaco-button{border:none;border-radius:0;padding:2px}.post-edit-widget .monaco-button:hover{background-color:var(--vscode-button-secondaryHoverBackground)!important}.post-edit-widget .monaco-button .codicon{margin:0}@font-face{font-family:codicon;font-display:block;src:url(/multi-scrobbler/assets/fonts/codicon-f6283f7ccaed1249d9ebbcc5a55d5970.ttf)format("truetype")}.codicon[class*=codicon-]{text-rendering:auto;text-align:center;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-select:none;user-select:none;font:16px/1 codicon;-webkit-text-decoration:none;text-decoration:none;display:inline-block}.codicon-wrench-subaction{opacity:.5}@keyframes codicon-spin{to{transform:rotate(360deg)}}.codicon-sync.codicon-modifier-spin,.codicon-loading.codicon-modifier-spin,.codicon-gear.codicon-modifier-spin,.codicon-notebook-state-executing.codicon-modifier-spin{animation:1.5s steps(30,end) infinite codicon-spin}.codicon-modifier-disabled{opacity:.4}.codicon-loading,.codicon-tree-item-loading:before{animation-duration:1s!important;animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important}.monaco-editor .codicon.codicon-symbol-array,.monaco-workbench .codicon.codicon-symbol-array{color:var(--vscode-symbolIcon-arrayForeground)}.monaco-editor .codicon.codicon-symbol-boolean,.monaco-workbench .codicon.codicon-symbol-boolean{color:var(--vscode-symbolIcon-booleanForeground)}.monaco-editor .codicon.codicon-symbol-class,.monaco-workbench .codicon.codicon-symbol-class{color:var(--vscode-symbolIcon-classForeground)}.monaco-editor .codicon.codicon-symbol-method,.monaco-workbench .codicon.codicon-symbol-method{color:var(--vscode-symbolIcon-methodForeground)}.monaco-editor .codicon.codicon-symbol-color,.monaco-workbench .codicon.codicon-symbol-color{color:var(--vscode-symbolIcon-colorForeground)}.monaco-editor .codicon.codicon-symbol-constant,.monaco-workbench .codicon.codicon-symbol-constant{color:var(--vscode-symbolIcon-constantForeground)}.monaco-editor .codicon.codicon-symbol-constructor,.monaco-workbench .codicon.codicon-symbol-constructor{color:var(--vscode-symbolIcon-constructorForeground)}.monaco-editor .codicon.codicon-symbol-value,.monaco-workbench .codicon.codicon-symbol-value,.monaco-editor .codicon.codicon-symbol-enum,.monaco-workbench .codicon.codicon-symbol-enum{color:var(--vscode-symbolIcon-enumeratorForeground)}.monaco-editor .codicon.codicon-symbol-enum-member,.monaco-workbench .codicon.codicon-symbol-enum-member{color:var(--vscode-symbolIcon-enumeratorMemberForeground)}.monaco-editor .codicon.codicon-symbol-event,.monaco-workbench .codicon.codicon-symbol-event{color:var(--vscode-symbolIcon-eventForeground)}.monaco-editor .codicon.codicon-symbol-field,.monaco-workbench .codicon.codicon-symbol-field{color:var(--vscode-symbolIcon-fieldForeground)}.monaco-editor .codicon.codicon-symbol-file,.monaco-workbench .codicon.codicon-symbol-file{color:var(--vscode-symbolIcon-fileForeground)}.monaco-editor .codicon.codicon-symbol-folder,.monaco-workbench .codicon.codicon-symbol-folder{color:var(--vscode-symbolIcon-folderForeground)}.monaco-editor .codicon.codicon-symbol-function,.monaco-workbench .codicon.codicon-symbol-function{color:var(--vscode-symbolIcon-functionForeground)}.monaco-editor .codicon.codicon-symbol-interface,.monaco-workbench .codicon.codicon-symbol-interface{color:var(--vscode-symbolIcon-interfaceForeground)}.monaco-editor .codicon.codicon-symbol-key,.monaco-workbench .codicon.codicon-symbol-key{color:var(--vscode-symbolIcon-keyForeground)}.monaco-editor .codicon.codicon-symbol-keyword,.monaco-workbench .codicon.codicon-symbol-keyword{color:var(--vscode-symbolIcon-keywordForeground)}.monaco-editor .codicon.codicon-symbol-module,.monaco-workbench .codicon.codicon-symbol-module{color:var(--vscode-symbolIcon-moduleForeground)}.monaco-editor .codicon.codicon-symbol-namespace,.monaco-workbench .codicon.codicon-symbol-namespace{color:var(--vscode-symbolIcon-namespaceForeground)}.monaco-editor .codicon.codicon-symbol-null,.monaco-workbench .codicon.codicon-symbol-null{color:var(--vscode-symbolIcon-nullForeground)}.monaco-editor .codicon.codicon-symbol-number,.monaco-workbench .codicon.codicon-symbol-number{color:var(--vscode-symbolIcon-numberForeground)}.monaco-editor .codicon.codicon-symbol-object,.monaco-workbench .codicon.codicon-symbol-object{color:var(--vscode-symbolIcon-objectForeground)}.monaco-editor .codicon.codicon-symbol-operator,.monaco-workbench .codicon.codicon-symbol-operator{color:var(--vscode-symbolIcon-operatorForeground)}.monaco-editor .codicon.codicon-symbol-package,.monaco-workbench .codicon.codicon-symbol-package{color:var(--vscode-symbolIcon-packageForeground)}.monaco-editor .codicon.codicon-symbol-property,.monaco-workbench .codicon.codicon-symbol-property{color:var(--vscode-symbolIcon-propertyForeground)}.monaco-editor .codicon.codicon-symbol-reference,.monaco-workbench .codicon.codicon-symbol-reference{color:var(--vscode-symbolIcon-referenceForeground)}.monaco-editor .codicon.codicon-symbol-snippet,.monaco-workbench .codicon.codicon-symbol-snippet{color:var(--vscode-symbolIcon-snippetForeground)}.monaco-editor .codicon.codicon-symbol-string,.monaco-workbench .codicon.codicon-symbol-string{color:var(--vscode-symbolIcon-stringForeground)}.monaco-editor .codicon.codicon-symbol-struct,.monaco-workbench .codicon.codicon-symbol-struct{color:var(--vscode-symbolIcon-structForeground)}.monaco-editor .codicon.codicon-symbol-text,.monaco-workbench .codicon.codicon-symbol-text{color:var(--vscode-symbolIcon-textForeground)}.monaco-editor .codicon.codicon-symbol-type-parameter,.monaco-workbench .codicon.codicon-symbol-type-parameter{color:var(--vscode-symbolIcon-typeParameterForeground)}.monaco-editor .codicon.codicon-symbol-unit,.monaco-workbench .codicon.codicon-symbol-unit{color:var(--vscode-symbolIcon-unitForeground)}.monaco-editor .codicon.codicon-symbol-variable,.monaco-workbench .codicon.codicon-symbol-variable{color:var(--vscode-symbolIcon-variableForeground)}.monaco-editor .lightBulbWidget{justify-content:center;align-items:center;display:flex}.monaco-editor .lightBulbWidget:hover{cursor:pointer}.monaco-editor .lightBulbWidget.codicon-light-bulb,.monaco-editor .lightBulbWidget.codicon-lightbulb-sparkle{color:var(--vscode-editorLightBulb-foreground)}.monaco-editor .lightBulbWidget.codicon-lightbulb-autofix,.monaco-editor .lightBulbWidget.codicon-lightbulb-sparkle-autofix{color:var(--vscode-editorLightBulbAutoFix-foreground,var(--vscode-editorLightBulb-foreground))}.monaco-editor .lightBulbWidget.codicon-sparkle-filled{color:var(--vscode-editorLightBulbAi-foreground,var(--vscode-icon-foreground))}.monaco-editor .lightBulbWidget:before{z-index:2;position:relative}.monaco-editor .lightBulbWidget:after{content:"";opacity:.3;z-index:1;width:100%;height:100%;display:block;position:absolute;top:0;left:0}.monaco-editor .glyph-margin-widgets .cgmr[class*=codicon-gutter-lightbulb]{cursor:pointer;display:block}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb,.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-sparkle{color:var(--vscode-editorLightBulb-foreground)}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-auto-fix,.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-aifix-auto-fix{color:var(--vscode-editorLightBulbAutoFix-foreground,var(--vscode-editorLightBulb-foreground))}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-sparkle-filled{color:var(--vscode-editorLightBulbAi-foreground,var(--vscode-icon-foreground))}.monaco-list{white-space:nowrap;width:100%;height:100%;position:relative}.monaco-list.mouse-support{-webkit-user-select:none;user-select:none}.monaco-list>.monaco-scrollable-element{height:100%}.monaco-list-rows{width:100%;height:100%;position:relative}.monaco-list.horizontal-scrolling .monaco-list-rows{width:auto;min-width:100%}.monaco-list-row{box-sizing:border-box;width:100%;position:absolute;overflow:hidden}.monaco-list.mouse-support .monaco-list-row{cursor:pointer;touch-action:none}.monaco-list .monaco-scrollable-element>.scrollbar.vertical,.monaco-pane-view>.monaco-split-view2.vertical>.monaco-scrollable-element>.scrollbar.vertical{z-index:14}.monaco-list-row.scrolling{display:none!important}.monaco-list.element-focused,.monaco-list.selection-single,.monaco-list.selection-multiple{outline:0!important}.monaco-drag-image{z-index:1000;border-radius:10px;padding:1px 7px;font-size:12px;display:inline-block;position:absolute}.monaco-list-type-filter-message{box-sizing:border-box;text-align:center;white-space:normal;opacity:.7;pointer-events:none;width:100%;height:100%;padding:40px 1em 1em;position:absolute;top:0;left:0}.monaco-list-type-filter-message:empty{display:none}.monaco-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.monaco-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.monaco-scrollable-element>.invisible{opacity:0;pointer-events:none}.monaco-scrollable-element>.invisible.fade{transition:opacity .8s linear}.monaco-scrollable-element>.shadow{display:none;position:absolute}.monaco-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow)0 6px 6px -6px inset;display:block;top:0;left:3px}.monaco-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow)6px 0 6px -6px inset;display:block;top:3px;left:0}.monaco-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.monaco-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow)6px 0 6px -6px inset}.monaco-scrollable-element>.scrollbar>.slider{background:var(--vscode-scrollbarSlider-background)}.monaco-scrollable-element>.scrollbar>.slider:hover{background:var(--vscode-scrollbarSlider-hoverBackground)}.monaco-scrollable-element>.scrollbar>.slider.active{background:var(--vscode-scrollbarSlider-activeBackground)}.monaco-select-box-dropdown-padding{--dropdown-padding-top:1px;--dropdown-padding-bottom:1px}.hc-black .monaco-select-box-dropdown-padding,.hc-light .monaco-select-box-dropdown-padding{--dropdown-padding-top:3px;--dropdown-padding-bottom:4px}.monaco-select-box-dropdown-container{box-sizing:border-box;display:none}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown *{margin:0}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown a:focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown code{line-height:15px;font-family:var(--monaco-monospace-font)}.monaco-select-box-dropdown-container.visible{text-align:left;border-bottom-right-radius:3px;border-bottom-left-radius:3px;flex-direction:column;width:1px;display:flex;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container{padding-top:var(--dropdown-padding-top);padding-bottom:var(--dropdown-padding-bottom);box-sizing:border-box;flex:none;align-self:flex-start;width:100%;padding-left:1px;padding-right:1px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-details-pane{padding:5px}.hc-black .monaco-select-box-dropdown-container>.select-box-dropdown-list-container{padding-top:var(--dropdown-padding-top);padding-bottom:var(--dropdown-padding-bottom)}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row{cursor:pointer}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-text{text-overflow:ellipsis;white-space:nowrap;float:left;padding-left:3.5px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-detail{text-overflow:ellipsis;white-space:nowrap;float:left;opacity:.7;padding-left:3.5px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-decorator-right{text-overflow:ellipsis;white-space:nowrap;float:right;padding-right:10px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.visually-hidden{width:1px;height:1px;position:absolute;top:auto;left:-10000px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control{opacity:0;flex:auto;align-self:flex-start}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control>.width-control-div{max-height:0;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control>.width-control-div>.option-text-width-control{white-space:nowrap;padding-left:4px;padding-right:8px}.monaco-select-box{cursor:pointer;border-radius:2px;width:100%}.monaco-select-box-dropdown-container{text-transform:none;font-size:13px;font-weight:400}.monaco-action-bar .action-item.select-container{cursor:default}.monaco-action-bar .action-item .monaco-select-box{cursor:pointer;min-width:100px;min-height:18px;padding:2px 23px 2px 8px}.mac .monaco-action-bar .action-item .monaco-select-box{border-radius:5px;font-size:11px}.monaco-action-bar{white-space:nowrap;height:100%}.monaco-action-bar .actions-container{align-items:center;width:100%;height:100%;margin:0 auto;padding:0;display:flex}.monaco-action-bar.vertical .actions-container{display:inline-block}.monaco-action-bar .action-item{cursor:pointer;justify-content:center;align-items:center;display:block;position:relative}.monaco-action-bar .action-item.disabled{cursor:default}.monaco-action-bar .action-item .icon,.monaco-action-bar .action-item .codicon{display:block}.monaco-action-bar .action-item .codicon{align-items:center;width:16px;height:16px;display:flex}.monaco-action-bar .action-label{border-radius:5px;padding:3px;font-size:11px;display:flex}.monaco-action-bar .action-item.disabled .action-label,.monaco-action-bar .action-item.disabled .action-label:before,.monaco-action-bar .action-item.disabled .action-label:hover{color:var(--vscode-disabledForeground)}.monaco-action-bar.vertical{text-align:left}.monaco-action-bar.vertical .action-item{display:block}.monaco-action-bar.vertical .action-label.separator{border-bottom:1px solid #bbb;margin-left:.8em;margin-right:.8em;padding-top:1px;display:block}.monaco-action-bar .action-item .action-label.separator{cursor:default;background-color:#bbb;width:1px;min-width:1px;height:16px;padding:0;margin:5px 4px!important}.secondary-actions .monaco-action-bar .action-label{margin-left:6px}.monaco-action-bar .action-item.select-container{flex:1;justify-content:center;align-items:center;min-width:60px;max-width:170px;margin-right:10px;display:flex;overflow:hidden}.monaco-action-bar .action-item.action-dropdown-item{display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-dropdown-item-separator{cursor:default;align-items:center;display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-dropdown-item-separator>div{width:1px}.action-widget{z-index:40;background-color:var(--vscode-editorActionList-background);width:100%;min-width:160px;max-width:80vw;color:var(--vscode-editorActionList-foreground);box-shadow:0 2px 8px var(--vscode-widget-shadow);border-radius:5px;padding:4px;font-size:13px;display:block;border:1px solid var(--vscode-editorWidget-border)!important}.context-view-block{cursor:initial;z-index:-1;width:100%;height:100%;position:fixed;top:0;left:0}.context-view-pointerBlock{cursor:initial;z-index:2;width:100%;height:100%;position:fixed;top:0;left:0}.action-widget .monaco-list{-webkit-user-select:none;user-select:none;border:0!important}.action-widget .monaco-list:focus:before{outline:0!important}.action-widget .monaco-list .monaco-scrollable-element{overflow:visible}.action-widget .monaco-list .monaco-list-row{white-space:nowrap;cursor:pointer;touch-action:none;border-radius:4px;width:100%;padding:0 10px}.action-widget .monaco-list .monaco-list-row.action.focused:not(.option-disabled){color:var(--vscode-editorActionList-focusForeground);outline:1px solid var(--vscode-menu-selectionBorder,transparent);outline-offset:-1px;background-color:var(--vscode-editorActionList-focusBackground)!important}.action-widget .monaco-list-row.group-header{font-size:12px;font-weight:600;color:var(--vscode-descriptionForeground)!important}.action-widget .monaco-list-row.group-header:not(:first-of-type){margin-top:2px}.action-widget .monaco-list .group-header,.action-widget .monaco-list .option-disabled,.action-widget .monaco-list .option-disabled:before,.action-widget .monaco-list .option-disabled .focused,.action-widget .monaco-list .option-disabled .focused:before{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:default!important;background-color:#0000!important;outline:0 solid!important}.action-widget .monaco-list-row.action{align-items:center;gap:8px;display:flex}.action-widget .monaco-list-row.action.option-disabled,.action-widget .monaco-list:focus .monaco-list-row.focused.action.option-disabled,.action-widget .monaco-list-row.action.option-disabled .codicon,.action-widget .monaco-list:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused).option-disabled{color:var(--vscode-disabledForeground)}.action-widget .monaco-list-row.action:not(.option-disabled) .codicon{color:inherit}.action-widget .monaco-list-row.action .title{text-overflow:ellipsis;flex:1;overflow:hidden}.action-widget .monaco-list-row.action .monaco-keybinding>.monaco-keybinding-key{background-color:var(--vscode-keybindingLabel-background);color:var(--vscode-keybindingLabel-foreground);border-style:solid;border-width:1px;border-color:var(--vscode-keybindingLabel-border);border-bottom-color:var(--vscode-keybindingLabel-bottomBorder);box-shadow:inset 0 -1px 0 var(--vscode-widget-shadow);border-radius:3px}.action-widget .action-widget-action-bar{background-color:var(--vscode-editorActionList-background);border-top:1px solid var(--vscode-editorHoverWidget-border);margin-top:2px}.action-widget .action-widget-action-bar:before{content:"";width:100%;display:block}.action-widget .action-widget-action-bar .actions-container{padding:3px 8px 0}.action-widget-action-bar .action-label{color:var(--vscode-textLink-activeForeground);pointer-events:all;padding:0;font-size:12px;line-height:22px}.action-widget-action-bar .action-item{pointer-events:none;margin-right:16px}.action-widget-action-bar .action-label:hover{background-color:#0000!important}.monaco-action-bar .actions-container.highlight-toggled .action-label.checked{background:var(--vscode-actionBar-toggledBackground)!important}.monaco-keybinding{align-items:center;line-height:10px;display:flex}.monaco-keybinding>.monaco-keybinding-key{vertical-align:middle;border-style:solid;border-width:1px;border-radius:3px;margin:0 2px;padding:3px 5px;font-size:11px;display:inline-block}.monaco-keybinding>.monaco-keybinding-key:first-child{margin-left:0}.monaco-keybinding>.monaco-keybinding-key:last-child{margin-right:0}.monaco-keybinding>.monaco-keybinding-key-separator{display:inline-block}.monaco-keybinding>.monaco-keybinding-key-chord-separator{width:6px}::-ms-clear{display:none}.monaco-editor .editor-widget input{color:inherit}.monaco-editor{-webkit-text-size-adjust:100%;color:var(--vscode-editor-foreground);background-color:var(--vscode-editor-background);overflow-wrap:initial;position:relative;overflow:visible}.monaco-editor-background{background-color:var(--vscode-editor-background)}.monaco-editor .rangeHighlight{background-color:var(--vscode-editor-rangeHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-rangeHighlightBorder)}.monaco-editor.hc-black .rangeHighlight,.monaco-editor.hc-light .rangeHighlight{border-style:dotted}.monaco-editor .symbolHighlight{background-color:var(--vscode-editor-symbolHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-symbolHighlightBorder)}.monaco-editor.hc-black .symbolHighlight,.monaco-editor.hc-light .symbolHighlight{border-style:dotted}.monaco-editor .overflow-guard{position:relative;overflow:hidden}.monaco-editor .view-overlays{position:absolute;top:0}.monaco-editor .view-overlays>div,.monaco-editor .margin-view-overlays>div{width:100%;position:absolute}.monaco-editor .squiggly-error{border-bottom:4px double var(--vscode-editorError-border)}.monaco-editor .squiggly-error:before{content:"";background:var(--vscode-editorError-background);width:100%;height:100%;display:block}.monaco-editor .squiggly-warning{border-bottom:4px double var(--vscode-editorWarning-border)}.monaco-editor .squiggly-warning:before{content:"";background:var(--vscode-editorWarning-background);width:100%;height:100%;display:block}.monaco-editor .squiggly-info{border-bottom:4px double var(--vscode-editorInfo-border)}.monaco-editor .squiggly-info:before{content:"";background:var(--vscode-editorInfo-background);width:100%;height:100%;display:block}.monaco-editor .squiggly-hint{border-bottom:2px dotted var(--vscode-editorHint-border)}.monaco-editor.showUnused .squiggly-unnecessary{border-bottom:2px dashed var(--vscode-editorUnnecessaryCode-border)}.monaco-editor.showDeprecated .squiggly-inline-deprecated{-webkit-text-decoration:line-through;text-decoration:line-through;-webkit-text-decoration-color:var(--vscode-editor-foreground,inherit);text-decoration-color:var(--vscode-editor-foreground,inherit)}.monaco-editor .inputarea{resize:none;color:#0000;z-index:-10;background-color:#0000;border:none;min-width:0;min-height:0;margin:0;padding:0;position:absolute;overflow:hidden;outline:none!important}.monaco-editor .inputarea.ime-input{z-index:10;caret-color:var(--vscode-editorCursor-foreground);color:var(--vscode-editor-foreground)}.monaco-editor .margin-view-overlays .line-numbers{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;text-align:right;vertical-align:middle;box-sizing:border-box;cursor:default;display:inline-block;position:absolute;bottom:0}.monaco-editor .relative-current-line-number{text-align:left;width:100%;display:inline-block}.monaco-editor .margin-view-overlays .line-numbers.lh-odd{margin-top:1px}.monaco-editor .line-numbers{color:var(--vscode-editorLineNumber-foreground)}.monaco-editor .line-numbers.active-line-number{color:var(--vscode-editorLineNumber-activeForeground)}.monaco-editor .margin{background-color:var(--vscode-editorGutter-background)}.monaco-mouse-cursor-text{cursor:text}.monaco-editor .blockDecorations-container{pointer-events:none;position:absolute;top:0}.monaco-editor .blockDecorations-block{box-sizing:border-box;position:absolute}.monaco-editor .view-overlays .current-line,.monaco-editor .margin-view-overlays .current-line{box-sizing:border-box;height:100%;display:block;position:absolute;top:0;left:0}.monaco-editor .margin-view-overlays .current-line.current-line-margin.current-line-margin-both{border-right:0}.monaco-editor .lines-content .cdr{height:100%;position:absolute}.monaco-editor .glyph-margin{position:absolute;top:0}.monaco-editor .glyph-margin-widgets .cgmr{justify-content:center;align-items:center;display:flex;position:absolute}.monaco-editor .glyph-margin-widgets .cgmr.codicon-modifier-spin:before{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.monaco-editor .lines-content .core-guide{box-sizing:border-box;height:100%;position:absolute}.mtkcontrol{color:#fff!important;background:#960000!important}.mtkoverflow{background-color:var(--vscode-button-background,var(--vscode-editor-background));color:var(--vscode-button-foreground,var(--vscode-editor-foreground));border-style:solid;border-width:1px;border-color:var(--vscode-contrastBorder);cursor:pointer;border-radius:2px;padding:4px}.mtkoverflow:hover{background-color:var(--vscode-button-hoverBackground)}.monaco-editor.no-user-select .lines-content,.monaco-editor.no-user-select .view-line,.monaco-editor.no-user-select .view-lines{-webkit-user-select:none;user-select:none}.monaco-editor.mac .lines-content:hover,.monaco-editor.mac .view-line:hover,.monaco-editor.mac .view-lines:hover{-webkit-user-select:text;user-select:text}.monaco-editor.enable-user-select{user-select:initial;-webkit-user-select:initial}.monaco-editor .view-lines{white-space:nowrap}.monaco-editor .view-line{width:100%;position:absolute}.monaco-editor .lines-content>.view-lines>.view-line>span{position:absolute;top:0;bottom:0}.monaco-editor .mtkw{color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .mtkz{display:inline-block;color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .lines-decorations{background:#fff;position:absolute;top:0}.monaco-editor .margin-view-overlays .cldr{height:100%;position:absolute}.monaco-editor .margin-view-overlays .cmdr{width:100%;height:100%;position:absolute;left:0}.monaco-editor .minimap.slider-mouseover .minimap-slider{opacity:0;transition:opacity .1s linear}.monaco-editor .minimap.slider-mouseover:hover .minimap-slider,.monaco-editor .minimap.slider-mouseover .minimap-slider.active{opacity:1}.monaco-editor .minimap-slider .minimap-slider-horizontal{background:var(--vscode-minimapSlider-background)}.monaco-editor .minimap-slider:hover .minimap-slider-horizontal{background:var(--vscode-minimapSlider-hoverBackground)}.monaco-editor .minimap-slider.active .minimap-slider-horizontal{background:var(--vscode-minimapSlider-activeBackground)}.monaco-editor .minimap-shadow-visible{box-shadow:var(--vscode-scrollbar-shadow)-6px 0 6px -6px inset}.monaco-editor .minimap-shadow-hidden{width:0;position:absolute}.monaco-editor .minimap-shadow-visible{width:6px;position:absolute;left:-6px}.monaco-editor.no-minimap-shadow .minimap-shadow-visible{width:1px;position:absolute;left:-1px}.minimap.autohide{opacity:0;transition:opacity .5s}.minimap.autohide:hover{opacity:1}.monaco-editor .minimap{z-index:5}.monaco-editor .overlayWidgets{position:absolute;top:0;left:0}.monaco-editor .view-ruler{box-shadow:1px 0 0 0 var(--vscode-editorRuler-foreground)inset;position:absolute;top:0}.monaco-editor .scroll-decoration{height:6px;box-shadow:var(--vscode-scrollbar-shadow)0 6px 6px -6px inset;position:absolute;top:0;left:0}.monaco-editor .lines-content .cslr{position:absolute}.monaco-editor .focused .selected-text{background-color:var(--vscode-editor-selectionBackground)}.monaco-editor .selected-text{background-color:var(--vscode-editor-inactiveSelectionBackground)}.monaco-editor .top-left-radius{border-top-left-radius:3px}.monaco-editor .bottom-left-radius{border-bottom-left-radius:3px}.monaco-editor .top-right-radius{border-top-right-radius:3px}.monaco-editor .bottom-right-radius{border-bottom-right-radius:3px}.monaco-editor.hc-black .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-black .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-black .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-black .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor.hc-light .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-light .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-light .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-light .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor .cursors-layer{position:absolute;top:0}.monaco-editor .cursors-layer>.cursor{box-sizing:border-box;position:absolute;overflow:hidden}.monaco-editor .cursors-layer.cursor-smooth-caret-animation>.cursor{transition:all 80ms}.monaco-editor .cursors-layer.cursor-block-outline-style>.cursor{border-style:solid;border-width:1px;background:0 0!important}.monaco-editor .cursors-layer.cursor-underline-style>.cursor{border-bottom-style:solid;border-bottom-width:2px;background:0 0!important}.monaco-editor .cursors-layer.cursor-underline-thin-style>.cursor{border-bottom-style:solid;border-bottom-width:1px;background:0 0!important}@keyframes monaco-cursor-smooth{0%,20%{opacity:1}60%,to{opacity:0}}@keyframes monaco-cursor-phase{0%,20%{opacity:1}90%,to{opacity:0}}@keyframes monaco-cursor-expand{0%,20%{transform:scaleY(1)}80%,to{transform:scaleY(0)}}.cursor-smooth{animation:.5s ease-in-out 20 alternate monaco-cursor-smooth}.cursor-phase{animation:.5s ease-in-out 20 alternate monaco-cursor-phase}.cursor-expand>.cursor{animation:.5s ease-in-out 20 alternate monaco-cursor-expand}.monaco-editor .mwh{position:absolute;color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .codelens-decoration{text-overflow:ellipsis;white-space:nowrap;color:var(--vscode-editorCodeLens-foreground);line-height:var(--vscode-editorCodeLens-lineHeight);font-size:var(--vscode-editorCodeLens-fontSize);padding-right:calc(var(--vscode-editorCodeLens-fontSize)*.5);font-feature-settings:var(--vscode-editorCodeLens-fontFeatureSettings);font-family:var(--vscode-editorCodeLens-fontFamily),var(--vscode-editorCodeLens-fontFamilyDefault);display:inline-block;overflow:hidden}.monaco-editor .codelens-decoration>span,.monaco-editor .codelens-decoration>a{-webkit-user-select:none;user-select:none;white-space:nowrap;vertical-align:sub}.monaco-editor .codelens-decoration>a{-webkit-text-decoration:none;text-decoration:none}.monaco-editor .codelens-decoration>a:hover{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration>a:hover .codicon{color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration .codicon{vertical-align:middle;color:var(--vscode-editorCodeLens-foreground);line-height:var(--vscode-editorCodeLens-lineHeight);font-size:var(--vscode-editorCodeLens-fontSize);color:currentColor!important}.monaco-editor .codelens-decoration>a:hover .codicon:before{cursor:pointer}@keyframes fadein{0%{opacity:0;visibility:visible}to{opacity:1}}.monaco-editor .codelens-decoration.fadein{animation:.1s linear fadein}.colorpicker-widget{-webkit-user-select:none;user-select:none;height:190px}.colorpicker-color-decoration,.hc-light .colorpicker-color-decoration{box-sizing:border-box;cursor:pointer;border:.1em solid #000;width:.8em;height:.8em;margin:.1em .2em 0;line-height:.8em;display:inline-block}.hc-black .colorpicker-color-decoration,.vs-dark .colorpicker-color-decoration{border:.1em solid #eee}.colorpicker-header{height:24px;image-rendering:pixelated;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=) 0 0/9px 9px;display:flex;position:relative}.colorpicker-header .picked-color{cursor:pointer;color:#fff;white-space:nowrap;flex:1;justify-content:center;align-items:center;width:240px;line-height:24px;display:flex;overflow:hidden}.colorpicker-header .picked-color .picked-color-presentation{white-space:nowrap;margin-left:5px;margin-right:5px}.colorpicker-header .picked-color .codicon{color:inherit;font-size:14px}.colorpicker-header .picked-color.light{color:#000}.colorpicker-header .original-color{width:74px;z-index:inherit;cursor:pointer}.standalone-colorpicker{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.colorpicker-header.standalone-colorpicker{border-bottom:none}.colorpicker-header .close-button{cursor:pointer;background-color:var(--vscode-editorHoverWidget-background);border-left:1px solid var(--vscode-editorHoverWidget-border)}.colorpicker-header .close-button-inner-div{text-align:center;width:100%;height:100%}.colorpicker-header .close-button-inner-div:hover{background-color:var(--vscode-toolbar-hoverBackground)}.colorpicker-header .close-icon{padding:3px}.colorpicker-body{padding:8px;display:flex;position:relative}.colorpicker-body .saturation-wrap{flex:1;min-width:220px;height:150px;position:relative;overflow:hidden}.colorpicker-body .saturation-box{height:150px;position:absolute}.colorpicker-body .saturation-selection{border:1px solid #fff;border-radius:100%;width:9px;height:9px;margin:-5px 0 0 -5px;position:absolute;box-shadow:0 0 2px #000c}.colorpicker-body .strip{width:25px;height:150px}.colorpicker-body .standalone-strip{width:25px;height:122px}.colorpicker-body .hue-strip{cursor:grab;background:linear-gradient(red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);margin-left:8px;position:relative}.colorpicker-body .opacity-strip{cursor:grab;image-rendering:pixelated;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=) 0 0/9px 9px;margin-left:8px;position:relative}.colorpicker-body .strip.grabbing{cursor:grabbing}.colorpicker-body .slider{box-sizing:border-box;border:1px solid #ffffffb5;width:calc(100% + 4px);height:4px;position:absolute;top:0;left:-2px;box-shadow:0 0 1px #000000d9}.colorpicker-body .strip .overlay{pointer-events:none;height:150px}.colorpicker-body .standalone-strip .standalone-overlay{pointer-events:none;height:122px}.standalone-colorpicker-body{border:1px solid #0000;border-bottom:1px solid var(--vscode-editorHoverWidget-border);display:block;overflow:hidden}.colorpicker-body .insert-button{background:var(--vscode-button-background);width:58px;height:20px;color:var(--vscode-button-foreground);cursor:pointer;border:none;border-radius:2px;padding:0;position:absolute;bottom:8px;right:8px}.colorpicker-body .insert-button:hover{background:var(--vscode-button-hoverBackground)}.monaco-editor .inlineSuggestionsHints.withBorder{z-index:39;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .inlineSuggestionsHints a,.monaco-editor .inlineSuggestionsHints a:hover{color:var(--vscode-foreground)}.monaco-editor .inlineSuggestionsHints .keybinding{opacity:.6;margin-left:4px;display:flex}.monaco-editor .inlineSuggestionsHints .keybinding .monaco-keybinding-key{padding:2px 3px;font-size:8px}.monaco-editor .inlineSuggestionsHints .availableSuggestionCount a{justify-content:center;min-width:19px;display:flex}.monaco-editor .inlineSuggestionStatusBarItemLabel{margin-right:2px}.monaco-dropdown{height:100%;padding:0}.monaco-dropdown>.dropdown-label{cursor:pointer;justify-content:center;align-items:center;height:100%;display:flex}.monaco-dropdown>.dropdown-label>.action-label.disabled{cursor:default}.monaco-dropdown-with-primary{border-radius:5px;flex-direction:row;display:flex!important}.monaco-dropdown-with-primary>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{margin-left:-3px;padding-left:0;padding-right:0;font-size:12px;line-height:16px}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{background-position:50%;background-repeat:no-repeat;background-size:16px;display:block}.monaco-action-bar .action-item.menu-entry .action-label.icon{background-position:50%;background-repeat:no-repeat;background-size:16px;width:16px;height:16px}.monaco-action-bar .action-item.menu-entry.text-only .action-label{color:var(--vscode-descriptionForeground);border-radius:2px;overflow:hidden}.monaco-action-bar .action-item.menu-entry.text-only.use-comma:not(:last-of-type) .action-label:after{content:", "}.monaco-action-bar .action-item.menu-entry.text-only+.action-item:not(.text-only)>.monaco-dropdown .action-label{color:var(--vscode-descriptionForeground)}.monaco-dropdown-with-default{border-radius:5px;flex-direction:row;display:flex!important}.monaco-dropdown-with-default>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-default>.action-container.menu-entry>.action-label.icon{background-position:50%;background-repeat:no-repeat;background-size:16px;width:16px;height:16px}.monaco-dropdown-with-default:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{margin-left:-3px;padding-left:0;padding-right:0;font-size:12px;line-height:16px}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{background-position:50%;background-repeat:no-repeat;background-size:16px;display:block}.monaco-toolbar{height:100%}.monaco-toolbar .toolbar-toggle-more{padding:0;display:inline-block}:root{--vscode-sash-size:4px;--vscode-sash-hover-size:4px}.monaco-sash{z-index:35;touch-action:none;position:absolute}.monaco-sash.disabled{pointer-events:none}.monaco-sash.mac.vertical{cursor:col-resize}.monaco-sash.vertical.minimum{cursor:e-resize}.monaco-sash.vertical.maximum{cursor:w-resize}.monaco-sash.mac.horizontal{cursor:row-resize}.monaco-sash.horizontal.minimum{cursor:s-resize}.monaco-sash.horizontal.maximum{cursor:n-resize}.monaco-sash.disabled{cursor:default!important;pointer-events:none!important}.monaco-sash.vertical{cursor:ew-resize;width:var(--vscode-sash-size);height:100%;top:0}.monaco-sash.horizontal{cursor:ns-resize;width:100%;height:var(--vscode-sash-size);left:0}.monaco-sash:not(.disabled)>.orthogonal-drag-handle{content:" ";height:calc(var(--vscode-sash-size)*2);width:calc(var(--vscode-sash-size)*2);z-index:100;cursor:all-scroll;display:block;position:absolute}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.start,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.end{cursor:nwse-resize}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.end,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.start{cursor:nesw-resize}.monaco-sash.vertical>.orthogonal-drag-handle.start{left:calc(var(--vscode-sash-size)*-.5);top:calc(var(--vscode-sash-size)*-1)}.monaco-sash.vertical>.orthogonal-drag-handle.end{left:calc(var(--vscode-sash-size)*-.5);bottom:calc(var(--vscode-sash-size)*-1)}.monaco-sash.horizontal>.orthogonal-drag-handle.start{top:calc(var(--vscode-sash-size)*-.5);left:calc(var(--vscode-sash-size)*-1)}.monaco-sash.horizontal>.orthogonal-drag-handle.end{top:calc(var(--vscode-sash-size)*-.5);right:calc(var(--vscode-sash-size)*-1)}.monaco-sash:before{content:"";pointer-events:none;background:0 0;width:100%;height:100%;position:absolute}.monaco-workbench:not(.reduce-motion) .monaco-sash:before{transition:background-color .1s ease-out}.monaco-sash.hover:before,.monaco-sash.active:before{background:var(--vscode-sash-hoverBorder)}.monaco-sash.vertical:before{width:var(--vscode-sash-hover-size);left:calc(50% - (var(--vscode-sash-hover-size)/2))}.monaco-sash.horizontal:before{height:var(--vscode-sash-hover-size);top:calc(50% - (var(--vscode-sash-hover-size)/2))}.pointer-events-disabled{pointer-events:none!important}.monaco-sash.debug{background:#0ff}.monaco-sash.debug.disabled{background:#0ff3}.monaco-sash.debug:not(.disabled)>.orthogonal-drag-handle{background:red}.monaco-hover{cursor:default;-webkit-user-select:text;user-select:text;box-sizing:border-box;white-space:var(--vscode-hover-whiteSpace,normal);line-height:1.5em;animation:.1s linear fadein;position:absolute;overflow:hidden}.monaco-hover.hidden{display:none}.monaco-hover a:hover:not(.disabled){cursor:pointer}.monaco-hover .hover-contents:not(.html-hover-contents){padding:4px 8px}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents){max-width:var(--vscode-hover-maxWidth,500px);word-wrap:break-word}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents) hr{min-width:100%}.monaco-hover p,.monaco-hover .code,.monaco-hover ul,.monaco-hover h1,.monaco-hover h2,.monaco-hover h3,.monaco-hover h4,.monaco-hover h5,.monaco-hover h6{margin:8px 0}.monaco-hover h1,.monaco-hover h2,.monaco-hover h3,.monaco-hover h4,.monaco-hover h5,.monaco-hover h6{line-height:1.1}.monaco-hover code{font-family:var(--monaco-monospace-font)}.monaco-hover hr{box-sizing:border-box;border-left:0;border-right:0;height:1px;margin:4px -8px -4px}.monaco-hover p:first-child,.monaco-hover .code:first-child,.monaco-hover ul:first-child{margin-top:0}.monaco-hover p:last-child,.monaco-hover .code:last-child,.monaco-hover ul:last-child{margin-bottom:0}.monaco-hover ul,.monaco-hover ol{padding-left:20px}.monaco-hover li>p{margin-bottom:0}.monaco-hover li>ul{margin-top:0}.monaco-hover code{border-radius:3px;padding:0 .4em}.monaco-hover .monaco-tokenized-source{white-space:var(--vscode-hover-sourceWhiteSpace,pre-wrap)}.monaco-hover .hover-row.status-bar{font-size:12px;line-height:22px}.monaco-hover .hover-row.status-bar .info{padding:0 8px;font-style:italic}.monaco-hover .hover-row.status-bar .actions{width:100%;padding:0 8px;display:flex}.monaco-hover .hover-row.status-bar .actions .action-container{cursor:pointer;margin-right:16px}.monaco-hover .hover-row.status-bar .actions .action-container .action .icon{padding-right:4px}.monaco-hover .hover-row.status-bar .actions .action-container a{color:var(--vscode-textLink-foreground);-webkit-text-decoration:var(--text-link-decoration);-webkit-text-decoration:var(--text-link-decoration);text-decoration:var(--text-link-decoration)}.monaco-hover .markdown-hover .hover-contents .codicon{color:inherit;font-size:inherit;vertical-align:middle}.monaco-hover .hover-contents a.code-link:hover,.monaco-hover .hover-contents a.code-link{color:inherit}.monaco-hover .hover-contents a.code-link:before{content:"("}.monaco-hover .hover-contents a.code-link:after{content:")"}.monaco-hover .hover-contents a.code-link>span{text-underline-position:under;color:var(--vscode-textLink-foreground);border-bottom:1px solid #0000;-webkit-text-decoration:underline;text-decoration:underline}.monaco-hover .hover-contents a.code-link>span:hover{color:var(--vscode-textLink-activeForeground)}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) span{margin-bottom:4px;display:inline-block}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) span.codicon{margin-bottom:2px}.monaco-hover-content .action-container a{-webkit-user-select:none;user-select:none}.monaco-hover-content .action-container.disabled{pointer-events:none;opacity:.4;cursor:default}.monaco-editor .peekview-widget .head{box-sizing:border-box;flex-wrap:nowrap;justify-content:space-between;display:flex}.monaco-editor .peekview-widget .head .peekview-title{text-overflow:ellipsis;align-items:baseline;min-width:0;margin-left:20px;font-size:13px;display:flex;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title.clickable{cursor:pointer}.monaco-editor .peekview-widget .head .peekview-title .dirname:not(:empty){margin-left:.5em;font-size:.9em}.monaco-editor .peekview-widget .head .peekview-title .meta{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title .dirname,.monaco-editor .peekview-widget .head .peekview-title .filename{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title .meta:not(:empty):before{content:"-";padding:0 .3em}.monaco-editor .peekview-widget .head .peekview-actions{text-align:right;flex:1;padding-right:2px}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar{display:inline-block}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar,.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar>.actions-container{height:100%}.monaco-editor .peekview-widget>.body{border-top:1px solid;position:relative}.monaco-editor .peekview-widget .head .peekview-title .codicon{align-self:center;margin-right:4px}.monaco-editor .peekview-widget .monaco-list .monaco-list-row.focused .codicon{color:inherit!important}.monaco-editor .zone-widget{z-index:10;position:absolute}.monaco-editor .zone-widget .zone-widget-container{border-top-style:solid;border-top-width:0;border-bottom-style:solid;border-bottom-width:0;position:relative}.monaco-split-view2{width:100%;height:100%;position:relative}.monaco-split-view2>.sash-container{pointer-events:none;width:100%;height:100%;position:absolute}.monaco-split-view2>.sash-container>.monaco-sash{pointer-events:initial}.monaco-split-view2>.monaco-scrollable-element{width:100%;height:100%}.monaco-split-view2>.monaco-scrollable-element>.split-view-container{white-space:nowrap;width:100%;height:100%;position:relative}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view{white-space:initial;position:absolute}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view:not(.visible){display:none}.monaco-split-view2.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view{width:100%}.monaco-split-view2.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view{height:100%}.monaco-split-view2.separator-border>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{content:" ";z-index:5;pointer-events:none;background-color:var(--separator-border);position:absolute;top:0;left:0}.monaco-split-view2.separator-border.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{width:1px;height:100%}.monaco-split-view2.separator-border.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{width:100%;height:1px}.monaco-table{white-space:nowrap;flex-direction:column;width:100%;height:100%;display:flex;position:relative;overflow:hidden}.monaco-table>.monaco-split-view2{border-bottom:1px solid #0000}.monaco-table>.monaco-list{flex:1}.monaco-table-tr{height:100%;display:flex}.monaco-table-th{text-overflow:ellipsis;width:100%;height:100%;font-weight:700;overflow:hidden}.monaco-table-th,.monaco-table-td{box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;flex-shrink:0;overflow:hidden}.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{content:"";left:calc(var(--vscode-sash-size)/2);border-left:1px solid #0000;width:0;position:absolute}.monaco-workbench:not(.reduce-motion) .monaco-table>.monaco-split-view2,.monaco-workbench:not(.reduce-motion) .monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{transition:border-color .2s ease-out}.monaco-custom-toggle{float:left;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;user-select:none;border:1px solid #0000;border-radius:3px;width:20px;height:20px;margin-left:2px;padding:1px;overflow:hidden}.monaco-custom-toggle:hover{background-color:var(--vscode-inputOption-hoverBackground)}.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{border:1px dashed var(--vscode-focusBorder)}.hc-black .monaco-custom-toggle,.hc-light .monaco-custom-toggle,.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{background:0 0}.monaco-custom-toggle.monaco-checkbox{opacity:1;border:1px solid #0000;border-radius:3px;width:18px;height:18px;margin-left:0;margin-right:9px;padding:0;background-size:16px!important}.monaco-action-bar .checkbox-action-item{border-radius:2px;align-items:center;padding-right:2px;display:flex}.monaco-action-bar .checkbox-action-item:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-action-bar .checkbox-action-item>.monaco-custom-toggle.monaco-checkbox{margin-right:4px}.monaco-action-bar .checkbox-action-item>.checkbox-label{font-size:12px}.monaco-custom-toggle.monaco-checkbox:not(.checked):before{visibility:hidden}.monaco-inputbox{box-sizing:border-box;font-size:inherit;border-radius:2px;padding:0;display:block;position:relative}.monaco-inputbox>.ibwrapper>.input,.monaco-inputbox>.ibwrapper>.mirror{padding:4px 6px}.monaco-inputbox>.ibwrapper{width:100%;height:100%;position:relative}.monaco-inputbox>.ibwrapper>.input{box-sizing:border-box;width:100%;height:100%;line-height:inherit;font-family:inherit;font-size:inherit;resize:none;color:inherit;border:none;display:inline-block}.monaco-inputbox>.ibwrapper>input{text-overflow:ellipsis}.monaco-inputbox>.ibwrapper>textarea.input{scrollbar-width:none;outline:none;display:block}.monaco-inputbox>.ibwrapper>textarea.input::-webkit-scrollbar{display:none}.monaco-inputbox>.ibwrapper>textarea.input.empty{white-space:nowrap}.monaco-inputbox>.ibwrapper>.mirror{box-sizing:border-box;white-space:pre-wrap;visibility:hidden;word-wrap:break-word;width:100%;display:inline-block;position:absolute;top:0;left:0}.monaco-inputbox-container{text-align:right}.monaco-inputbox-container .monaco-inputbox-message{text-align:left;box-sizing:border-box;word-wrap:break-word;width:100%;margin-top:-1px;padding:.4em;font-size:12px;line-height:17px;display:inline-block;overflow:hidden}.monaco-inputbox .monaco-action-bar{position:absolute;top:4px;right:2px}.monaco-inputbox .monaco-action-bar .action-item{margin-left:2px}.monaco-inputbox .monaco-action-bar .action-item .codicon{background-repeat:no-repeat;width:16px;height:16px}.monaco-findInput{position:relative}.monaco-findInput .monaco-inputbox{width:100%;font-size:13px}.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.vs .monaco-findInput.disabled{background-color:#e1e1e1}.vs-dark .monaco-findInput.disabled{background-color:#333}.monaco-findInput.highlight-0 .controls,.hc-light .monaco-findInput.highlight-0 .controls{animation:.1s linear monaco-findInput-highlight-0}.monaco-findInput.highlight-1 .controls,.hc-light .monaco-findInput.highlight-1 .controls{animation:.1s linear monaco-findInput-highlight-1}.hc-black .monaco-findInput.highlight-0 .controls,.vs-dark .monaco-findInput.highlight-0 .controls{animation:.1s linear monaco-findInput-highlight-dark-0}.hc-black .monaco-findInput.highlight-1 .controls,.vs-dark .monaco-findInput.highlight-1 .controls{animation:.1s linear monaco-findInput-highlight-dark-1}@keyframes monaco-findInput-highlight-0{0%{background:#fdff00cc}to{background:0 0}}@keyframes monaco-findInput-highlight-1{0%{background:#fdff00cc}99%{background:0 0}}@keyframes monaco-findInput-highlight-dark-0{0%{background:#ffffff70}to{background:0 0}}@keyframes monaco-findInput-highlight-dark-1{0%{background:#ffffff70}99%{background:0 0}}.monaco-tl-row{align-items:center;height:100%;display:flex;position:relative}.monaco-tl-row.disabled{cursor:default}.monaco-tl-indent{pointer-events:none;height:100%;position:absolute;top:0;left:16px}.hide-arrows .monaco-tl-indent{left:12px}.monaco-tl-indent>.indent-guide{box-sizing:border-box;border-left:1px solid #0000;height:100%;display:inline-block}.monaco-workbench:not(.reduce-motion) .monaco-tl-indent>.indent-guide{transition:border-color .1s linear}.monaco-tl-twistie,.monaco-tl-contents{height:100%}.monaco-tl-twistie{text-align:right;flex-shrink:0;justify-content:center;align-items:center;width:16px;padding-right:6px;font-size:10px;transform:translate(3px);display:flex!important}.monaco-tl-contents{flex:1;overflow:hidden}.monaco-tl-twistie:before{border-radius:20px}.monaco-tl-twistie.collapsed:before{transform:rotate(-90deg)}.monaco-tl-twistie.codicon-tree-item-loading:before{animation:1.25s steps(30,end) infinite codicon-spin}.monaco-tree-type-filter{z-index:100;border:1px solid var(--vscode-widget-border);border-bottom-right-radius:4px;border-bottom-left-radius:4px;max-width:200px;margin:0 6px;padding:3px;display:flex;position:absolute;top:0}.monaco-workbench:not(.reduce-motion) .monaco-tree-type-filter{transition:top .3s}.monaco-tree-type-filter.disabled{top:-40px!important}.monaco-tree-type-filter-grab{cursor:grab;justify-content:center;align-items:center;margin-right:2px;display:flex!important}.monaco-tree-type-filter-grab.grabbing{cursor:grabbing}.monaco-tree-type-filter-input{flex:1}.monaco-tree-type-filter-input .monaco-inputbox{height:23px}.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.input,.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.mirror{padding:2px 4px}.monaco-tree-type-filter-input .monaco-findInput>.controls{top:2px}.monaco-tree-type-filter-actionbar{margin-left:4px}.monaco-tree-type-filter-actionbar .monaco-action-bar .action-label{padding:2px}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container{z-index:13;background-color:var(--vscode-sideBar-background);width:100%;height:0;position:absolute;top:0;left:0}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row.monaco-list-row{background-color:var(--vscode-sideBar-background);width:100%;position:absolute;overflow:hidden;opacity:1!important}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row:hover{cursor:pointer;background-color:var(--vscode-list-hoverBackground)!important}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container.empty,.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container.empty .monaco-tree-sticky-container-shadow{display:none}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-container-shadow{width:100%;height:0;position:absolute;bottom:-3px;left:0}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container[tabindex="0"]:focus{outline:none}.monaco-editor .zone-widget .zone-widget-container.reference-zone-widget{border-top-width:1px;border-bottom-width:1px}.monaco-editor .reference-zone-widget .inline{vertical-align:top;display:inline-block}.monaco-editor .reference-zone-widget .messages{text-align:center;width:100%;height:100%;padding:3em 0}.monaco-editor .reference-zone-widget .ref-tree{background-color:var(--vscode-peekViewResult-background);color:var(--vscode-peekViewResult-lineForeground);line-height:23px}.monaco-editor .reference-zone-widget .ref-tree .reference{text-overflow:ellipsis;overflow:hidden}.monaco-editor .reference-zone-widget .ref-tree .reference-file{width:100%;height:100%;color:var(--vscode-peekViewResult-fileForeground);display:inline-flex}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .selected .reference-file{color:inherit!important}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows>.monaco-list-row.selected:not(.highlighted){background-color:var(--vscode-peekViewResult-selectionBackground);color:var(--vscode-peekViewResult-selectionForeground)!important}.monaco-editor .reference-zone-widget .ref-tree .reference-file .count{margin-left:auto;margin-right:12px}.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight{background-color:var(--vscode-peekViewResult-matchHighlightBackground)}.monaco-editor .reference-zone-widget .preview .reference-decoration{background-color:var(--vscode-peekViewEditor-matchHighlightBackground);border:2px solid var(--vscode-peekViewEditor-matchHighlightBorder);box-sizing:border-box}.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background,.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input{background-color:var(--vscode-peekViewEditor-background)}.monaco-editor .reference-zone-widget .preview .monaco-editor .margin{background-color:var(--vscode-peekViewEditorGutter-background)}.monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file,.monaco-editor.hc-light .reference-zone-widget .ref-tree .reference-file{font-weight:700}.monaco-editor.hc-black .reference-zone-widget .ref-tree .referenceMatch .highlight,.monaco-editor.hc-light .reference-zone-widget .ref-tree .referenceMatch .highlight{border:1px dotted var(--vscode-contrastActiveBorder,transparent);box-sizing:border-box}.monaco-count-badge{text-align:center;box-sizing:border-box;border-radius:11px;min-width:18px;min-height:18px;padding:3px 6px;font-size:11px;font-weight:400;line-height:11px;display:inline-block}.monaco-count-badge.long{border-radius:2px;min-height:auto;padding:2px 3px;line-height:normal}.monaco-icon-label{text-overflow:ellipsis;display:flex;overflow:hidden}.monaco-icon-label:before{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;background-position:0;background-repeat:no-repeat;background-size:16px;flex-shrink:0;width:16px;height:22px;padding-right:6px;display:inline-block;line-height:inherit!important}.monaco-icon-label-iconpath{width:16px;height:16px;margin-top:2px;padding-left:2px;display:flex}.monaco-icon-label-container.disabled{color:var(--vscode-disabledForeground)}.monaco-icon-label>.monaco-icon-label-container{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{color:inherit;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name>.label-separator{opacity:.5;margin:0 2px}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-suffix-container>.label-suffix{opacity:.7;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.7;white-space:pre;margin-left:.5em;font-size:.9em}.monaco-icon-label.nowrap>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{white-space:nowrap}.vs .monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.95}.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{font-style:italic}.monaco-icon-label.deprecated{opacity:.66;-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-icon-label.italic:after{font-style:italic}.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-icon-label:after{opacity:.75;text-align:center;margin:auto 16px 0 5px;font-size:90%;font-weight:600}.monaco-list:focus .selected .monaco-icon-label,.monaco-list:focus .selected .monaco-icon-label:after{color:inherit!important}.monaco-list-row.focused.selected .label-description,.monaco-list-row.selected .label-description{opacity:.8}.monaco-editor .hoverHighlight{background-color:var(--vscode-editor-hoverHighlightBackground)}.monaco-editor .monaco-hover-content{box-sizing:border-box;padding-bottom:2px;padding-right:2px}.monaco-editor .monaco-hover{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);border-radius:3px}.monaco-editor .monaco-hover a{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-hover a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .monaco-hover .hover-row{display:flex}.monaco-editor .monaco-hover .hover-row .hover-row-contents{flex-direction:column;min-width:0;display:flex}.monaco-editor .monaco-hover .hover-row .verbosity-actions{border-right:1px solid var(--vscode-editorHoverWidget-border);flex-direction:column;justify-content:end;padding-left:5px;padding-right:5px;display:flex}.monaco-editor .monaco-hover .hover-row .verbosity-actions .codicon{cursor:pointer;font-size:11px}.monaco-editor .monaco-hover .hover-row .verbosity-actions .codicon.enabled{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-hover .hover-row .verbosity-actions .codicon.disabled{opacity:.6}.monaco-editor .monaco-hover .hover-row .actions{background-color:var(--vscode-editorHoverWidget-statusBarBackground)}.monaco-editor .monaco-hover code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .diff-hidden-lines-widget{width:100%}.monaco-editor .diff-hidden-lines{height:0;font-size:13px;line-height:14px;transform:translateY(-10px)}.monaco-editor .diff-hidden-lines:not(.dragging) .top:hover,.monaco-editor .diff-hidden-lines:not(.dragging) .bottom:hover,.monaco-editor .diff-hidden-lines .top.dragging,.monaco-editor .diff-hidden-lines .bottom.dragging{background-color:var(--vscode-focusBorder)}.monaco-editor .diff-hidden-lines .top,.monaco-editor .diff-hidden-lines .bottom{background-color:#0000;background-clip:padding-box;border-top:4px solid #0000;border-bottom:2px solid #0000;height:4px;transition:background-color .1s ease-out}.monaco-editor.draggingUnchangedRegion.canMoveTop:not(.canMoveBottom) *,.monaco-editor .diff-hidden-lines .top.canMoveTop:not(.canMoveBottom),.monaco-editor .diff-hidden-lines .bottom.canMoveTop:not(.canMoveBottom){cursor:n-resize!important}.monaco-editor.draggingUnchangedRegion:not(.canMoveTop).canMoveBottom *,.monaco-editor .diff-hidden-lines .top:not(.canMoveTop).canMoveBottom,.monaco-editor .diff-hidden-lines .bottom:not(.canMoveTop).canMoveBottom{cursor:s-resize!important}.monaco-editor.draggingUnchangedRegion.canMoveTop.canMoveBottom *,.monaco-editor .diff-hidden-lines .top.canMoveTop.canMoveBottom,.monaco-editor .diff-hidden-lines .bottom.canMoveTop.canMoveBottom{cursor:ns-resize!important}.monaco-editor .diff-hidden-lines .top{transform:translateY(4px)}.monaco-editor .diff-hidden-lines .bottom{transform:translateY(-6px)}.monaco-editor .diff-unchanged-lines{background:var(--vscode-diffEditor-unchangedCodeBackground)}.monaco-editor .noModificationsOverlay{z-index:1;background:var(--vscode-editor-background);justify-content:center;align-items:center;display:flex}.monaco-editor .diff-hidden-lines .center{background:var(--vscode-diffEditor-unchangedRegionBackground);color:var(--vscode-diffEditor-unchangedRegionForeground);text-overflow:ellipsis;white-space:nowrap;height:24px;box-shadow:inset 0 -5px 5px -7px var(--vscode-diffEditor-unchangedRegionShadow),inset 0 5px 5px -7px var(--vscode-diffEditor-unchangedRegionShadow);display:block;overflow:hidden}.monaco-editor .diff-hidden-lines .center span.codicon{vertical-align:middle}.monaco-editor .diff-hidden-lines .center a:hover .codicon{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .diff-hidden-lines div.breadcrumb-item{cursor:pointer}.monaco-editor .diff-hidden-lines div.breadcrumb-item:hover{color:var(--vscode-editorLink-activeForeground)}.monaco-editor .movedOriginal,.monaco-editor .movedModified{border:2px solid var(--vscode-diffEditor-move-border)}.monaco-editor .movedOriginal.currentMove,.monaco-editor .movedModified.currentMove{border:2px solid var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines path.currentMove{stroke:var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines path{pointer-events:visiblestroke}.monaco-diff-editor .moved-blocks-lines .arrow{fill:var(--vscode-diffEditor-move-border)}.monaco-diff-editor .moved-blocks-lines .arrow.currentMove{fill:var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines .arrow-rectangle{fill:var(--vscode-editor-background)}.monaco-diff-editor .moved-blocks-lines{pointer-events:none;position:absolute}.monaco-diff-editor .moved-blocks-lines path{fill:none;stroke:var(--vscode-diffEditor-move-border);stroke-width:2px}.monaco-editor .char-delete.diff-range-empty{border-left:solid var(--vscode-diffEditor-removedTextBackground)3px;margin-left:-1px}.monaco-editor .char-insert.diff-range-empty{border-left:solid var(--vscode-diffEditor-insertedTextBackground)3px}.monaco-editor .fold-unchanged{cursor:pointer}.monaco-diff-editor .diff-moved-code-block{justify-content:flex-end;margin-top:-4px;display:flex}.monaco-diff-editor .diff-moved-code-block .action-bar .action-label.codicon{width:12px;height:12px;font-size:12px}.monaco-diff-editor .diffOverview{z-index:9}.monaco-diff-editor .diffOverview .diffViewport{z-index:10}.monaco-diff-editor.vs .diffOverview{background:#00000008}.monaco-diff-editor.vs-dark .diffOverview{background:#ffffff03}.monaco-scrollable-element.modified-in-monaco-diff-editor.vs .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.vs-dark .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-black .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-light .scrollbar{background:0 0}.monaco-scrollable-element.modified-in-monaco-diff-editor .slider{z-index:10}.modified-in-monaco-diff-editor .slider.active{background:#ababab66}.modified-in-monaco-diff-editor.hc-black .slider.active,.modified-in-monaco-diff-editor.hc-light .slider.active{background:0 0}.monaco-editor .insert-sign,.monaco-diff-editor .insert-sign,.monaco-editor .delete-sign,.monaco-diff-editor .delete-sign{align-items:center;opacity:.7!important;font-size:11px!important;display:flex!important}.monaco-editor.hc-black .insert-sign,.monaco-diff-editor.hc-black .insert-sign,.monaco-editor.hc-black .delete-sign,.monaco-diff-editor.hc-black .delete-sign,.monaco-editor.hc-light .insert-sign,.monaco-diff-editor.hc-light .insert-sign,.monaco-editor.hc-light .delete-sign,.monaco-diff-editor.hc-light .delete-sign{opacity:1}.monaco-editor .inline-deleted-margin-view-zone,.monaco-editor .inline-added-margin-view-zone{text-align:right}.monaco-editor .arrow-revert-change{z-index:10;position:absolute}.monaco-editor .arrow-revert-change:hover{cursor:pointer}.monaco-editor .view-zones .view-lines .view-line span{display:inline-block}.monaco-editor .margin-view-zones .lightbulb-glyph:hover{cursor:pointer}.monaco-editor .char-insert,.monaco-diff-editor .char-insert{background-color:var(--vscode-diffEditor-insertedTextBackground)}.monaco-editor .line-insert,.monaco-diff-editor .line-insert{background-color:var(--vscode-diffEditor-insertedLineBackground,var(--vscode-diffEditor-insertedTextBackground))}.monaco-editor .line-insert,.monaco-editor .char-insert{box-sizing:border-box;border:1px solid var(--vscode-diffEditor-insertedTextBorder)}.monaco-editor.hc-black .line-insert,.monaco-editor.hc-light .line-insert,.monaco-editor.hc-black .char-insert,.monaco-editor.hc-light .char-insert{border-style:dashed}.monaco-editor .line-delete,.monaco-editor .char-delete{box-sizing:border-box;border:1px solid var(--vscode-diffEditor-removedTextBorder)}.monaco-editor.hc-black .line-delete,.monaco-editor.hc-light .line-delete,.monaco-editor.hc-black .char-delete,.monaco-editor.hc-light .char-delete{border-style:dashed}.monaco-editor .inline-added-margin-view-zone,.monaco-editor .gutter-insert,.monaco-diff-editor .gutter-insert{background-color:var(--vscode-diffEditorGutter-insertedLineBackground,var(--vscode-diffEditor-insertedLineBackground),var(--vscode-diffEditor-insertedTextBackground))}.monaco-editor .char-delete,.monaco-diff-editor .char-delete,.monaco-editor .inline-deleted-text{background-color:var(--vscode-diffEditor-removedTextBackground)}.monaco-editor .inline-deleted-text{-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-editor .line-delete,.monaco-diff-editor .line-delete{background-color:var(--vscode-diffEditor-removedLineBackground,var(--vscode-diffEditor-removedTextBackground))}.monaco-editor .inline-deleted-margin-view-zone,.monaco-editor .gutter-delete,.monaco-diff-editor .gutter-delete{background-color:var(--vscode-diffEditorGutter-removedLineBackground,var(--vscode-diffEditor-removedLineBackground),var(--vscode-diffEditor-removedTextBackground))}.monaco-diff-editor.side-by-side .editor.modified{box-shadow:-6px 0 5px -5px var(--vscode-scrollbar-shadow);border-left:1px solid var(--vscode-diffEditor-border)}.monaco-diff-editor.side-by-side .editor.original{box-shadow:6px 0 5px -5px var(--vscode-scrollbar-shadow);border-right:1px solid var(--vscode-diffEditor-border)}.monaco-diff-editor .diffViewport{background:var(--vscode-scrollbarSlider-background)}.monaco-diff-editor .diffViewport:hover{background:var(--vscode-scrollbarSlider-hoverBackground)}.monaco-diff-editor .diffViewport:active{background:var(--vscode-scrollbarSlider-activeBackground)}.monaco-editor .diagonal-fill{background-image:linear-gradient(-45deg,var(--vscode-diffEditor-diagonalFill)12.5%,#0000 12.5%,#0000 50%,var(--vscode-diffEditor-diagonalFill)50%,var(--vscode-diffEditor-diagonalFill)62.5%,#0000 62.5%,#0000 100%);background-size:8px 8px}.monaco-diff-editor .gutter{flex-grow:0;flex-shrink:0;position:relative;overflow:hidden}:is(.monaco-diff-editor .gutter)>div{position:absolute}:is(.monaco-diff-editor .gutter) .gutterItem{opacity:0;transition:opacity .7s}.showAlways:is(:is(.monaco-diff-editor .gutter) .gutterItem){opacity:1;transition:none}.noTransition:is(:is(.monaco-diff-editor .gutter) .gutterItem){transition:none}:is(.monaco-diff-editor .gutter):hover .gutterItem{opacity:1;transition:opacity .1s ease-in-out}:is(:is(.monaco-diff-editor .gutter) .gutterItem) .background{border-left:2px var(--vscode-menu-border)solid;width:1px;height:100%;position:absolute;left:50%}:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons{justify-content:center;align-items:center;width:100%;display:flex;position:absolute}:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar{height:fit-content}:is(:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar) .monaco-action-bar{line-height:1}:is(:is(:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar) .monaco-action-bar) .actions-container{background:var(--vscode-editorGutter-commentRangeForeground);border-radius:4px;width:fit-content}:is(:is(:is(:is(:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar) .monaco-action-bar) .actions-container) .action-item):hover{background:var(--vscode-toolbar-hoverBackground)}:is(:is(:is(:is(:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar) .monaco-action-bar) .actions-container) .action-item) .action-label{padding:1px 2px}.monaco-diff-editor .diff-hidden-lines-compact{height:11px;display:flex}:is(.monaco-diff-editor .diff-hidden-lines-compact) .line-left,:is(.monaco-diff-editor .diff-hidden-lines-compact) .line-right{border-top:1px solid;border-color:var(--vscode-editorCodeLens-foreground);opacity:.5;width:100%;height:1px;margin:auto}:is(.monaco-diff-editor .diff-hidden-lines-compact) .line-left{width:20px}:is(.monaco-diff-editor .diff-hidden-lines-compact) .text{color:var(--vscode-editorCodeLens-foreground);text-wrap:nowrap;margin:0 4px;font-size:11px;line-height:11px}.monaco-component.diff-review{-webkit-user-select:none;user-select:none;z-index:99}.monaco-diff-editor .diff-review{position:absolute}.monaco-component.diff-review .diff-review-line-number{text-align:right;color:var(--vscode-editorLineNumber-foreground);display:inline-block}.monaco-component.diff-review .diff-review-summary{padding-left:10px}.monaco-component.diff-review .diff-review-shadow{box-shadow:var(--vscode-scrollbar-shadow)0 -6px 6px -6px inset;position:absolute}.monaco-component.diff-review .diff-review-row{white-space:pre}.monaco-component.diff-review .diff-review-table{min-width:100%;display:table}.monaco-component.diff-review .diff-review-row{width:100%;display:table-row}.monaco-component.diff-review .diff-review-spacer{vertical-align:middle;width:10px;display:inline-block}.monaco-component.diff-review .diff-review-spacer>.codicon{font-size:9px!important}.monaco-component.diff-review .diff-review-actions{z-index:100;display:inline-block;position:absolute;top:2px;right:10px}.monaco-component.diff-review .diff-review-actions .action-label{width:16px;height:16px;margin:2px 0}.monaco-component.diff-review .revertButton{cursor:pointer}.monaco-editor.vs .dnd-target,.monaco-editor.hc-light .dnd-target{color:#fff;border-right:2px dotted #000}.monaco-editor.vs-dark .dnd-target{color:#51504f;border-right:2px dotted #aeafad}.monaco-editor.hc-black .dnd-target{color:#000;border-right:2px dotted #fff}.monaco-editor.mouse-default .view-lines,.monaco-editor.vs-dark.mac.mouse-default .view-lines,.monaco-editor.hc-black.mac.mouse-default .view-lines,.monaco-editor.hc-light.mac.mouse-default .view-lines{cursor:default}.monaco-editor.mouse-copy .view-lines,.monaco-editor.vs-dark.mac.mouse-copy .view-lines,.monaco-editor.hc-black.mac.mouse-copy .view-lines,.monaco-editor.hc-light.mac.mouse-copy .view-lines{cursor:copy}.monaco-editor .findOptionsWidget{background-color:var(--vscode-editorWidget-background);color:var(--vscode-editorWidget-foreground);box-shadow:0 0 8px 2px var(--vscode-widget-shadow);border:2px solid var(--vscode-contrastBorder)}.monaco-editor .find-widget{z-index:35;box-sizing:border-box;height:33px;box-shadow:0 0 8px 2px var(--vscode-widget-shadow);color:var(--vscode-editorWidget-foreground);border-left:1px solid var(--vscode-widget-border);border-right:1px solid var(--vscode-widget-border);border-bottom:1px solid var(--vscode-widget-border);background-color:var(--vscode-editorWidget-background);border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:0 4px;line-height:19px;transition:transform .2s linear;position:absolute;overflow:hidden;transform:translateY(calc(-100% - 10px))}.monaco-workbench.reduce-motion .monaco-editor .find-widget{transition:transform linear}.monaco-editor .find-widget textarea{margin:0}.monaco-editor .find-widget.hiddenEditor{display:none}.monaco-editor .find-widget.replaceToggled>.replace-part{display:flex}.monaco-editor .find-widget.visible{transform:translateY(0)}.monaco-editor .find-widget .monaco-inputbox.synthetic-focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px;outline-color:var(--vscode-focusBorder)}.monaco-editor .find-widget .monaco-inputbox .input{background-color:#0000;min-height:0}.monaco-editor .find-widget .monaco-findInput .input{font-size:13px}.monaco-editor .find-widget>.find-part,.monaco-editor .find-widget>.replace-part{margin:3px 25px 0 17px;font-size:12px;display:flex}.monaco-editor .find-widget>.find-part .monaco-inputbox,.monaco-editor .find-widget>.replace-part .monaco-inputbox{min-height:25px}.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-right:22px}.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.mirror,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-top:2px;padding-bottom:2px}.monaco-editor .find-widget>.find-part .find-actions,.monaco-editor .find-widget>.replace-part .replace-actions{align-items:center;height:25px;display:flex}.monaco-editor .find-widget .monaco-findInput{vertical-align:middle;flex:1;display:flex}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element{width:100%}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element .scrollbar.vertical{opacity:0}.monaco-editor .find-widget .matchesCount{flex:initial;vertical-align:middle;box-sizing:border-box;text-align:center;height:25px;margin:0 0 0 3px;padding:2px 0 0 2px;line-height:23px;display:flex}.monaco-editor .find-widget .button{flex:initial;cursor:pointer;background-position:50%;background-repeat:no-repeat;border-radius:5px;justify-content:center;align-items:center;width:16px;height:16px;margin-left:3px;padding:3px;display:flex}.monaco-editor .find-widget .codicon-find-selection{border-radius:5px;width:22px;height:22px;padding:3px}.monaco-editor .find-widget .button.left{margin-left:0;margin-right:3px}.monaco-editor .find-widget .button.wide{width:auto;padding:1px 6px;top:-1px}.monaco-editor .find-widget .button.toggle{box-sizing:border-box;border-radius:0;width:18px;height:100%;position:absolute;top:0;left:3px}.monaco-editor .find-widget .button.toggle.disabled{display:none}.monaco-editor .find-widget .disabled{color:var(--vscode-disabledForeground);cursor:default}.monaco-editor .find-widget>.replace-part{display:none}.monaco-editor .find-widget>.replace-part>.monaco-findInput{vertical-align:middle;flex:none;display:flex;position:relative}.monaco-editor .find-widget>.replace-part>.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.monaco-editor .find-widget.reduced-find-widget .matchesCount{display:none}.monaco-editor .find-widget.narrow-find-widget{max-width:257px!important}.monaco-editor .find-widget.collapsed-find-widget{max-width:170px!important}.monaco-editor .find-widget.collapsed-find-widget .button.previous,.monaco-editor .find-widget.collapsed-find-widget .button.next,.monaco-editor .find-widget.collapsed-find-widget .button.replace,.monaco-editor .find-widget.collapsed-find-widget .button.replace-all,.monaco-editor .find-widget.collapsed-find-widget>.find-part .monaco-findInput .controls{display:none}.monaco-editor .find-widget.no-results .matchesCount{color:var(--vscode-errorForeground)}.monaco-editor .findMatch{animation-duration:0;background-color:var(--vscode-editor-findMatchHighlightBackground);animation-name:inherit!important}.monaco-editor .currentFindMatch{background-color:var(--vscode-editor-findMatchBackground);border:2px solid var(--vscode-editor-findMatchBorder);box-sizing:border-box;padding:1px}.monaco-editor .findScope{background-color:var(--vscode-editor-findRangeHighlightBackground)}.monaco-editor .find-widget .monaco-sash{background-color:var(--vscode-editorWidget-resizeBorder,var(--vscode-editorWidget-border));left:0!important}.monaco-editor.hc-black .find-widget .button:before{position:relative;top:1px;left:2px}.monaco-editor .find-widget .button:not(.disabled):hover,.monaco-editor .find-widget .codicon-find-selection:hover{background-color:var(--vscode-toolbar-hoverBackground)!important}.monaco-editor.currentFindMatch{background-color:var(--vscode-editor-findMatchBackground)}.monaco-editor.findScope{background-color:var(--vscode-editor-findRangeHighlightBackground)}.monaco-editor.findMatch{background-color:var(--vscode-editorWidget-background)}.monaco-editor .find-widget>.button.codicon-widget-close{position:absolute;top:5px;right:4px}.monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-manual-expanded,.monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-editor .margin-view-overlays .codicon-folding-collapsed{cursor:pointer;opacity:0;justify-content:center;align-items:center;margin-left:2px;font-size:140%;transition:opacity .5s;display:flex}.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-manual-expanded,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-collapsed{transition:initial}.monaco-editor .margin-view-overlays:hover .codicon,.monaco-editor .margin-view-overlays .codicon.codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon.codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon.alwaysShowFoldIcons{opacity:1}.monaco-editor .inline-folded:after{color:var(--vscode-editor-foldPlaceholderForeground);content:"⋯";cursor:pointer;margin:.1em .2em 0;line-height:1em;display:inline}.monaco-editor .folded-background{background-color:var(--vscode-editor-foldBackground)}.monaco-editor .cldr.codicon.codicon-folding-expanded,.monaco-editor .cldr.codicon.codicon-folding-collapsed,.monaco-editor .cldr.codicon.codicon-folding-manual-expanded,.monaco-editor .cldr.codicon.codicon-folding-manual-collapsed{color:var(--vscode-editorGutter-foldingControlForeground)!important}.monaco-editor .peekview-widget .head .peekview-title .severity-icon{vertical-align:text-top;margin-right:4px;display:inline-block}.monaco-editor .marker-widget{text-overflow:ellipsis;white-space:nowrap}.monaco-editor .marker-widget>.stale{opacity:.6;font-style:italic}.monaco-editor .marker-widget .title{padding-right:5px;display:inline-block}.monaco-editor .marker-widget .descriptioncontainer{white-space:pre;-webkit-user-select:text;user-select:text;padding:8px 12px 0 20px;position:absolute}.monaco-editor .marker-widget .descriptioncontainer .message{flex-direction:column;display:flex}.monaco-editor .marker-widget .descriptioncontainer .message .details{padding-left:6px}.monaco-editor .marker-widget .descriptioncontainer .message .source,.monaco-editor .marker-widget .descriptioncontainer .message span.code{opacity:.6}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link{opacity:.6;color:inherit}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:before{content:"("}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:after{content:")"}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link>span{text-underline-position:under;color:var(--vscode-textLink-activeForeground);border-bottom:1px solid #0000;-webkit-text-decoration:underline;text-decoration:underline}.monaco-editor .marker-widget .descriptioncontainer .filename{cursor:pointer;color:var(--vscode-textLink-activeForeground)}.monaco-editor .zone-widget .codicon.codicon-error,.markers-panel .marker-icon.error,.markers-panel .marker-icon .codicon.codicon-error,.text-search-provider-messages .providerMessage .codicon.codicon-error,.extensions-viewlet>.extensions .codicon.codicon-error,.extension-editor .codicon.codicon-error,.preferences-editor .codicon.codicon-error{color:var(--vscode-problemsErrorIcon-foreground)}.monaco-editor .zone-widget .codicon.codicon-warning,.markers-panel .marker-icon.warning,.markers-panel .marker-icon .codicon.codicon-warning,.text-search-provider-messages .providerMessage .codicon.codicon-warning,.extensions-viewlet>.extensions .codicon.codicon-warning,.extension-editor .codicon.codicon-warning,.preferences-editor .codicon.codicon-warning{color:var(--vscode-problemsWarningIcon-foreground)}.monaco-editor .zone-widget .codicon.codicon-info,.markers-panel .marker-icon.info,.markers-panel .marker-icon .codicon.codicon-info,.text-search-provider-messages .providerMessage .codicon.codicon-info,.extensions-viewlet>.extensions .codicon.codicon-info,.extension-editor .codicon.codicon-info,.preferences-editor .codicon.codicon-info{color:var(--vscode-problemsInfoIcon-foreground)}.monaco-editor .goto-definition-link{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .iPadShowKeyboard{resize:none;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCA1MyAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDguMDM2NCA0LjAxMDQySDQuMDA3NzlMNC4wMDc3OSAzMi4wMjg2SDQ4LjAzNjRWNC4wMTA0MlpNNC4wMDc3OSAwLjAwNzgxMjVDMS43OTcyMSAwLjAwNzgxMjUgMC4wMDUxODc5OSAxLjc5OTg0IDAuMDA1MTg3OTkgNC4wMTA0MlYzMi4wMjg2QzAuMDA1MTg3OTkgMzQuMjM5MiAxLjc5NzIxIDM2LjAzMTIgNC4wMDc3OSAzNi4wMzEySDQ4LjAzNjRDNTAuMjQ3IDM2LjAzMTIgNTIuMDM5IDM0LjIzOTIgNTIuMDM5IDMyLjAyODZWNC4wMTA0MkM1Mi4wMzkgMS43OTk4NCA1MC4yNDcgMC4wMDc4MTI1IDQ4LjAzNjQgMC4wMDc4MTI1SDQuMDA3NzlaTTguMDEwNDIgOC4wMTMwMkgxMi4wMTNWMTIuMDE1Nkg4LjAxMDQyVjguMDEzMDJaTTIwLjAxODIgOC4wMTMwMkgxNi4wMTU2VjEyLjAxNTZIMjAuMDE4MlY4LjAxMzAyWk0yNC4wMjA4IDguMDEzMDJIMjguMDIzNFYxMi4wMTU2SDI0LjAyMDhWOC4wMTMwMlpNMzYuMDI4NiA4LjAxMzAySDMyLjAyNlYxMi4wMTU2SDM2LjAyODZWOC4wMTMwMlpNNDAuMDMxMiA4LjAxMzAySDQ0LjAzMzlWMTIuMDE1Nkg0MC4wMzEyVjguMDEzMDJaTTE2LjAxNTYgMTYuMDE4Mkg4LjAxMDQyVjIwLjAyMDhIMTYuMDE1NlYxNi4wMTgyWk0yMC4wMTgyIDE2LjAxODJIMjQuMDIwOFYyMC4wMjA4SDIwLjAxODJWMTYuMDE4MlpNMzIuMDI2IDE2LjAxODJIMjguMDIzNFYyMC4wMjA4SDMyLjAyNlYxNi4wMTgyWk00NC4wMzM5IDE2LjAxODJWMjAuMDIwOEgzNi4wMjg2VjE2LjAxODJINDQuMDMzOVpNMTIuMDEzIDI0LjAyMzRIOC4wMTA0MlYyOC4wMjZIMTIuMDEzVjI0LjAyMzRaTTE2LjAxNTYgMjQuMDIzNEgzNi4wMjg2VjI4LjAyNkgxNi4wMTU2VjI0LjAyMzRaTTQ0LjAzMzkgMjQuMDIzNEg0MC4wMzEyVjI4LjAyNkg0NC4wMzM5VjI0LjAyMzRaIiBmaWxsPSIjNDI0MjQyIi8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDAiPgo8cmVjdCB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==) 50% no-repeat;border:4px solid #f6f6f6;border-radius:4px;width:58px;min-width:0;height:36px;min-height:0;margin:0;padding:0;position:absolute;overflow:hidden}.monaco-editor.vs-dark .iPadShowKeyboard{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCA1MyAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDguMDM2NCA0LjAxMDQySDQuMDA3NzlMNC4wMDc3OSAzMi4wMjg2SDQ4LjAzNjRWNC4wMTA0MlpNNC4wMDc3OSAwLjAwNzgxMjVDMS43OTcyMSAwLjAwNzgxMjUgMC4wMDUxODc5OSAxLjc5OTg0IDAuMDA1MTg3OTkgNC4wMTA0MlYzMi4wMjg2QzAuMDA1MTg3OTkgMzQuMjM5MiAxLjc5NzIxIDM2LjAzMTIgNC4wMDc3OSAzNi4wMzEySDQ4LjAzNjRDNTAuMjQ3IDM2LjAzMTIgNTIuMDM5IDM0LjIzOTIgNTIuMDM5IDMyLjAyODZWNC4wMTA0MkM1Mi4wMzkgMS43OTk4NCA1MC4yNDcgMC4wMDc4MTI1IDQ4LjAzNjQgMC4wMDc4MTI1SDQuMDA3NzlaTTguMDEwNDIgOC4wMTMwMkgxMi4wMTNWMTIuMDE1Nkg4LjAxMDQyVjguMDEzMDJaTTIwLjAxODIgOC4wMTMwMkgxNi4wMTU2VjEyLjAxNTZIMjAuMDE4MlY4LjAxMzAyWk0yNC4wMjA4IDguMDEzMDJIMjguMDIzNFYxMi4wMTU2SDI0LjAyMDhWOC4wMTMwMlpNMzYuMDI4NiA4LjAxMzAySDMyLjAyNlYxMi4wMTU2SDM2LjAyODZWOC4wMTMwMlpNNDAuMDMxMiA4LjAxMzAySDQ0LjAzMzlWMTIuMDE1Nkg0MC4wMzEyVjguMDEzMDJaTTE2LjAxNTYgMTYuMDE4Mkg4LjAxMDQyVjIwLjAyMDhIMTYuMDE1NlYxNi4wMTgyWk0yMC4wMTgyIDE2LjAxODJIMjQuMDIwOFYyMC4wMjA4SDIwLjAxODJWMTYuMDE4MlpNMzIuMDI2IDE2LjAxODJIMjguMDIzNFYyMC4wMjA4SDMyLjAyNlYxNi4wMTgyWk00NC4wMzM5IDE2LjAxODJWMjAuMDIwOEgzNi4wMjg2VjE2LjAxODJINDQuMDMzOVpNMTIuMDEzIDI0LjAyMzRIOC4wMTA0MlYyOC4wMjZIMTIuMDEzVjI0LjAyMzRaTTE2LjAxNTYgMjQuMDIzNEgzNi4wMjg2VjI4LjAyNkgxNi4wMTU2VjI0LjAyMzRaTTQ0LjAzMzkgMjQuMDIzNEg0MC4wMzEyVjI4LjAyNkg0NC4wMzM5VjI0LjAyMzRaIiBmaWxsPSIjQzVDNUM1Ii8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDAiPgo8cmVjdCB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==) 50% no-repeat;border:4px solid #252526}.monaco-editor.vs .valueSetReplacement{outline:solid 2px var(--vscode-editorBracketMatch-border)}.monaco-editor .suggest-preview-additional-widget{white-space:nowrap}.monaco-editor .suggest-preview-additional-widget .content-spacer{color:#0000;white-space:pre}.monaco-editor .suggest-preview-additional-widget .button{cursor:pointer;text-underline-position:under;-webkit-text-decoration:underline;text-decoration:underline;display:inline-block}.monaco-editor .ghost-text-hidden{opacity:0;font-size:0}.monaco-editor .ghost-text-decoration,.monaco-editor .suggest-preview-text .ghost-text{font-style:italic}.monaco-editor .ghost-text-decoration,.monaco-editor .ghost-text-decoration-preview,.monaco-editor .suggest-preview-text .ghost-text{background-color:var(--vscode-editorGhostText-background);border:1px solid var(--vscode-editorGhostText-border);color:var(--vscode-editorGhostText-foreground)!important}.monaco-editor .snippet-placeholder{background-color:var(--vscode-editor-snippetTabstopHighlightBackground,transparent);outline-width:1px;outline-style:solid;outline-color:var(--vscode-editor-snippetTabstopHighlightBorder,transparent);min-width:2px}.monaco-editor .finish-snippet-placeholder{background-color:var(--vscode-editor-snippetFinalTabstopHighlightBackground,transparent);outline-width:1px;outline-style:solid;outline-color:var(--vscode-editor-snippetFinalTabstopHighlightBorder,transparent)}.monaco-editor .suggest-widget{z-index:40;border-radius:3px;flex-direction:column;width:430px;display:flex}.monaco-editor .suggest-widget.message{flex-direction:row;align-items:center}.monaco-editor .suggest-widget,.monaco-editor .suggest-details{border-style:solid;border-width:1px;border-color:var(--vscode-editorSuggestWidget-border);background-color:var(--vscode-editorSuggestWidget-background);flex:0 auto;width:100%}.monaco-editor.hc-black .suggest-widget,.monaco-editor.hc-black .suggest-details,.monaco-editor.hc-light .suggest-widget,.monaco-editor.hc-light .suggest-details{border-width:2px}.monaco-editor .suggest-widget .suggest-status-bar{box-sizing:border-box;border-top:1px solid var(--vscode-editorSuggestWidget-border);flex-flow:row;justify-content:space-between;width:100%;padding:0 4px;font-size:80%;display:none;overflow:hidden}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar{display:flex}.monaco-editor .suggest-widget .suggest-status-bar .left{padding-right:8px}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-label{color:var(--vscode-editorSuggestWidgetStatus-foreground)}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label{margin-right:0}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label:after{content:", ";margin-right:.3em}.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget.with-status-bar:not(.docs-side) .monaco-list .monaco-list-row:hover>.contents>.main>.right.can-expand-details>.details-label{width:100%}.monaco-editor .suggest-widget>.message{padding-left:22px}.monaco-editor .suggest-widget>.tree{width:100%;height:100%}.monaco-editor .suggest-widget .monaco-list{-webkit-user-select:none;user-select:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row{-mox-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;cursor:pointer;touch-action:none;background-position:2px 2px;background-repeat:no-repeat;padding-right:10px;display:flex}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused{color:var(--vscode-editorSuggestWidget-selectedForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .codicon{color:var(--vscode-editorSuggestWidget-selectedIconForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents{flex:1;height:100%;padding-left:2px;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main{text-overflow:ellipsis;white-space:pre;justify-content:space-between;display:flex;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{display:flex}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.focused)>.contents>.main .monaco-icon-label{color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight{font-weight:700}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-highlightForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-focusHighlightForeground)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:before{color:inherit;opacity:1;cursor:pointer;font-size:14px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close{position:absolute;top:6px;right:2px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close:hover,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:hover{opacity:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{opacity:.7}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label{text-overflow:ellipsis;opacity:.6;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.qualifier-label{opacity:.4;font-size:85%;line-height:initial;text-overflow:ellipsis;align-self:center;margin-left:12px;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{text-overflow:ellipsis;white-space:nowrap;margin-left:1.1em;font-size:85%;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label>.monaco-tokenized-source{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{display:none}.monaco-editor .suggest-widget:not(.shows-details) .monaco-list .monaco-list-row.focused>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused:not(.string-label)>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget:not(.docs-side) .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right.can-expand-details>.details-label{width:calc(100% - 26px)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left{flex-grow:1;flex-shrink:1;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.monaco-icon-label{flex-shrink:0}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.left>.monaco-icon-label{max-width:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.left>.monaco-icon-label{flex-shrink:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{flex-shrink:4;max-width:70%;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{visibility:hidden;width:18px;height:18px;display:inline-block;position:absolute;right:10px}.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none!important}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:inline-block}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right>.readMore{visibility:visible}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated{opacity:.66;-webkit-text-decoration:unset;text-decoration:unset}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated>.monaco-icon-label-container>.monaco-icon-name-container{-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label:before{height:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon{background-position:50%;background-repeat:no-repeat;background-size:80%;width:16px;height:16px;margin-left:2px;display:block}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.hide{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon{align-items:center;margin-right:4px;display:flex}.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .icon,.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .suggest-icon:before{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor .colorspan{border:.1em solid #000;width:.7em;height:.7em;margin:0 0 0 .3em;display:inline-block}.monaco-editor .suggest-details-container{z-index:41}.monaco-editor .suggest-details{cursor:default;color:var(--vscode-editorSuggestWidget-foreground);flex-direction:column;display:flex}.monaco-editor .suggest-details.focused{border-color:var(--vscode-focusBorder)}.monaco-editor .suggest-details a{color:var(--vscode-textLink-foreground)}.monaco-editor .suggest-details a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .suggest-details code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .suggest-details.no-docs{display:none}.monaco-editor .suggest-details>.monaco-scrollable-element{flex:1}.monaco-editor .suggest-details>.monaco-scrollable-element>.body{box-sizing:border-box;width:100%;height:100%}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type{text-overflow:ellipsis;opacity:.7;white-space:pre;flex:2;margin:0 24px 0 0;padding:4px 0 12px 5px;overflow:hidden}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type.auto-wrap{white-space:normal;word-break:break-all}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs{white-space:pre-wrap;margin:0;padding:4px 5px}.monaco-editor .suggest-details.no-type>.monaco-scrollable-element>.body>.docs{margin-right:24px;overflow:hidden}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs{white-space:initial;min-height:calc(1rem + 8px);padding:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div,.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>span:not(:empty){padding:4px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:first-child{margin-top:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:last-child{margin-bottom:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .monaco-tokenized-source{white-space:pre}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs .code{white-space:pre-wrap;word-wrap:break-word}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .codicon{vertical-align:sub}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>p:empty{display:none}.monaco-editor .suggest-details code{border-radius:3px;padding:0 .4em}.monaco-editor .suggest-details ul,.monaco-editor .suggest-details ol{padding-left:20px}.monaco-editor .suggest-details p code{font-family:var(--monaco-monospace-font)}.monaco-editor .inline-edit-remove{background-color:var(--vscode-editorGhostText-background);font-style:italic}.monaco-editor .inline-edit-hidden{opacity:0;font-size:0}.monaco-editor .inline-edit-decoration,.monaco-editor .suggest-preview-text .inline-edit{font-style:italic}.monaco-editor .inline-completion-text-to-replace{text-underline-position:under;-webkit-text-decoration:underline;text-decoration:underline}.monaco-editor .inline-edit-decoration,.monaco-editor .inline-edit-decoration-preview,.monaco-editor .suggest-preview-text .inline-edit{background-color:var(--vscode-editorGhostText-background);border:1px solid var(--vscode-editorGhostText-border);color:var(--vscode-editorGhostText-foreground)!important}.monaco-editor .inlineEditHints.withBorder{z-index:39;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .inlineEditHints a,.monaco-editor .inlineEditHints a:hover{color:var(--vscode-foreground)}.monaco-editor .inlineEditHints .keybinding{opacity:.6;margin-left:4px;display:flex}.monaco-editor .inlineEditHints .keybinding .monaco-keybinding-key{padding:2px 3px;font-size:8px}.monaco-editor .inlineEditStatusBarItemLabel{margin-right:2px}.monaco-editor .inlineEditSideBySide{z-index:39;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);white-space:pre}.monaco-editor div.inline-edits-widget{--widget-color:var(--vscode-notifications-background)}:is(.monaco-editor div.inline-edits-widget) .promptEditor .monaco-editor{--vscode-editor-placeholder-foreground:var(--vscode-editorGhostText-foreground)}:is(.monaco-editor div.inline-edits-widget) .toolbar,:is(.monaco-editor div.inline-edits-widget) .promptEditor{opacity:0;transition:opacity .2s ease-in-out}:is(:is(.monaco-editor div.inline-edits-widget):hover,.focused:is(.monaco-editor div.inline-edits-widget)) .toolbar,:is(:is(.monaco-editor div.inline-edits-widget):hover,.focused:is(.monaco-editor div.inline-edits-widget)) .promptEditor{opacity:1}:is(:is(.monaco-editor div.inline-edits-widget) .preview .monaco-editor) .mtk1{color:var(--vscode-editorGhostText-foreground)}:is(:is(.monaco-editor div.inline-edits-widget) .preview .monaco-editor) .view-overlays .current-line-exact,:is(:is(.monaco-editor div.inline-edits-widget) .preview .monaco-editor) .current-line-margin{border:none}:is(.monaco-editor div.inline-edits-widget) .preview .monaco-editor{--vscode-editor-background:var(--widget-color)}:is(:is(.monaco-editor div.inline-edits-widget) svg) .gradient-start{stop-color:var(--vscode-editor-background)}:is(:is(.monaco-editor div.inline-edits-widget) svg) .gradient-stop{stop-color:var(--widget-color)}.monaco-editor .tokens-inspect-widget{z-index:50;-webkit-user-select:text;user-select:text;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);padding:10px}.monaco-editor.hc-black .tokens-inspect-widget,.monaco-editor.hc-light .tokens-inspect-widget{border-width:2px}.monaco-editor .tokens-inspect-widget .tokens-inspect-separator{background-color:var(--vscode-editorHoverWidget-border);border:0;height:1px}.monaco-editor .tokens-inspect-widget .tm-token{font-family:var(--monaco-monospace-font)}.monaco-editor .tokens-inspect-widget .tm-token-length{float:right;font-size:60%;font-weight:400}.monaco-editor .tokens-inspect-widget .tm-metadata-table{width:100%}.monaco-editor .tokens-inspect-widget .tm-metadata-value{font-family:var(--monaco-monospace-font);text-align:right}.monaco-editor .tokens-inspect-widget .tm-token-type{font-family:var(--monaco-monospace-font)}.monaco-editor .linked-editing-decoration{background-color:var(--vscode-editor-linkedEditingBackground);min-width:1px}.monaco-editor .detected-link,.monaco-editor .detected-link-active{text-underline-position:under;-webkit-text-decoration:underline;text-decoration:underline}.monaco-editor .detected-link-active{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .focused .selectionHighlight{background-color:var(--vscode-editor-selectionHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-selectionHighlightBorder)}.monaco-editor.hc-black .focused .selectionHighlight,.monaco-editor.hc-light .focused .selectionHighlight{border-style:dotted}.monaco-editor .wordHighlight{background-color:var(--vscode-editor-wordHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightBorder)}.monaco-editor.hc-black .wordHighlight,.monaco-editor.hc-light .wordHighlight{border-style:dotted}.monaco-editor .wordHighlightStrong{background-color:var(--vscode-editor-wordHighlightStrongBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightStrongBorder)}.monaco-editor.hc-black .wordHighlightStrong,.monaco-editor.hc-light .wordHighlightStrong{border-style:dotted}.monaco-editor .wordHighlightText{background-color:var(--vscode-editor-wordHighlightTextBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightTextBorder)}.monaco-editor.hc-black .wordHighlightText,.monaco-editor.hc-light .wordHighlightText{border-style:dotted}.monaco-editor .parameter-hints-widget{z-index:39;cursor:default;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);flex-direction:column;line-height:1.5em;display:flex}.hc-black .monaco-editor .parameter-hints-widget,.hc-light .monaco-editor .parameter-hints-widget{border-width:2px}.monaco-editor .parameter-hints-widget>.phwrapper{flex-direction:row;max-width:440px;display:flex}.monaco-editor .parameter-hints-widget.multiple{min-height:3.3em;padding:0}.monaco-editor .parameter-hints-widget.multiple .body:before{content:"";opacity:.5;border-left:1px solid var(--vscode-editorHoverWidget-border);height:100%;display:block;position:absolute}.monaco-editor .parameter-hints-widget p,.monaco-editor .parameter-hints-widget ul{margin:8px 0}.monaco-editor .parameter-hints-widget .monaco-scrollable-element,.monaco-editor .parameter-hints-widget .body{flex-direction:column;flex:1;min-height:100%;display:flex}.monaco-editor .parameter-hints-widget .signature{padding:4px 5px;position:relative}.monaco-editor .parameter-hints-widget .signature.has-docs:after{content:"";opacity:.5;border-bottom:1px solid var(--vscode-editorHoverWidget-border);width:100%;padding-top:4px;display:block;position:absolute;left:0}.monaco-editor .parameter-hints-widget .code{font-family:var(--vscode-parameterHintsWidget-editorFontFamily),var(--vscode-parameterHintsWidget-editorFontFamilyDefault)}.monaco-editor .parameter-hints-widget .docs{white-space:pre-wrap;padding:0 10px 0 5px}.monaco-editor .parameter-hints-widget .docs.empty{display:none}.monaco-editor .parameter-hints-widget .docs a{color:var(--vscode-textLink-foreground)}.monaco-editor .parameter-hints-widget .docs a:hover{color:var(--vscode-textLink-activeForeground);cursor:pointer}.monaco-editor .parameter-hints-widget .docs .markdown-docs{white-space:initial}.monaco-editor .parameter-hints-widget .docs code{font-family:var(--monaco-monospace-font);background-color:var(--vscode-textCodeBlock-background);border-radius:3px;padding:0 .4em}.monaco-editor .parameter-hints-widget .docs .monaco-tokenized-source,.monaco-editor .parameter-hints-widget .docs .code{white-space:pre-wrap}.monaco-editor .parameter-hints-widget .controls{flex-direction:column;justify-content:flex-end;align-items:center;min-width:22px;display:none}.monaco-editor .parameter-hints-widget.multiple .controls{padding:0 2px;display:flex}.monaco-editor .parameter-hints-widget.multiple .button{cursor:pointer;background-repeat:no-repeat;width:16px;height:16px}.monaco-editor .parameter-hints-widget .button.previous{bottom:24px}.monaco-editor .parameter-hints-widget .overloads{text-align:center;height:12px;line-height:12px;font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .signature .parameter.active{color:var(--vscode-editorHoverWidget-highlightForeground);font-weight:700}.monaco-editor .parameter-hints-widget .documentation-parameter>.parameter{margin-right:.5em;font-weight:700}.monaco-editor{--vscode-editor-placeholder-foreground:var(--vscode-editorGhostText-foreground)}.monaco-editor .editorPlaceholder{text-overflow:ellipsis;text-wrap:nowrap;pointer-events:none;color:var(--vscode-editor-placeholder-foreground);position:absolute;top:0;overflow:hidden}.monaco-editor .rename-box{z-index:100;color:inherit;border-radius:4px}.monaco-editor .rename-box.preview{padding:4px 4px 0}.monaco-editor .rename-box .rename-input-with-button{border-radius:2px;width:calc(100% - 8px);padding:3px}.monaco-editor .rename-box .rename-input{width:calc(100% - 8px);padding:0}.monaco-editor .rename-box .rename-input:focus{outline:none}.monaco-editor .rename-box .rename-suggestions-button{cursor:pointer;background-color:#0000;border:none;border-radius:5px;align-items:center;padding:3px;display:flex}.monaco-editor .rename-box .rename-suggestions-button:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-editor .rename-box .rename-candidate-list-container .monaco-list-row{border-radius:2px}.monaco-editor .rename-box .rename-label{opacity:.8;display:none}.monaco-editor .rename-box.preview .rename-label{display:inherit}.monaco-editor .sticky-widget{overflow:hidden}.monaco-editor .sticky-widget-line-numbers{float:left;background-color:inherit}.monaco-editor .sticky-widget-lines-scrollable{width:var(--vscode-editorStickyScroll-scrollableWidth);background-color:inherit;display:inline-block;position:absolute;overflow:hidden}.monaco-editor .sticky-widget-lines{background-color:inherit;position:absolute}.monaco-editor .sticky-line-number,.monaco-editor .sticky-line-content{color:var(--vscode-editorLineNumber-foreground);white-space:nowrap;background-color:inherit;display:inline-block;position:absolute}.monaco-editor .sticky-line-number .codicon-folding-expanded,.monaco-editor .sticky-line-number .codicon-folding-collapsed{float:right;transition:var(--vscode-editorStickyScroll-foldingOpacityTransition)}.monaco-editor .sticky-line-content{width:var(--vscode-editorStickyScroll-scrollableWidth);background-color:inherit;white-space:nowrap}.monaco-editor .sticky-line-number-inner{text-align:right;display:inline-block}.monaco-editor .sticky-widget{border-bottom:1px solid var(--vscode-editorStickyScroll-border)}.monaco-editor .sticky-line-content:hover{background-color:var(--vscode-editorStickyScrollHover-background);cursor:pointer}.monaco-editor .sticky-widget{width:100%;box-shadow:var(--vscode-editorStickyScroll-shadow)0 4px 2px -2px;z-index:4;background-color:var(--vscode-editorStickyScroll-background);right:initial!important}.monaco-editor .sticky-widget.peek{background-color:var(--vscode-peekViewEditorStickyScroll-background)}.monaco-editor .unicode-highlight{border:1px solid var(--vscode-editorUnicodeHighlight-border);background-color:var(--vscode-editorUnicodeHighlight-background);box-sizing:border-box}.editor-banner{box-sizing:border-box;cursor:default;background:var(--vscode-banner-background);width:100%;height:26px;font-size:12px;display:flex;overflow:visible}.editor-banner .icon-container{flex-shrink:0;align-items:center;padding:0 6px 0 10px;display:flex}.editor-banner .icon-container.custom-icon{background-position:50%;background-repeat:no-repeat;background-size:16px;width:16px;margin:0 6px 0 10px;padding:0}.editor-banner .message-container{text-overflow:ellipsis;white-space:nowrap;align-items:center;line-height:26px;display:flex;overflow:hidden}.editor-banner .message-container p{margin-block:0}.editor-banner .message-actions-container{flex-grow:1;flex-shrink:0;margin:0 4px;line-height:26px}.editor-banner .message-actions-container a.monaco-button{width:inherit;margin:2px 8px;padding:0 12px}.editor-banner .message-actions-container a{margin-left:12px;padding:3px;-webkit-text-decoration:underline;text-decoration:underline}.editor-banner .action-container{padding:0 10px 0 6px}.editor-banner{background-color:var(--vscode-banner-background)}.editor-banner,.editor-banner .action-container .codicon,.editor-banner .message-actions-container .monaco-link{color:var(--vscode-banner-foreground)}.editor-banner .icon-container .codicon{color:var(--vscode-banner-iconForeground)}.monaco-link{color:var(--vscode-textLink-foreground)}.monaco-link:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor{--monaco-monospace-font:"SF Mono",Monaco,Menlo,Consolas,"Ubuntu Mono","Liberation Mono","DejaVu Sans Mono","Courier New",monospace;font-family:-apple-system,BlinkMacSystemFont,Segoe WPC,Segoe UI,HelveticaNeue-Light,system-ui,Ubuntu,Droid Sans,sans-serif}.monaco-menu .monaco-action-bar.vertical .action-item .action-menu-item:focus .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-black .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-light .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-hover p{margin:0}.monaco-aria-container{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);width:1px;height:1px;margin:-1px;padding:0;top:0;overflow:hidden;position:absolute!important}.monaco-editor,.monaco-diff-editor .synthetic-focus,.monaco-editor,.monaco-diff-editor [tabindex="0"]:focus,.monaco-editor,.monaco-diff-editor [tabindex="-1"]:focus,.monaco-editor,.monaco-diff-editor button:focus,.monaco-editor,.monaco-diff-editor input[type=button]:focus,.monaco-editor,.monaco-diff-editor input[type=checkbox]:focus,.monaco-editor,.monaco-diff-editor input[type=search]:focus,.monaco-editor,.monaco-diff-editor input[type=text]:focus,.monaco-editor,.monaco-diff-editor select:focus,.monaco-editor,.monaco-diff-editor textarea:focus{outline-offset:-1px;outline-width:1px;outline-style:solid;outline-color:var(--vscode-focusBorder);opacity:1}.monaco-workbench .workbench-hover{z-index:40;background:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);max-width:700px;color:var(--vscode-editorHoverWidget-foreground);box-shadow:0 2px 8px var(--vscode-widget-shadow);border-radius:3px;font-size:13px;line-height:19px;position:relative;overflow:hidden}.monaco-workbench .workbench-hover hr{border-bottom:none}.monaco-workbench .workbench-hover:not(.skip-fade-in){animation:.1s linear fadein}.monaco-workbench .workbench-hover.compact{font-size:12px}.monaco-workbench .workbench-hover.compact .hover-contents{padding:2px 8px}.monaco-workbench .workbench-hover-container.locked .workbench-hover{outline:1px solid var(--vscode-editorHoverWidget-border)}.monaco-workbench .workbench-hover-container.locked .workbench-hover:focus,.monaco-workbench .workbench-hover-lock:focus{outline:1px solid var(--vscode-focusBorder)}.monaco-workbench .workbench-hover-container.locked .workbench-hover-lock:hover{background:var(--vscode-toolbar-hoverBackground)}.monaco-workbench .workbench-hover-pointer{z-index:41;pointer-events:none;position:absolute}.monaco-workbench .workbench-hover-pointer:after{content:"";background-color:var(--vscode-editorHoverWidget-background);border-right:1px solid var(--vscode-editorHoverWidget-border);border-bottom:1px solid var(--vscode-editorHoverWidget-border);width:5px;height:5px;position:absolute}.monaco-workbench .locked .workbench-hover-pointer:after{border-bottom-width:2px;border-right-width:2px;width:4px;height:4px}.monaco-workbench .workbench-hover-pointer.left{left:-3px}.monaco-workbench .workbench-hover-pointer.right{right:3px}.monaco-workbench .workbench-hover-pointer.top{top:-3px}.monaco-workbench .workbench-hover-pointer.bottom{bottom:3px}.monaco-workbench .workbench-hover-pointer.left:after{transform:rotate(135deg)}.monaco-workbench .workbench-hover-pointer.right:after{transform:rotate(315deg)}.monaco-workbench .workbench-hover-pointer.top:after{transform:rotate(225deg)}.monaco-workbench .workbench-hover-pointer.bottom:after{transform:rotate(45deg)}.monaco-workbench .workbench-hover a{color:var(--vscode-textLink-foreground)}.monaco-workbench .workbench-hover a:focus{outline-offset:-1px;outline:1px solid;outline-color:var(--vscode-focusBorder);-webkit-text-decoration:underline;text-decoration:underline}.monaco-workbench .workbench-hover a:hover,.monaco-workbench .workbench-hover a:active{color:var(--vscode-textLink-activeForeground)}.monaco-workbench .workbench-hover code{background:var(--vscode-textCodeBlock-background)}.monaco-workbench .workbench-hover .hover-row .actions{background:var(--vscode-editorHoverWidget-statusBarBackground)}.monaco-workbench .workbench-hover.right-aligned{left:1px}.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions{flex-direction:row-reverse}.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions .action-container{margin-left:16px;margin-right:0}.context-view{position:absolute}.context-view.fixed{all:initial;color:inherit;font-family:inherit;font-size:13px;position:fixed}.quick-input-widget{font-size:13px}.quick-input-widget .monaco-highlighted-label .highlight,.quick-input-widget .monaco-highlighted-label .highlight{color:#0066bf}.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight,.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight{color:#9dddff}.vs-dark .quick-input-widget .monaco-highlighted-label .highlight,.vs-dark .quick-input-widget .monaco-highlighted-label .highlight{color:#0097fb}.hc-black .quick-input-widget .monaco-highlighted-label .highlight,.hc-black .quick-input-widget .monaco-highlighted-label .highlight{color:#f38518}.hc-light .quick-input-widget .monaco-highlighted-label .highlight,.hc-light .quick-input-widget .monaco-highlighted-label .highlight{color:#0f4a85}.monaco-keybinding>.monaco-keybinding-key{color:#555;background-color:#ddd6;border:1px solid #ccc6;border-bottom-color:#bbb6;box-shadow:inset 0 -1px #bbb6}.hc-black .monaco-keybinding>.monaco-keybinding-key{box-shadow:none;color:#fff;background-color:#0000;border:1px solid #6fc3df}.hc-light .monaco-keybinding>.monaco-keybinding-key{box-shadow:none;color:#292929;background-color:#0000;border:1px solid #0f4a85}.vs-dark .monaco-keybinding>.monaco-keybinding-key{color:#ccc;background-color:#8080802b;border:1px solid #3339;border-bottom-color:#4449;box-shadow:inset 0 -1px #4449}.quick-input-widget{z-index:2550;-webkit-app-region:no-drag;border-radius:6px;width:600px;margin-left:-300px;position:absolute;left:50%}.quick-input-titlebar{border-top-left-radius:5px;border-top-right-radius:5px;align-items:center;display:flex}.quick-input-left-action-bar{flex:1;margin-left:4px;display:flex}.quick-input-inline-action-bar{margin:2px 0 0 5px}.quick-input-title{text-align:center;text-overflow:ellipsis;padding:3px 0;overflow:hidden}.quick-input-right-action-bar{flex:1;margin-right:4px;display:flex}.quick-input-right-action-bar>.actions-container{justify-content:flex-end}.quick-input-titlebar .monaco-action-bar .action-label.codicon{background-position:50%;background-repeat:no-repeat;padding:2px}.quick-input-description{margin:6px 6px 6px 11px}.quick-input-header .quick-input-description{flex:1;margin:4px 2px}.quick-input-header{padding:8px 6px 2px;display:flex}.quick-input-widget.hidden-input .quick-input-header{margin-bottom:0;padding:0}.quick-input-and-message{flex-direction:column;flex-grow:1;min-width:0;display:flex;position:relative}.quick-input-check-all{align-self:center;margin:0}.quick-input-filter{flex-grow:1;display:flex;position:relative}.quick-input-box{flex-grow:1}.quick-input-widget.show-checkboxes .quick-input-box,.quick-input-widget.show-checkboxes .quick-input-message{margin-left:5px}.quick-input-visible-count{position:absolute;left:-10000px}.quick-input-count{align-self:center;align-items:center;display:flex;position:absolute;right:4px}.quick-input-count .monaco-count-badge{vertical-align:middle;border-radius:2px;min-height:auto;padding:2px 4px;line-height:normal}.quick-input-action{margin-left:6px}.quick-input-action .monaco-text-button{align-items:center;height:25px;padding:0 6px;font-size:11px;display:flex}.quick-input-message{overflow-wrap:break-word;margin-top:-1px;padding:5px}.quick-input-message>.codicon{vertical-align:text-bottom;margin:0 .2em}.quick-input-message a{color:inherit}.quick-input-progress.monaco-progress-container{position:relative}.quick-input-list{line-height:22px}.quick-input-widget.hidden-input .quick-input-list{margin-top:4px;padding-bottom:4px}.quick-input-list .monaco-list{max-height:440px;padding-bottom:5px;overflow:hidden}.quick-input-list .monaco-scrollable-element{padding:0 5px}.quick-input-list .quick-input-list-entry{box-sizing:border-box;padding:0 6px;display:flex;overflow:hidden}.quick-input-list .quick-input-list-entry.quick-input-list-separator-border{border-top-style:solid;border-top-width:1px}.quick-input-list .monaco-list-row{border-radius:3px}.quick-input-list .monaco-list-row[data-index="0"] .quick-input-list-entry.quick-input-list-separator-border{border-top-style:none}.quick-input-list .quick-input-list-label{flex:1;height:100%;display:flex;overflow:hidden}.quick-input-list .quick-input-list-checkbox{align-self:center;margin:0}.quick-input-list .quick-input-list-icon{background-position:0;background-repeat:no-repeat;background-size:16px;justify-content:center;align-items:center;width:16px;height:22px;padding-right:6px;display:flex}.quick-input-list .quick-input-list-rows{text-overflow:ellipsis;flex-direction:column;flex:1;height:100%;margin-left:5px;display:flex;overflow:hidden}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-rows{margin-left:10px}.quick-input-widget .quick-input-list .quick-input-list-checkbox{display:none}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-checkbox{display:inline}.quick-input-list .quick-input-list-rows>.quick-input-list-row{align-items:center;display:flex}.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label,.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label .monaco-icon-label-container>.monaco-icon-name-container{flex:1}.quick-input-list .quick-input-list-rows>.quick-input-list-row .codicon[class*=codicon-]{vertical-align:text-bottom}.quick-input-list .quick-input-list-rows .monaco-highlighted-label>span{opacity:1}.quick-input-list .quick-input-list-entry .quick-input-list-entry-keybinding{margin-right:8px}.quick-input-list .quick-input-list-label-meta{opacity:.7;text-overflow:ellipsis;line-height:normal;overflow:hidden}.quick-input-list .monaco-list .monaco-list-row .monaco-highlighted-label .highlight{background-color:unset;font-weight:700;color:var(--vscode-list-highlightForeground)!important}.quick-input-list .monaco-list .monaco-list-row.focused .monaco-highlighted-label .highlight{color:var(--vscode-list-focusHighlightForeground)!important}.quick-input-list .quick-input-list-entry .quick-input-list-separator{margin-right:4px}.quick-input-list .quick-input-list-entry-action-bar{flex:0;display:flex;overflow:visible}.quick-input-list .quick-input-list-entry-action-bar .action-label{display:none}.quick-input-list .quick-input-list-entry-action-bar .action-label.codicon{margin-right:4px;padding:2px}.quick-input-list .quick-input-list-entry-action-bar{margin-top:1px;margin-right:4px}.quick-input-list .quick-input-list-entry .quick-input-list-entry-action-bar .action-label.always-visible,.quick-input-list .quick-input-list-entry:hover .quick-input-list-entry-action-bar .action-label,.quick-input-list .quick-input-list-entry.focus-inside .quick-input-list-entry-action-bar .action-label,.quick-input-list .monaco-list-row.focused .quick-input-list-entry-action-bar .action-label,.quick-input-list .monaco-list-row.passive-focused .quick-input-list-entry-action-bar .action-label{display:flex}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key,.quick-input-list .monaco-list-row.focused .quick-input-list-entry .quick-input-list-separator{color:inherit}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key{background:0 0}.quick-input-list .quick-input-list-separator-as-item{padding:4px 6px;font-size:12px}.quick-input-list .quick-input-list-separator-as-item .label-name{font-weight:600}.quick-input-list .quick-input-list-separator-as-item .label-description{opacity:1!important}.quick-input-list .monaco-tree-sticky-row .quick-input-list-entry.quick-input-list-separator-as-item.quick-input-list-separator-border{border-top-style:none}.quick-input-list .monaco-tree-sticky-row{padding:0 5px}.quick-input-list .monaco-tl-twistie{display:none!important}.monaco-progress-container{width:100%;height:2px;overflow:hidden}.monaco-progress-container .progress-bit{width:2%;height:2px;display:none;position:absolute;left:0}.monaco-progress-container.active .progress-bit{display:inherit}.monaco-progress-container.discrete .progress-bit{transition:width .1s linear;left:0}.monaco-progress-container.discrete.done .progress-bit{width:100%}.monaco-progress-container.infinite .progress-bit{animation-name:progress;animation-duration:4s;animation-timing-function:linear;animation-iteration-count:infinite;transform:translate(0,0)}.monaco-progress-container.infinite.infinite-long-running .progress-bit{animation-timing-function:steps(100,end)}@keyframes progress{0%{transform:translate(0%)scaleX(1)}50%{transform:translate(2500%)scaleX(3)}to{transform:translate(4900%)scaleX(1)}}.monaco-component.multiDiffEditor{background:var(--vscode-multiDiffEditor-background);width:100%;height:100%;position:relative;overflow-y:hidden}.monaco-component.multiDiffEditor>div{width:100%;height:100%;position:absolute;top:0;left:0}.placeholder:is(.monaco-component.multiDiffEditor>div){visibility:hidden}.placeholder.visible:is(.monaco-component.multiDiffEditor>div){visibility:visible}.placeholder:is(.monaco-component.multiDiffEditor>div){place-content:center;place-items:center;display:grid}.monaco-component.multiDiffEditor .active{--vscode-multiDiffEditor-border:var(--vscode-focusBorder)}.monaco-component.multiDiffEditor .multiDiffEntry{flex-direction:column;flex:1;display:flex;overflow:hidden}:is(.monaco-component.multiDiffEditor .multiDiffEntry) .collapse-button{cursor:pointer;margin:0 5px}:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .collapse-button) a{display:block}:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header{z-index:1000;background:var(--vscode-editor-background)}:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header):not(.collapsed) .header-content{border-bottom:1px solid var(--vscode-sideBarSectionHeader-border)}:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content{border-top:1px solid var(--vscode-multiDiffEditor-border);color:var(--vscode-foreground);background:var(--vscode-multiDiffEditor-headerBackground);align-items:center;margin:8px 0 0;padding:4px 5px;display:flex}.shadow:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content){box-shadow:var(--vscode-scrollbar-shadow)0px 6px 6px -6px}:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .file-path{flex:1;min-width:0;display:flex}:is(:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .file-path) .title{font-size:14px;line-height:22px}.original:is(:is(:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .file-path) .title){text-overflow:ellipsis;flex:1;min-width:0}:is(:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .file-path) .status{opacity:.75;margin:0 10px;font-weight:600;line-height:22px}:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .actions{padding:0 8px}:is(.monaco-component.multiDiffEditor .multiDiffEntry) .editorParent{border-bottom:1px solid var(--vscode-multiDiffEditor-border);flex-direction:column;flex:1;display:flex;overflow:hidden}:is(.monaco-component.multiDiffEditor .multiDiffEntry) .editorContainer{flex:1}.containsTaskList_mC6p{list-style:none}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight)var(--ifm-h5-font-size)/var(--ifm-heading-line-height)var(--ifm-heading-font-family);text-transform:uppercase}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{vertical-align:middle;margin-right:.4em;display:inline-block}.admonitionIcon_Rf37 svg{width:1.6em;height:1.6em;fill:var(--ifm-alert-foreground-color);display:inline-block}.admonitionContent_BuS1>:last-child{margin-bottom:0}.breadcrumbHomeIcon_YNFT{vertical-align:top;width:1.1rem;height:1.1rem;position:relative;top:1px}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:.8;margin-bottom:.8rem}@media (width>=997px){.generatedIndexPage_vN6x{max-width:75%!important}}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(1.25*var(--ifm-leading))}.docItemContainer_Djhp header+*,.docItemContainer_Djhp article>:first-child{margin-top:0}@media (width>=997px){.docItemCol_VOVn{max-width:75%!important}}
+1
assets/css/styles.c6d98630.css
··· 1 + :root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-500:var(--ifm-color-gray-500);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:.2s;--ifm-transition-slow:.4s;--ifm-transition-timing-default:cubic-bezier(.08,.52,.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:.1rem;--ifm-code-padding-vertical:.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:.875rem;--ifm-h6-font-size:.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:.8rem;--ifm-breadcrumb-padding-vertical:.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 256 256\"><g><g><polygon points=\"79.093,0 48.907,30.187 146.72,128 48.907,225.813 79.093,256 207.093,128\"/></g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></svg>");--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-color:var(--ifm-font-color-base-inverse);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:.5rem;--ifm-toc-padding-horizontal:.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:.75rem;--ifm-menu-link-padding-vertical:.375rem;--ifm-menu-link-sublist-icon:url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16px\" height=\"16px\" viewBox=\"0 0 24 24\"><path fill=\"rgba(0,0,0,0.5)\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z\"></path></svg>");--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:.75rem;--ifm-navbar-item-padding-vertical:.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-hover-color:var(--ifm-color-primary);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url("data:image/svg+xml;utf8,<svg fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" height=\"16px\" width=\"16px\"><path d=\"M6.02945,10.20327a4.17382,4.17382,0,1,1,4.17382-4.17382A4.15609,4.15609,0,0,1,6.02945,10.20327Zm9.69195,4.2199L10.8989,9.59979A5.88021,5.88021,0,0,0,12.058,6.02856,6.00467,6.00467,0,1,0,9.59979,10.8989l4.82338,4.82338a.89729.89729,0,0,0,1.29912,0,.89749.89749,0,0,0-.00087-1.29909Z\" /></svg>");--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base)var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{word-wrap:break-word;margin:0}iframe{color-scheme:normal;border:0}.container{max-width:var(--ifm-container-width);padding:0 var(--ifm-spacing-horizontal);width:100%;margin:0 auto}.container--fluid{max-width:inherit}.row{margin:0 calc(var(--ifm-spacing-horizontal)*-1);flex-wrap:wrap;display:flex}.row--no-gutters{margin-left:0;margin-right:0}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;max-width:var(--ifm-col-width);padding:0 var(--ifm-spacing-horizontal);flex:1 0;width:100%;margin-left:0}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:calc(1/12*100%)}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:calc(2/12*100%)}.col--offset-2{margin-left:16.6667%}.col--3{--ifm-col-width:calc(3/12*100%)}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:calc(4/12*100%)}.col--offset-4{margin-left:33.3333%}.col--5{--ifm-col-width:calc(5/12*100%)}.col--offset-5{margin-left:41.6667%}.col--6{--ifm-col-width:calc(6/12*100%)}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:calc(7/12*100%)}.col--offset-7{margin-left:58.3333%}.col--8{--ifm-col-width:calc(8/12*100%)}.col--offset-8{margin-left:66.6667%}.col--9{--ifm-col-width:calc(9/12*100%)}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:calc(10/12*100%)}.col--offset-10{margin-left:83.3333%}.col--11{--ifm-col-width:calc(11/12*100%)}.col--offset-11{margin-left:91.6667%}.col--12{--ifm-col-width:calc(12/12*100%)}.col--offset-12{margin-left:100%}.margin--none{margin:0!important}.margin-top--none{margin-top:0!important}.margin-left--none{margin-left:0!important}.margin-bottom--none{margin-bottom:0!important}.margin-right--none{margin-right:0!important}.margin-vert--none{margin-top:0!important;margin-bottom:0!important}.margin-horiz--none{margin-left:0!important;margin-right:0!important}.margin--xs{margin:.25rem!important}.margin-top--xs{margin-top:.25rem!important}.margin-left--xs{margin-left:.25rem!important}.margin-bottom--xs{margin-bottom:.25rem!important}.margin-right--xs{margin-right:.25rem!important}.margin-vert--xs{margin-top:.25rem!important;margin-bottom:.25rem!important}.margin-horiz--xs{margin-left:.25rem!important;margin-right:.25rem!important}.margin--sm{margin:.5rem!important}.margin-top--sm{margin-top:.5rem!important}.margin-left--sm{margin-left:.5rem!important}.margin-bottom--sm{margin-bottom:.5rem!important}.margin-right--sm{margin-right:.5rem!important}.margin-vert--sm{margin-top:.5rem!important;margin-bottom:.5rem!important}.margin-horiz--sm{margin-left:.5rem!important;margin-right:.5rem!important}.margin--md{margin:1rem!important}.margin-top--md{margin-top:1rem!important}.margin-left--md{margin-left:1rem!important}.margin-bottom--md{margin-bottom:1rem!important}.margin-right--md{margin-right:1rem!important}.margin-vert--md{margin-top:1rem!important;margin-bottom:1rem!important}.margin-horiz--md{margin-left:1rem!important;margin-right:1rem!important}.margin--lg{margin:2rem!important}.margin-top--lg{margin-top:2rem!important}.margin-left--lg{margin-left:2rem!important}.margin-bottom--lg{margin-bottom:2rem!important}.margin-right--lg{margin-right:2rem!important}.margin-vert--lg{margin-top:2rem!important;margin-bottom:2rem!important}.margin-horiz--lg{margin-left:2rem!important;margin-right:2rem!important}.margin--xl{margin:5rem!important}.margin-top--xl{margin-top:5rem!important}.margin-left--xl{margin-left:5rem!important}.margin-bottom--xl{margin-bottom:5rem!important}.margin-right--xl{margin-right:5rem!important}.margin-vert--xl{margin-top:5rem!important;margin-bottom:5rem!important}.margin-horiz--xl{margin-left:5rem!important;margin-right:5rem!important}.padding--none{padding:0!important}.padding-top--none{padding-top:0!important}.padding-left--none{padding-left:0!important}.padding-bottom--none{padding-bottom:0!important}.padding-right--none{padding-right:0!important}.padding-vert--none{padding-top:0!important;padding-bottom:0!important}.padding-horiz--none{padding-left:0!important;padding-right:0!important}.padding--xs{padding:.25rem!important}.padding-top--xs{padding-top:.25rem!important}.padding-left--xs{padding-left:.25rem!important}.padding-bottom--xs{padding-bottom:.25rem!important}.padding-right--xs{padding-right:.25rem!important}.padding-vert--xs{padding-top:.25rem!important;padding-bottom:.25rem!important}.padding-horiz--xs{padding-left:.25rem!important;padding-right:.25rem!important}.padding--sm{padding:.5rem!important}.padding-top--sm{padding-top:.5rem!important}.padding-left--sm{padding-left:.5rem!important}.padding-bottom--sm{padding-bottom:.5rem!important}.padding-right--sm{padding-right:.5rem!important}.padding-vert--sm{padding-top:.5rem!important;padding-bottom:.5rem!important}.padding-horiz--sm{padding-left:.5rem!important;padding-right:.5rem!important}.padding--md{padding:1rem!important}.padding-top--md{padding-top:1rem!important}.padding-left--md{padding-left:1rem!important}.padding-bottom--md{padding-bottom:1rem!important}.padding-right--md{padding-right:1rem!important}.padding-vert--md{padding-top:1rem!important;padding-bottom:1rem!important}.padding-horiz--md{padding-left:1rem!important;padding-right:1rem!important}.padding--lg{padding:2rem!important}.padding-top--lg{padding-top:2rem!important}.padding-left--lg{padding-left:2rem!important}.padding-bottom--lg{padding-bottom:2rem!important}.padding-right--lg{padding-right:2rem!important}.padding-vert--lg{padding-top:2rem!important;padding-bottom:2rem!important}.padding-horiz--lg{padding-left:2rem!important;padding-right:2rem!important}.padding--xl{padding:5rem!important}.padding-top--xl{padding-top:5rem!important}.padding-left--xl{padding-left:5rem!important}.padding-bottom--xl{padding-bottom:5rem!important}.padding-right--xl{padding-right:5rem!important}.padding-vert--xl{padding-top:5rem!important;padding-bottom:5rem!important}.padding-horiz--xl{padding-left:5rem!important;padding-right:5rem!important}code{background-color:var(--ifm-code-background);border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical)var(--ifm-code-padding-horizontal);vertical-align:middle;border:.1rem solid #0000001a}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height)var(--ifm-font-family-monospace);margin:0 0 var(--ifm-spacing-vertical);padding:var(--ifm-pre-padding);overflow:auto}pre code{font-size:100%;line-height:inherit;background-color:#0000;border:none;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);border-radius:.2rem;padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top)0 var(--ifm-heading-margin-bottom)0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:before{content:"";display:table}.markdown:after{clear:both;content:"";display:table}.markdown>:last-child{margin-bottom:0!important}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading));margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading));margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading));margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>pre,.markdown>ul,.markdown>p{margin-bottom:var(--ifm-leading)}.markdown li{word-wrap:break-word}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ul,ol{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ul ul,ul ol,ol ol,ol ul{margin:0}ul ul ol,ul ol ol,ol ul ol,ol ol ol{list-style-type:lower-alpha}table{border-collapse:collapse;margin-bottom:var(--ifm-spacing-vertical);display:block;overflow:auto}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead{background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width)solid var(--ifm-table-border-color)}table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table th,table td{border:var(--ifm-table-border-width)solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);-webkit-text-decoration:var(--ifm-link-decoration);text-decoration:var(--ifm-link-decoration);transition:color var(--ifm-transition-fast)var(--ifm-transition-timing-default)}a:hover{color:var(--ifm-link-hover-color);-webkit-text-decoration:var(--ifm-link-hover-decoration);text-decoration:var(--ifm-link-hover-decoration)}a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width)solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);margin:0 0 var(--ifm-spacing-vertical);padding:var(--ifm-blockquote-padding-vertical)var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical)0;border:0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.text--break{word-wrap:break-word!important;word-break:break-word!important}.text--no-decoration,.text--no-decoration:hover{-webkit-text-decoration:none;text-decoration:none}.clean-btn{color:inherit;cursor:pointer;background:0 0;border:none;padding:0;font-family:inherit}.clean-list{padding-left:0;list-style:none}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width)solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);color:var(--ifm-alert-foreground-color);padding:var(--ifm-alert-padding-vertical)var(--ifm-alert-padding-horizontal)}.alert__heading{font:bold var(--ifm-h5-font-size)/var(--ifm-heading-line-height)var(--ifm-heading-font-family);text-transform:uppercase;align-items:center;margin-bottom:.5rem;display:flex}.alert__icon{margin-right:.4em;display:inline-flex}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{color:var(--ifm-alert-foreground-color);margin:calc(var(--ifm-alert-padding-vertical)*-1)calc(var(--ifm-alert-padding-horizontal)*-1)0 0;opacity:.75}.alert .close:hover,.alert .close:focus{opacity:1}.alert a{-webkit-text-decoration-color:var(--ifm-alert-border-color);text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{height:var(--ifm-avatar-photo-size);width:var(--ifm-avatar-photo-size);border-radius:50%;display:block;overflow:hidden}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{text-align:var(--ifm-avatar-intro-alignment);flex-direction:column;flex:1;justify-content:center;display:flex}.avatar__name{font:bold var(--ifm-h4-font-size)/var(--ifm-heading-line-height)var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:.5rem;flex-direction:column;align-items:center}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width)solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);padding:var(--ifm-badge-padding-vertical)var(--ifm-badge-padding-horizontal);line-height:1;display:inline-block}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);--ifm-badge-border-color:var(--ifm-badge-background-color);color:var(--ifm-color-black)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger);--ifm-badge-border-color:var(--ifm-badge-background-color)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item{display:inline-block}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator)center;content:" ";filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));display:inline-block}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);color:var(--ifm-font-color-base);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier))calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-property:background,color;transition-duration:var(--ifm-transition-fast);transition-timing-function:var(--ifm-transition-timing-default);display:inline-block}.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover,.breadcrumbs__link:any-link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width)solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);color:var(--ifm-button-color);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier))calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap;transition-property:color,background,border-color;transition-duration:var(--ifm-button-transition-duration);transition-timing-function:var(--ifm-transition-timing-default);line-height:1.5;display:inline-block}.button:hover{color:var(--ifm-button-color);-webkit-text-decoration:none;text-decoration:none}.button--outline{--ifm-button-background-color:transparent;--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--outline:hover,.button--outline:active,.button--outline.button--active{--ifm-button-color:var(--ifm-font-color-base-inverse)}.button--link{--ifm-button-background-color:transparent;--ifm-button-border-color:transparent;color:var(--ifm-link-color);-webkit-text-decoration:var(--ifm-link-decoration);text-decoration:var(--ifm-link-decoration)}.button--link:hover,.button--link:active,.button--link.button--active{color:var(--ifm-link-hover-color);-webkit-text-decoration:var(--ifm-link-hover-decoration);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{width:100%;display:block}.button.button--secondary{color:var(--ifm-color-gray-900)}.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary:active,.button--primary.button--active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary:active,.button--secondary.button--active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success:active,.button--success.button--active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info:active,.button--info.button--active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning:active,.button--warning.button--active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger:active,.button--danger.button--active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{gap:var(--ifm-button-group-spacing);display:inline-flex}.button-group>.button:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.button-group>.button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.button-group--block{justify-content:stretch;display:flex}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);flex-direction:column;display:flex;overflow:hidden}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__header,.card__body,.card__footer{padding:var(--ifm-card-vertical-spacing)var(--ifm-card-horizontal-spacing)}.card__header:not(:last-child),.card__body:not(:last-child),.card__footer:not(:last-child){padding-bottom:0}.card__header>:last-child,.card__body>:last-child,.card__footer>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{padding:var(--ifm-toc-padding-vertical)0;margin-bottom:0;font-size:.8rem}.table-of-contents,.table-of-contents ul{padding-left:var(--ifm-toc-padding-horizontal);list-style:none}.table-of-contents li{margin:var(--ifm-toc-padding-vertical)var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link:hover,.table-of-contents__link:hover code,.table-of-contents__link--active,.table-of-contents__link--active code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);opacity:.5;transition:opacity var(--ifm-transition-fast)var(--ifm-transition-timing-default);padding:1rem;line-height:1}.close:hover{opacity:.7}.close:focus{opacity:.8}.dropdown{font-weight:var(--ifm-dropdown-font-weight);vertical-align:top;display:inline-flex;position:relative}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;visibility:visible;transform:translateY(-1px)}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);opacity:0;pointer-events:none;min-width:10rem;max-height:80vh;left:0;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);visibility:hidden;z-index:var(--ifm-z-index-dropdown);transition-property:opacity,transform,visibility;transition-duration:var(--ifm-transition-fast);transition-timing-function:var(--ifm-transition-timing-default);padding:.5rem;list-style:none;position:absolute;overflow-y:auto;transform:translateY(-.625rem)}.dropdown__link{color:var(--ifm-dropdown-link-color);white-space:nowrap;border-radius:.25rem;margin-top:.2rem;padding:.25rem .5rem;font-size:.875rem;display:block}.dropdown__link:hover,.dropdown__link--active{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);-webkit-text-decoration:none;text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{content:"";border:.4em solid #0000;border-top-color:currentColor;border-bottom:0 solid;margin-left:.3em;display:inline-block;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical)var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{max-width:var(--ifm-footer-logo-max-width);margin-top:1rem}.footer__title{color:var(--ifm-footer-title-color);font:bold var(--ifm-h4-font-size)/var(--ifm-heading-line-height)var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.footer__item{margin-top:0}.footer__items{margin-bottom:0}[type=checkbox]{padding:0}.hero{background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);align-items:center;padding:4rem 2rem;display:flex}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu{font-weight:var(--ifm-font-weight-semibold);overflow-x:hidden}.menu__list{margin:0;padding-left:0;list-style:none}.menu__list .menu__list{padding-left:var(--ifm-menu-link-padding-horizontal);flex:0 0 100%;margin-top:.25rem}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.menu__list-item--collapsed .menu__link--sublist:after,.menu__list-item--collapsed .menu__caret:before{transform:rotate(90deg)}.menu__list-item-collapsible{transition:background var(--ifm-transition-fast)var(--ifm-transition-timing-default);border-radius:.25rem;flex-wrap:wrap;display:flex;position:relative}.menu__list-item-collapsible:hover,.menu__list-item-collapsible--active{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link:hover,.menu__list-item-collapsible .menu__link--active{background:0 0!important}.menu__link,.menu__caret{transition:background var(--ifm-transition-fast)var(--ifm-transition-timing-default);border-radius:.25rem;align-items:center;display:flex}.menu__link:hover,.menu__caret:hover{background:var(--ifm-menu-color-background-hover)}.menu__link{color:var(--ifm-menu-color);padding:var(--ifm-menu-link-padding-vertical)var(--ifm-menu-link-padding-horizontal);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);transition:color var(--ifm-transition-fast)var(--ifm-transition-timing-default);-webkit-text-decoration:none;text-decoration:none}.menu__link--sublist-caret:after{content:"";background:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem;min-width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);width:1.25rem;height:1.25rem;transition:transform var(--ifm-transition-fast)linear;margin-left:auto;transform:rotate(180deg)}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret{padding:var(--ifm-menu-link-padding-vertical)var(--ifm-menu-link-padding-horizontal)}.menu__caret:before{content:"";background:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem;filter:var(--ifm-menu-link-sublist-icon-filter);width:1.25rem;height:1.25rem;transition:transform var(--ifm-transition-fast)linear;transform:rotate(180deg)}html[data-theme=dark],.navbar--dark{--ifm-menu-link-sublist-icon-filter:invert(100%)sepia(94%)saturate(17%)hue-rotate(223deg)brightness(104%)contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical)var(--ifm-navbar-padding-horizontal);display:flex}.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{z-index:var(--ifm-z-index-fixed);position:sticky;top:0}.navbar__inner{flex-wrap:wrap;justify-content:space-between;width:100%;display:flex}.navbar__brand{color:var(--ifm-navbar-link-color);align-items:center;min-width:0;margin-right:1rem;display:flex}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);-webkit-text-decoration:none;text-decoration:none}.navbar__title{flex:auto}.navbar__toggle{margin-right:.5rem;display:none}.navbar__logo{flex:none;height:2rem;margin-right:.5rem}.navbar__logo img{height:100%}.navbar__items{flex:1;align-items:center;min-width:0;display:flex}.navbar__items--center{flex:none}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:none;justify-content:flex-end}.navbar__item{padding:var(--ifm-navbar-item-padding-vertical)var(--ifm-navbar-item-padding-horizontal);display:inline-block}.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link{color:var(--ifm-navbar-link-color);font-weight:var(--ifm-font-weight-semibold)}.navbar__link:hover,.navbar__link--active{color:var(--ifm-navbar-link-hover-color);-webkit-text-decoration:none;text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-navbar-link-hover-color:var(--ifm-color-primary);--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color)var(--ifm-navbar-search-input-icon)no-repeat .75rem center/1rem 1rem;color:var(--ifm-navbar-search-input-color);cursor:text;border:none;border-radius:2rem;width:12.5rem;height:2rem;padding:0 .5rem 0 2.25rem;font-size:1rem;display:inline-block}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);opacity:0;visibility:hidden;width:var(--ifm-navbar-sidebar-width);transition-property:opacity,visibility,transform;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;transform:translate(-100%)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar--show .navbar-sidebar{transform:translate(0,0)}.navbar-sidebar__backdrop{opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:var(--ifm-transition-fast);background-color:#0009;transition-timing-function:ease-in-out;position:fixed;inset:0}.navbar-sidebar__brand{box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical)var(--ifm-navbar-padding-horizontal);flex:1;align-items:center;display:flex}.navbar-sidebar__items{height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast)ease-in-out;display:flex;transform:translateZ(0)}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{width:calc(var(--ifm-navbar-sidebar-width));flex-shrink:0;padding:.5rem}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);text-align:left;width:calc(100% + 1rem);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;top:-.5rem}.navbar-sidebar__close{margin-left:auto;display:flex}.pagination{column-gap:var(--ifm-pagination-page-spacing);font-size:var(--ifm-pagination-font-size);padding-left:0;display:flex}.pagination--sm{--ifm-pagination-font-size:.8rem;--ifm-pagination-padding-horizontal:.8rem;--ifm-pagination-padding-vertical:.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{background:var(--ifm-pagination-item-active-background);color:var(--ifm-pagination-color-active)}.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);padding:var(--ifm-pagination-padding-vertical)var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast)var(--ifm-transition-timing-default);display:inline-block}.pagination__link:hover{-webkit-text-decoration:none;text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr);display:grid}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast)var(--ifm-transition-timing-default);display:block}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);-webkit-text-decoration:none;text-decoration:none}.pagination-nav__link--next{text-align:right;grid-column:2/3}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills{gap:var(--ifm-pills-spacing);padding-left:0;display:flex}.pills__item{cursor:pointer;font-weight:var(--ifm-font-weight-bold);transition:background var(--ifm-transition-fast)var(--ifm-transition-timing-default);border-radius:.5rem;padding:.25rem 1rem;display:inline-block}.pills__item--active{background:var(--ifm-pills-color-background-active);color:var(--ifm-pills-color-active)}.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{text-align:center;flex-grow:1}.tabs{color:var(--ifm-tabs-color);font-weight:var(--ifm-font-weight-bold);margin-bottom:0;padding-left:0;display:flex;overflow-x:auto}.tabs__item{border-radius:var(--ifm-global-radius);cursor:pointer;padding:var(--ifm-tabs-padding-vertical)var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast)var(--ifm-transition-timing-default);border-bottom:3px solid #0000;display:inline-flex}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);color:var(--ifm-tabs-color-active);border-bottom-right-radius:0;border-bottom-left-radius:0}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-500:var(--ifm-color-gray-500);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%)sepia(11%)saturate(0%)hue-rotate(149deg)brightness(99%)contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}@media (width>=1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (width<=996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.footer__link-separator{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{width:max-content;display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__item{display:none}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}}@media (width<=576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0s;--ifm-transition-slow:0s}}@media print{.table-of-contents,.footer,.menu,.navbar,.pagination-nav{display:none}.tabs{page-break-inside:avoid}}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary)}#nprogress{pointer-events:none}#nprogress .bar{background:var(--docusaurus-progress-bar-color);z-index:1031;width:100%;height:2px;position:fixed;top:0;left:0}#nprogress .peg{width:100px;height:100%;box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);opacity:1;position:absolute;right:0;transform:rotate(3deg)translateY(-4px)}:root{--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}details[class^=details_].alert--info{--ifm-alert-border-color:var(--ifm-color-emphasis-400);--ifm-code-background:#{palette.$background};--ifm-alert-padding-vertical:calc(var(--ifm-spacing-vertical)*.8);margin-bottom:var(--ifm-paragraph-margin-bottom)}details.alert--info[class^=details_]:not(.alert--warning):not(.alert--success):not(.alert--secondary):not(.alert--danger){--ifm-alert-background-color:transparent}details.alert--info[class^=details_]:not(.alert--warning):not(.alert--success):not(.alert--secondary):not(.alert--danger)>summary{width:100%;min-height:1.3rem;display:inline-block}details.alert--info[class^=details_]:not(.alert--warning):not(.alert--success):not(.alert--secondary):not(.alert--danger)>summary:before{top:.15rem}details.alert--info.alert--success[class^=details_]{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground)}details.alert--info.alert--secondary[class^=details_]{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground)}details.alert--info[class^=details_]>summary{--docusaurus-details-decoration-color:currentColor;font:var(--ifm-heading-font-weight)var(--ifm-h5-font-size)/var(--ifm-heading-line-height)var(--ifm-heading-font-family)}:is(details.alert--info[class^=details_]>summary):before{top:.4rem}:is(details.alert--info[class^=details_]>summary) .admoIcon{vertical-align:middle;margin-right:.4em;display:inline-block}:is(:is(details.alert--info[class^=details_]>summary) .admoIcon)>svg{width:1.6em;height:1.6em;fill:var(--ifm-alert-foreground-color);display:inline-block}details.alert--info[class^=details_]>div>div[class^=collapsibleContent_]{margin-top:var(--ifm-alert-padding-vertical)}details.alert--info[class^=details_] dl{--ifm-spacing-vertical:.5rem}body:not(.navigation-with-keyboard) :not(input):focus{outline:none}#__docusaurus-base-url-issue-banner-container{display:none}.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1);padding:calc(var(--ifm-global-spacing)/2)var(--ifm-global-spacing);color:var(--ifm-color-emphasis-900);background-color:var(--ifm-background-surface-color);position:fixed;top:1rem;left:100%}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{padding:0;line-height:0}.content_knG7{text-align:center;padding:5px 0;font-size:85%}.content_knG7 a{color:inherit;-webkit-text-decoration:underline;text-decoration:underline}:root{--docusaurus-announcement-bar-height:auto}.announcementBar_mb4j{height:var(--docusaurus-announcement-bar-height);background-color:var(--ifm-color-white);color:var(--ifm-color-black);border-bottom:1px solid var(--ifm-color-emphasis-100);align-items:center;display:flex}html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{flex:0 0 30px;align-self:stretch}.announcementBarContent_xLdY{flex:auto}@media print{.announcementBar_mb4j{display:none}}@media (width>=997px){:root{--docusaurus-announcement-bar-height:30px}.announcementBarPlaceholder_vyr4,.announcementBarClose_gvF7{flex-basis:50px}}.toggle_vylO{width:2rem;height:2rem}.toggleButton_gllP{-webkit-tap-highlight-color:transparent;width:100%;height:100%;transition:background var(--ifm-transition-fast);border-radius:50%;justify-content:center;align-items:center;display:flex}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleIcon_g3eP{display:none}[data-theme-choice=system] .systemToggleIcon_QzmC,[data-theme-choice=light] .lightToggleIcon_pyhR,[data-theme-choice=dark] .darkToggleIcon_wfgR{display:initial}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}.themedComponent_mlkZ{display:none}[data-theme=light] .themedComponent--light_NVdE,[data-theme=dark] .themedComponent--dark_xIcU,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.dropdownNavbarItemMobile_J0Sd{cursor:pointer}.iconLanguage_nlXk{vertical-align:text-bottom;margin-right:5px}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);width:var(--search-local-modal-width,560px);padding:var(--search-local-spacing,12px);border-radius:6px;margin-top:8px;position:relative;left:auto!important;right:0!important}.searchInput_YFbd:focus{outline:2px solid var(--search-local-input-active-border-color,var(--ifm-color-primary));outline-offset:0px}@media (width>996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media (width<=576px){.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{width:var(--search-local-modal-width-sm,340px);max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2)}}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{cursor:pointer;background:var(--search-local-hit-background,#fff);box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);padding:0 var(--search-local-spacing,12px);width:100%;color:var(--search-local-hit-color,#444950);height:var(--search-local-hit-height,56px);border-radius:4px;flex-direction:row;align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTree_kk6K,.hitIcon_a7Zy,.hitPath_ieM4,.noResultsIcon_EBY5,.hitFooter_E9YW a{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K{align-items:center;display:flex}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;stroke-width:var(--search-local-icon-stroke-width,1.4);width:24px}.hitIcon_a7Zy{stroke-width:var(--search-local-icon-stroke-width,1.4);width:20px;height:20px}.hitWrapper_sAK8{flex-direction:column;flex:auto;justify-content:center;width:80%;margin:0 8px;font-weight:500;display:flex;overflow-x:hidden}.hitWrapper_sAK8 mark{color:var(--search-local-highlight-color,var(--ifm-color-primary));background:0 0}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden}.hitAction_NqkB{width:20px;height:20px}.hideAction_vcyE>svg{display:none}.noResults_l6Q3{padding:var(--search-local-spacing,12px)0;flex-direction:column;justify-content:center;align-items:center;display:flex}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{text-align:center;margin-top:var(--search-local-spacing,12px);font-size:.85em}.hitFooter_E9YW a{-webkit-text-decoration:underline;text-decoration:underline}.cursor_eG29 .hideAction_vcyE>svg{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 mark,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.suggestion_fB_2.cursor_eG29 mark{-webkit-text-decoration:underline;text-decoration:underline}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;position:absolute;top:6px;left:10px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:0 0;border:none;padding:0;line-height:1rem;position:absolute;top:50%;right:.8rem;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.searchHintContainer_Pkmr{pointer-events:none;justify-content:center;align-items:center;gap:4px;height:100%;display:flex;position:absolute;top:0;right:10px}.searchHint_iIMx{color:var(--ifm-navbar-search-input-placeholder-color);background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500)}@media (width<=576px){.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}}html[dir=rtl] .searchHintContainer_Pkmr{left:10px;right:auto}html[dir=rtl] .searchBarContainer_NW3z .searchClearButton_qk4g{left:.8rem;right:auto}html[dir=rtl] .searchBarContainer_NW3z .searchBarLoadingRing_YnHq{left:auto;right:10px}html[dir=rtl] .navbar__search-input{padding:0 2.25em 0 .5em}.loadingRing_RJI3{width:20px;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);display:inline-block;position:relative}.loadingRing_RJI3 div{box-sizing:border-box;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color))transparent transparent transparent;border-radius:50%;width:16px;height:16px;margin:2px;animation:1.2s cubic-bezier(.5,0,.5,1) infinite loading-ring_FB5o;display:block;position:absolute}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes loading-ring_FB5o{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.navbarSearchContainer_Bca1:empty{display:none}@media (width<=996px){.navbarSearchContainer_Bca1{right:var(--ifm-navbar-padding-horizontal);position:absolute}}@media (width>=997px){.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical)var(--ifm-navbar-item-padding-horizontal)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast)ease}.navbarHidden_jGov{transform:translateY(calc(-100% - 2px))}@media (width<=996px){.colorModeToggle_DEke{display:none}}.navbar__items--right>:last-child{padding-right:0}.errorBoundaryError_a6uf{white-space:pre-wrap;color:red}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast)var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover{opacity:1}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none;padding-left:.5rem}.hash-link:before{content:"#"}.hash-link:focus,:hover>.hash-link{opacity:1}html,body{height:100%}.mainWrapper_z2l0{flex-direction:column;flex:1 0 auto;display:flex}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{flex-direction:column;min-height:100%;display:flex}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);transition:all var(--ifm-transition-fast)ease;transition-property:border,box-shadow;box-shadow:0 1.5px 3px #00000026}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px #0003}.cardContainer_fWXF :last-child{margin-bottom:0}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.docCardListItem_W1sv{margin-bottom:2rem}.docCardListItem_W1sv>*{height:100%}:root{--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);-webkit-text-decoration:none;text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);padding:.2rem .5rem .3rem;font-size:90%}.tagWithCount_h2kH{border-left:0;align-items:center;padding:0 .5rem 0 1rem;display:flex;position:relative}.tagWithCount_h2kH:before,.tagWithCount_h2kH:after{content:"";border:1px solid var(--docusaurus-tag-list-border);transition:inherit;position:absolute;top:50%}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;width:1.18rem;height:1.18rem;right:100%;transform:translate(50%,-50%)rotate(-45deg)}.tagWithCount_h2kH:after{border-radius:50%;width:.5rem;height:.5rem;left:0;transform:translateY(-50%)}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);color:var(--ifm-color-black);border-radius:var(--ifm-global-radius);margin-left:.3rem;padding:.1rem .4rem;font-size:.7rem;line-height:1.2}.tags_jXut{display:inline}.tag_QGVx{margin:0 .4rem .5rem 0;display:inline-block}.iconEdit_Z9Sw{vertical-align:sub;margin-right:.3em}.lastUpdated_JAkA{margin-top:.2rem;font-size:smaller;font-style:italic}@media (width>=997px){.lastUpdated_JAkA{text-align:right}}.tocCollapsibleButton_TO0P{font-size:inherit;justify-content:space-between;align-items:center;width:100%;padding:.4rem .8rem;display:flex}.tocCollapsibleButton_TO0P:after{content:"";background:var(--ifm-menu-link-sublist-icon)50% 50%/2rem 2rem no-repeat;filter:var(--ifm-menu-link-sublist-icon-filter);width:1.25rem;height:1.25rem;transition:transform var(--ifm-transition-fast);transform:rotate(180deg)}.tocCollapsibleButtonExpanded_MG3E:after{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);padding:.2rem 0;font-size:15px}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tocCollapsibleExpanded_sAul{transform:none}@media (width>=997px){.tocMobile_ITEo{display:none}}@media print{.tocMobile_ITEo{display:none}}.tableOfContents_bqdL{max-height:calc(100vh - (var(--ifm-navbar-height) + 2rem));top:calc(var(--ifm-navbar-height) + 1rem);position:sticky;overflow-y:auto}@media (width<=996px){.tableOfContents_bqdL{display:none}.docItemContainer_F8PC{padding:0 .3rem}}.searchContextInput_mXoe,.searchQueryInput_CFBF{border-radius:var(--ifm-global-radius);border:var(--ifm-global-border-width)solid var(--ifm-color-content-secondary);font-size:var(--ifm-font-size-base);background:var(--ifm-background-color);width:100%;color:var(--ifm-font-color-base);margin-bottom:1rem;padding:.5rem}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItem_U687>h2{margin-bottom:0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);margin:.5rem 0 0;font-size:.8rem}.searchResultItemSummary_oZHr{margin:.5rem 0 0;font-style:italic}@media only screen and (width<=996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (width<=576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);width:3rem;height:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1);box-shadow:var(--ifm-global-shadow-lw);transition:all var(--ifm-transition-fast)var(--ifm-transition-timing-default);opacity:0;visibility:hidden;border-radius:50%;position:fixed;bottom:1.3rem;right:1.3rem;transform:scale(0)}.backToTopButton_sjWU:after{content:" ";-webkit-mask:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem no-repeat;-webkit-mask:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon)50%/2rem 2rem no-repeat;background-color:var(--ifm-color-emphasis-1000);width:100%;height:100%;display:inline-block}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}.backToTopButtonShow_xfvO{opacity:1;visibility:visible;transform:scale(1)}:root{--docusaurus-collapse-button-bg:transparent;--docusaurus-collapse-button-bg-hover:#0000001a}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}@media (width>=997px){.collapseSidebarButton_PEFL{background-color:var(--docusaurus-collapse-button-bg);border:1px solid var(--ifm-toc-border-color);border-radius:0;height:40px;position:sticky;bottom:0;display:block!important}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:hover,.collapseSidebarButton_PEFL:focus{background-color:var(--docusaurus-collapse-button-bg-hover)}}.collapseSidebarButton_PEFL{margin:0;display:none}.menuExternalLink_NmtK{align-items:center}@media (width>=997px){.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical)var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{scrollbar-gutter:stable;padding:.5rem 0 .5rem .5rem}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width);flex-direction:column;display:flex}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{margin:0 var(--ifm-navbar-padding-horizontal);min-height:var(--ifm-navbar-height);max-height:var(--ifm-navbar-height);align-items:center;color:inherit!important;-webkit-text-decoration:none!important;text-decoration:none!important;display:flex!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}}.sidebarLogo_isFc{display:none}@media (width>=997px){.expandButton_TmdG{width:100%;height:100%;transition:background-color var(--ifm-transition-fast)ease;background-color:var(--docusaurus-collapse-button-bg);justify-content:center;align-items:center;display:flex;position:absolute;top:0;right:0}.expandButton_TmdG:hover,.expandButton_TmdG:focus{background-color:var(--docusaurus-collapse-button-bg-hover)}.expandButtonIcon_i1dp{transform:rotate(0)}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}}:root{--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.docSidebarContainer_YfHR{display:none}@media (width>=997px){.docSidebarContainer_YfHR{width:var(--doc-sidebar-width);margin-top:calc(-1*var(--ifm-navbar-height));border-right:1px solid var(--ifm-toc-border-color);will-change:width;transition:width var(--ifm-transition-fast)ease;clip-path:inset(0);display:block}.docSidebarContainerHidden_DPk8{width:var(--doc-sidebar-hidden-width);cursor:pointer}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}}.docMainContainer_TBSr{width:100%;display:flex}@media (width>=997px){.docMainContainer_TBSr{max-width:calc(100% - var(--doc-sidebar-width));flex-grow:1}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}.docRoot_UBD9{width:100%;display:flex}.docsWrapper_hBAB{flex:1 0 auto;display:flex}.details_lb9f{--docusaurus-details-summary-arrow-size:.38rem;--docusaurus-details-transition:transform .2s ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;list-style:none;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{content:"";border-width:var(--docusaurus-details-summary-arrow-size);border-style:solid;border-color:transparent transparent transparent var(--docusaurus-details-decoration-color);transition:var(--docusaurus-details-transition);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2)50%;position:absolute;top:.45rem;left:0;transform:rotate(0)}.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before{transform:rotate(90deg)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child{margin-bottom:0}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast)ease;margin:0 0 var(--ifm-spacing-vertical);border:1px solid var(--ifm-alert-border-color)}.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color);margin-bottom:var(--ifm-leading);box-shadow:var(--ifm-global-shadow-lw);border-radius:var(--ifm-code-border-radius)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockStandalone_MEMb{padding:0}.codeBlockLines_e6Vv{font:inherit;float:left;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{padding:var(--ifm-pre-padding)0;display:table}@media print{.codeBlockLines_e6Vv{white-space:pre-wrap}}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.codeLine_lJS_{counter-increment:line-count;display:table-row}.codeLineNumber_Tfdd{text-align:right;width:1%;padding:0 var(--ifm-pre-padding);background:var(--ifm-pre-background);overflow-wrap:normal;display:table-cell;position:sticky;left:0}.codeLineNumber_Tfdd:before{content:counter(line-count);opacity:.4}.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_Vdqa{opacity:1!important}.copyButtonIcons_IEyt{width:1.125rem;height:1.125rem;position:relative}.copyButtonIcon_TrPX,.copyButtonSuccessIcon_cVMy{fill:currentColor;opacity:inherit;width:inherit;height:inherit;transition:all var(--ifm-transition-fast)ease;position:absolute;top:0;left:0}.copyButtonSuccessIcon_cVMy{opacity:0;color:#00d600;top:50%;left:50%;transform:translate(-50%,-50%)scale(.33)}.copyButtonCopied_Vdqa .copyButtonIcon_TrPX{opacity:0;transform:scale(.33)}.copyButtonCopied_Vdqa .copyButtonSuccessIcon_cVMy{opacity:1;transition-delay:75ms;transform:translate(-50%,-50%)scale(1)}.tabList__CuJ{margin-bottom:var(--ifm-leading)}.tabItem_LNqP{margin-top:0!important}.tabItem_Ymn6>:last-child{margin-bottom:0}.required_k7Xu{font-size:var(--ifm-code-font-size);color:var(--ifm-color-danger)}.deprecated_iwIh{font-size:var(--ifm-code-font-size);color:var(--ifm-color-warning)}.readOnly_RjRF{font-size:var(--ifm-code-font-size);color:var(--ifm-color-info-darker)}.writeOnly_QX6I{font-size:var(--ifm-code-font-size);color:var(--ifm-color-primary-darker)}.constant_erHY{font-size:var(--ifm-code-font-size);color:var(--ifm-color-secondary-darkest)}.wordWrapButtonIcon_b1P5{width:1.2rem;height:1.2rem}.wordWrapButtonEnabled_uzNF .wordWrapButtonIcon_b1P5{color:var(--ifm-color-primary)}.buttonGroup_M5ko{right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2);column-gap:.2rem;display:flex;position:absolute}.buttonGroup_M5ko button{background:var(--prism-background-color);color:var(--prism-color);border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);transition:opacity var(--ifm-transition-fast)ease-in-out;opacity:0;align-items:center;padding:.4rem;line-height:0;display:flex}.buttonGroup_M5ko button:focus-visible,.buttonGroup_M5ko button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup_M5ko button{opacity:.4}.codeBlockContent_QJqH{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_OeMC{border-bottom:1px solid var(--ifm-color-emphasis-300);font-size:var(--ifm-code-font-size);padding:.75rem var(--ifm-pre-padding);border-top-left-radius:inherit;border-top-right-radius:inherit;font-weight:500}.codeBlockTitle_OeMC+.codeBlockContent_QJqH .codeBlock_a8dz{border-top-left-radius:0;border-top-right-radius:0}.schemaItem_buZn{padding:5px 0 5px 1rem;list-style:none;position:relative;border-left:thin solid var(--ifm-color-gray-500)!important;margin:0!important}.schemaItem_buZn:hover,.schemaItem_buZn:focus{background-color:var(--ifm-menu-color-background-active)}[class^=schemaItem]:before{border-bottom:thin solid var(--ifm-color-gray-500);content:"";vertical-align:top;width:.7rem;height:.5rem;display:inline-block;position:absolute;top:10px;left:0}.schemaName_Rg3q{opacity:.6}.strikethrough_g4yO{-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-aria-container{position:absolute;left:-999em}.monaco-editor .selection-anchor{background-color:#007acc;width:2px!important}.monaco-editor .bracket-match{box-sizing:border-box;background-color:var(--vscode-editorBracketMatch-background);border:1px solid var(--vscode-editorBracketMatch-border)}.inline-editor-progress-decoration{width:1em;height:1em;display:inline-block}.inline-progress-widget{justify-content:center;align-items:center;display:flex!important}.inline-progress-widget .icon{font-size:80%!important}.inline-progress-widget:hover .icon{animation:none;font-size:90%!important}.inline-progress-widget:hover .icon:before{content:var(--vscode-icon-x-content);font-family:var(--vscode-icon-x-font-family)}.monaco-editor .monaco-editor-overlaymessage{z-index:10000;padding-bottom:8px}.monaco-editor .monaco-editor-overlaymessage.below{z-index:10000;padding-top:8px;padding-bottom:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.monaco-editor .monaco-editor-overlaymessage.fadeIn{animation:.15s ease-out fadeIn}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.monaco-editor .monaco-editor-overlaymessage.fadeOut{animation:.1s ease-out fadeOut}.monaco-editor .monaco-editor-overlaymessage .message{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-inputValidation-infoBorder);border-radius:3px;padding:2px 4px}.monaco-editor .monaco-editor-overlaymessage .message p{margin-block:0}.monaco-editor .monaco-editor-overlaymessage .message a{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-editor-overlaymessage .message a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor.hc-black .monaco-editor-overlaymessage .message,.monaco-editor.hc-light .monaco-editor-overlaymessage .message{border-width:2px}.monaco-editor .monaco-editor-overlaymessage .anchor{z-index:1000;border:8px solid #0000;position:absolute;left:2px;width:0!important;height:0!important}.monaco-editor .monaco-editor-overlaymessage .anchor.top{border-bottom-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage .anchor.below{border-top-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage:not(.below) .anchor.top,.monaco-editor .monaco-editor-overlaymessage.below .anchor.below{display:none}.monaco-editor .monaco-editor-overlaymessage.below .anchor.top{display:inherit;top:-8px}.monaco-editor .rendered-markdown kbd{background-color:var(--vscode-keybindingLabel-background);color:var(--vscode-keybindingLabel-foreground);border-style:solid;border-width:1px;border-color:var(--vscode-keybindingLabel-border);border-bottom-color:var(--vscode-keybindingLabel-bottomBorder);box-shadow:inset 0 -1px 0 var(--vscode-widget-shadow);vertical-align:middle;border-radius:3px;padding:1px 3px}.rendered-markdown li:has(input[type=checkbox]){list-style-type:none}.monaco-text-button{box-sizing:border-box;text-align:center;cursor:pointer;border:1px solid var(--vscode-button-border,transparent);border-radius:2px;justify-content:center;align-items:center;width:100%;padding:4px;line-height:18px;display:flex}.monaco-text-button:focus{outline-offset:2px!important}.monaco-text-button:hover{-webkit-text-decoration:none!important;text-decoration:none!important}.monaco-button.disabled:focus,.monaco-button.disabled{cursor:default;opacity:.4!important}.monaco-text-button .codicon{margin:0 .2em;color:inherit!important}.monaco-text-button.monaco-text-button-with-short-label{flex-flow:wrap;height:28px;padding:0 4px;overflow:hidden}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label{flex-basis:100%}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label-short{flex-grow:1;width:0;overflow:hidden}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label,.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label-short{font-weight:400;font-style:inherit;justify-content:center;align-items:center;padding:4px 0;display:flex}.monaco-button-dropdown{cursor:pointer;display:flex}.monaco-button-dropdown.disabled{cursor:default}.monaco-button-dropdown>.monaco-button:focus{outline-offset:-1px!important}.monaco-button-dropdown.disabled>.monaco-button.disabled,.monaco-button-dropdown.disabled>.monaco-button.disabled:focus,.monaco-button-dropdown.disabled>.monaco-button-dropdown-separator{opacity:.4!important}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-right-width:0!important}.monaco-button-dropdown .monaco-button-dropdown-separator{cursor:default;padding:4px 0}.monaco-button-dropdown .monaco-button-dropdown-separator>div{width:1px;height:100%}.monaco-button-dropdown>.monaco-button.monaco-dropdown-button{border:1px solid var(--vscode-button-border,transparent);border-radius:0 2px 2px 0;align-items:center;display:flex;border-left-width:0!important}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-radius:2px 0 0 2px}.monaco-description-button{flex-direction:column;align-items:center;margin:4px 5px;display:flex}.monaco-description-button .monaco-button-description{padding:4px 20px;font-size:11px;font-style:italic}.monaco-description-button .monaco-button-label,.monaco-description-button .monaco-button-description{justify-content:center;align-items:center;display:flex}.monaco-description-button .monaco-button-label>.codicon,.monaco-description-button .monaco-button-description>.codicon{margin:0 .2em;color:inherit!important}.monaco-button.default-colors,.monaco-button-dropdown.default-colors>.monaco-button{color:var(--vscode-button-foreground);background-color:var(--vscode-button-background)}.monaco-button.default-colors:hover,.monaco-button-dropdown.default-colors>.monaco-button:hover{background-color:var(--vscode-button-hoverBackground)}.monaco-button.default-colors.secondary,.monaco-button-dropdown.default-colors>.monaco-button.secondary{color:var(--vscode-button-secondaryForeground);background-color:var(--vscode-button-secondaryBackground)}.monaco-button.default-colors.secondary:hover,.monaco-button-dropdown.default-colors>.monaco-button.secondary:hover{background-color:var(--vscode-button-secondaryHoverBackground)}.monaco-button-dropdown.default-colors .monaco-button-dropdown-separator{background-color:var(--vscode-button-background);border-top:1px solid var(--vscode-button-border);border-bottom:1px solid var(--vscode-button-border)}.monaco-button-dropdown.default-colors .monaco-button.secondary+.monaco-button-dropdown-separator{background-color:var(--vscode-button-secondaryBackground)}.monaco-button-dropdown.default-colors .monaco-button-dropdown-separator>div{background-color:var(--vscode-button-separator)}.post-edit-widget{box-shadow:0 0 8px 2px var(--vscode-widget-shadow);border:1px solid var(--vscode-widget-border,transparent);background-color:var(--vscode-editorWidget-background);border-radius:4px;overflow:hidden}.post-edit-widget .monaco-button{border:none;border-radius:0;padding:2px}.post-edit-widget .monaco-button:hover{background-color:var(--vscode-button-secondaryHoverBackground)!important}.post-edit-widget .monaco-button .codicon{margin:0}@font-face{font-family:codicon;font-display:block;src:url(/multi-scrobbler/assets/fonts/codicon-f6283f7ccaed1249d9ebbcc5a55d5970.ttf)format("truetype")}.codicon[class*=codicon-]{text-rendering:auto;text-align:center;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-select:none;user-select:none;font:16px/1 codicon;-webkit-text-decoration:none;text-decoration:none;display:inline-block}.codicon-wrench-subaction{opacity:.5}@keyframes codicon-spin{to{transform:rotate(360deg)}}.codicon-sync.codicon-modifier-spin,.codicon-loading.codicon-modifier-spin,.codicon-gear.codicon-modifier-spin,.codicon-notebook-state-executing.codicon-modifier-spin{animation:1.5s steps(30,end) infinite codicon-spin}.codicon-modifier-disabled{opacity:.4}.codicon-loading,.codicon-tree-item-loading:before{animation-duration:1s!important;animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important}.monaco-editor .codicon.codicon-symbol-array,.monaco-workbench .codicon.codicon-symbol-array{color:var(--vscode-symbolIcon-arrayForeground)}.monaco-editor .codicon.codicon-symbol-boolean,.monaco-workbench .codicon.codicon-symbol-boolean{color:var(--vscode-symbolIcon-booleanForeground)}.monaco-editor .codicon.codicon-symbol-class,.monaco-workbench .codicon.codicon-symbol-class{color:var(--vscode-symbolIcon-classForeground)}.monaco-editor .codicon.codicon-symbol-method,.monaco-workbench .codicon.codicon-symbol-method{color:var(--vscode-symbolIcon-methodForeground)}.monaco-editor .codicon.codicon-symbol-color,.monaco-workbench .codicon.codicon-symbol-color{color:var(--vscode-symbolIcon-colorForeground)}.monaco-editor .codicon.codicon-symbol-constant,.monaco-workbench .codicon.codicon-symbol-constant{color:var(--vscode-symbolIcon-constantForeground)}.monaco-editor .codicon.codicon-symbol-constructor,.monaco-workbench .codicon.codicon-symbol-constructor{color:var(--vscode-symbolIcon-constructorForeground)}.monaco-editor .codicon.codicon-symbol-value,.monaco-workbench .codicon.codicon-symbol-value,.monaco-editor .codicon.codicon-symbol-enum,.monaco-workbench .codicon.codicon-symbol-enum{color:var(--vscode-symbolIcon-enumeratorForeground)}.monaco-editor .codicon.codicon-symbol-enum-member,.monaco-workbench .codicon.codicon-symbol-enum-member{color:var(--vscode-symbolIcon-enumeratorMemberForeground)}.monaco-editor .codicon.codicon-symbol-event,.monaco-workbench .codicon.codicon-symbol-event{color:var(--vscode-symbolIcon-eventForeground)}.monaco-editor .codicon.codicon-symbol-field,.monaco-workbench .codicon.codicon-symbol-field{color:var(--vscode-symbolIcon-fieldForeground)}.monaco-editor .codicon.codicon-symbol-file,.monaco-workbench .codicon.codicon-symbol-file{color:var(--vscode-symbolIcon-fileForeground)}.monaco-editor .codicon.codicon-symbol-folder,.monaco-workbench .codicon.codicon-symbol-folder{color:var(--vscode-symbolIcon-folderForeground)}.monaco-editor .codicon.codicon-symbol-function,.monaco-workbench .codicon.codicon-symbol-function{color:var(--vscode-symbolIcon-functionForeground)}.monaco-editor .codicon.codicon-symbol-interface,.monaco-workbench .codicon.codicon-symbol-interface{color:var(--vscode-symbolIcon-interfaceForeground)}.monaco-editor .codicon.codicon-symbol-key,.monaco-workbench .codicon.codicon-symbol-key{color:var(--vscode-symbolIcon-keyForeground)}.monaco-editor .codicon.codicon-symbol-keyword,.monaco-workbench .codicon.codicon-symbol-keyword{color:var(--vscode-symbolIcon-keywordForeground)}.monaco-editor .codicon.codicon-symbol-module,.monaco-workbench .codicon.codicon-symbol-module{color:var(--vscode-symbolIcon-moduleForeground)}.monaco-editor .codicon.codicon-symbol-namespace,.monaco-workbench .codicon.codicon-symbol-namespace{color:var(--vscode-symbolIcon-namespaceForeground)}.monaco-editor .codicon.codicon-symbol-null,.monaco-workbench .codicon.codicon-symbol-null{color:var(--vscode-symbolIcon-nullForeground)}.monaco-editor .codicon.codicon-symbol-number,.monaco-workbench .codicon.codicon-symbol-number{color:var(--vscode-symbolIcon-numberForeground)}.monaco-editor .codicon.codicon-symbol-object,.monaco-workbench .codicon.codicon-symbol-object{color:var(--vscode-symbolIcon-objectForeground)}.monaco-editor .codicon.codicon-symbol-operator,.monaco-workbench .codicon.codicon-symbol-operator{color:var(--vscode-symbolIcon-operatorForeground)}.monaco-editor .codicon.codicon-symbol-package,.monaco-workbench .codicon.codicon-symbol-package{color:var(--vscode-symbolIcon-packageForeground)}.monaco-editor .codicon.codicon-symbol-property,.monaco-workbench .codicon.codicon-symbol-property{color:var(--vscode-symbolIcon-propertyForeground)}.monaco-editor .codicon.codicon-symbol-reference,.monaco-workbench .codicon.codicon-symbol-reference{color:var(--vscode-symbolIcon-referenceForeground)}.monaco-editor .codicon.codicon-symbol-snippet,.monaco-workbench .codicon.codicon-symbol-snippet{color:var(--vscode-symbolIcon-snippetForeground)}.monaco-editor .codicon.codicon-symbol-string,.monaco-workbench .codicon.codicon-symbol-string{color:var(--vscode-symbolIcon-stringForeground)}.monaco-editor .codicon.codicon-symbol-struct,.monaco-workbench .codicon.codicon-symbol-struct{color:var(--vscode-symbolIcon-structForeground)}.monaco-editor .codicon.codicon-symbol-text,.monaco-workbench .codicon.codicon-symbol-text{color:var(--vscode-symbolIcon-textForeground)}.monaco-editor .codicon.codicon-symbol-type-parameter,.monaco-workbench .codicon.codicon-symbol-type-parameter{color:var(--vscode-symbolIcon-typeParameterForeground)}.monaco-editor .codicon.codicon-symbol-unit,.monaco-workbench .codicon.codicon-symbol-unit{color:var(--vscode-symbolIcon-unitForeground)}.monaco-editor .codicon.codicon-symbol-variable,.monaco-workbench .codicon.codicon-symbol-variable{color:var(--vscode-symbolIcon-variableForeground)}.monaco-editor .lightBulbWidget{justify-content:center;align-items:center;display:flex}.monaco-editor .lightBulbWidget:hover{cursor:pointer}.monaco-editor .lightBulbWidget.codicon-light-bulb,.monaco-editor .lightBulbWidget.codicon-lightbulb-sparkle{color:var(--vscode-editorLightBulb-foreground)}.monaco-editor .lightBulbWidget.codicon-lightbulb-autofix,.monaco-editor .lightBulbWidget.codicon-lightbulb-sparkle-autofix{color:var(--vscode-editorLightBulbAutoFix-foreground,var(--vscode-editorLightBulb-foreground))}.monaco-editor .lightBulbWidget.codicon-sparkle-filled{color:var(--vscode-editorLightBulbAi-foreground,var(--vscode-icon-foreground))}.monaco-editor .lightBulbWidget:before{z-index:2;position:relative}.monaco-editor .lightBulbWidget:after{content:"";opacity:.3;z-index:1;width:100%;height:100%;display:block;position:absolute;top:0;left:0}.monaco-editor .glyph-margin-widgets .cgmr[class*=codicon-gutter-lightbulb]{cursor:pointer;display:block}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb,.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-sparkle{color:var(--vscode-editorLightBulb-foreground)}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-auto-fix,.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-aifix-auto-fix{color:var(--vscode-editorLightBulbAutoFix-foreground,var(--vscode-editorLightBulb-foreground))}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-sparkle-filled{color:var(--vscode-editorLightBulbAi-foreground,var(--vscode-icon-foreground))}.monaco-list{white-space:nowrap;width:100%;height:100%;position:relative}.monaco-list.mouse-support{-webkit-user-select:none;user-select:none}.monaco-list>.monaco-scrollable-element{height:100%}.monaco-list-rows{width:100%;height:100%;position:relative}.monaco-list.horizontal-scrolling .monaco-list-rows{width:auto;min-width:100%}.monaco-list-row{box-sizing:border-box;width:100%;position:absolute;overflow:hidden}.monaco-list.mouse-support .monaco-list-row{cursor:pointer;touch-action:none}.monaco-list .monaco-scrollable-element>.scrollbar.vertical,.monaco-pane-view>.monaco-split-view2.vertical>.monaco-scrollable-element>.scrollbar.vertical{z-index:14}.monaco-list-row.scrolling{display:none!important}.monaco-list.element-focused,.monaco-list.selection-single,.monaco-list.selection-multiple{outline:0!important}.monaco-drag-image{z-index:1000;border-radius:10px;padding:1px 7px;font-size:12px;display:inline-block;position:absolute}.monaco-list-type-filter-message{box-sizing:border-box;text-align:center;white-space:normal;opacity:.7;pointer-events:none;width:100%;height:100%;padding:40px 1em 1em;position:absolute;top:0;left:0}.monaco-list-type-filter-message:empty{display:none}.monaco-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.monaco-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.monaco-scrollable-element>.invisible{opacity:0;pointer-events:none}.monaco-scrollable-element>.invisible.fade{transition:opacity .8s linear}.monaco-scrollable-element>.shadow{display:none;position:absolute}.monaco-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow)0 6px 6px -6px inset;display:block;top:0;left:3px}.monaco-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow)6px 0 6px -6px inset;display:block;top:3px;left:0}.monaco-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.monaco-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow)6px 0 6px -6px inset}.monaco-scrollable-element>.scrollbar>.slider{background:var(--vscode-scrollbarSlider-background)}.monaco-scrollable-element>.scrollbar>.slider:hover{background:var(--vscode-scrollbarSlider-hoverBackground)}.monaco-scrollable-element>.scrollbar>.slider.active{background:var(--vscode-scrollbarSlider-activeBackground)}.monaco-select-box-dropdown-padding{--dropdown-padding-top:1px;--dropdown-padding-bottom:1px}.hc-black .monaco-select-box-dropdown-padding,.hc-light .monaco-select-box-dropdown-padding{--dropdown-padding-top:3px;--dropdown-padding-bottom:4px}.monaco-select-box-dropdown-container{box-sizing:border-box;display:none}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown *{margin:0}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown a:focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown code{line-height:15px;font-family:var(--monaco-monospace-font)}.monaco-select-box-dropdown-container.visible{text-align:left;border-bottom-right-radius:3px;border-bottom-left-radius:3px;flex-direction:column;width:1px;display:flex;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container{padding-top:var(--dropdown-padding-top);padding-bottom:var(--dropdown-padding-bottom);box-sizing:border-box;flex:none;align-self:flex-start;width:100%;padding-left:1px;padding-right:1px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-details-pane{padding:5px}.hc-black .monaco-select-box-dropdown-container>.select-box-dropdown-list-container{padding-top:var(--dropdown-padding-top);padding-bottom:var(--dropdown-padding-bottom)}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row{cursor:pointer}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-text{text-overflow:ellipsis;white-space:nowrap;float:left;padding-left:3.5px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-detail{text-overflow:ellipsis;white-space:nowrap;float:left;opacity:.7;padding-left:3.5px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-decorator-right{text-overflow:ellipsis;white-space:nowrap;float:right;padding-right:10px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.visually-hidden{width:1px;height:1px;position:absolute;top:auto;left:-10000px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control{opacity:0;flex:auto;align-self:flex-start}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control>.width-control-div{max-height:0;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control>.width-control-div>.option-text-width-control{white-space:nowrap;padding-left:4px;padding-right:8px}.monaco-select-box{cursor:pointer;border-radius:2px;width:100%}.monaco-select-box-dropdown-container{text-transform:none;font-size:13px;font-weight:400}.monaco-action-bar .action-item.select-container{cursor:default}.monaco-action-bar .action-item .monaco-select-box{cursor:pointer;min-width:100px;min-height:18px;padding:2px 23px 2px 8px}.mac .monaco-action-bar .action-item .monaco-select-box{border-radius:5px;font-size:11px}.monaco-action-bar{white-space:nowrap;height:100%}.monaco-action-bar .actions-container{align-items:center;width:100%;height:100%;margin:0 auto;padding:0;display:flex}.monaco-action-bar.vertical .actions-container{display:inline-block}.monaco-action-bar .action-item{cursor:pointer;justify-content:center;align-items:center;display:block;position:relative}.monaco-action-bar .action-item.disabled{cursor:default}.monaco-action-bar .action-item .icon,.monaco-action-bar .action-item .codicon{display:block}.monaco-action-bar .action-item .codicon{align-items:center;width:16px;height:16px;display:flex}.monaco-action-bar .action-label{border-radius:5px;padding:3px;font-size:11px;display:flex}.monaco-action-bar .action-item.disabled .action-label,.monaco-action-bar .action-item.disabled .action-label:before,.monaco-action-bar .action-item.disabled .action-label:hover{color:var(--vscode-disabledForeground)}.monaco-action-bar.vertical{text-align:left}.monaco-action-bar.vertical .action-item{display:block}.monaco-action-bar.vertical .action-label.separator{border-bottom:1px solid #bbb;margin-left:.8em;margin-right:.8em;padding-top:1px;display:block}.monaco-action-bar .action-item .action-label.separator{cursor:default;background-color:#bbb;width:1px;min-width:1px;height:16px;padding:0;margin:5px 4px!important}.secondary-actions .monaco-action-bar .action-label{margin-left:6px}.monaco-action-bar .action-item.select-container{flex:1;justify-content:center;align-items:center;min-width:60px;max-width:170px;margin-right:10px;display:flex;overflow:hidden}.monaco-action-bar .action-item.action-dropdown-item{display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-dropdown-item-separator{cursor:default;align-items:center;display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-dropdown-item-separator>div{width:1px}.action-widget{z-index:40;background-color:var(--vscode-editorActionList-background);width:100%;min-width:160px;max-width:80vw;color:var(--vscode-editorActionList-foreground);box-shadow:0 2px 8px var(--vscode-widget-shadow);border-radius:5px;padding:4px;font-size:13px;display:block;border:1px solid var(--vscode-editorWidget-border)!important}.context-view-block{cursor:initial;z-index:-1;width:100%;height:100%;position:fixed;top:0;left:0}.context-view-pointerBlock{cursor:initial;z-index:2;width:100%;height:100%;position:fixed;top:0;left:0}.action-widget .monaco-list{-webkit-user-select:none;user-select:none;border:0!important}.action-widget .monaco-list:focus:before{outline:0!important}.action-widget .monaco-list .monaco-scrollable-element{overflow:visible}.action-widget .monaco-list .monaco-list-row{white-space:nowrap;cursor:pointer;touch-action:none;border-radius:4px;width:100%;padding:0 10px}.action-widget .monaco-list .monaco-list-row.action.focused:not(.option-disabled){color:var(--vscode-editorActionList-focusForeground);outline:1px solid var(--vscode-menu-selectionBorder,transparent);outline-offset:-1px;background-color:var(--vscode-editorActionList-focusBackground)!important}.action-widget .monaco-list-row.group-header{font-size:12px;font-weight:600;color:var(--vscode-descriptionForeground)!important}.action-widget .monaco-list-row.group-header:not(:first-of-type){margin-top:2px}.action-widget .monaco-list .group-header,.action-widget .monaco-list .option-disabled,.action-widget .monaco-list .option-disabled:before,.action-widget .monaco-list .option-disabled .focused,.action-widget .monaco-list .option-disabled .focused:before{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:default!important;background-color:#0000!important;outline:0 solid!important}.action-widget .monaco-list-row.action{align-items:center;gap:8px;display:flex}.action-widget .monaco-list-row.action.option-disabled,.action-widget .monaco-list:focus .monaco-list-row.focused.action.option-disabled,.action-widget .monaco-list-row.action.option-disabled .codicon,.action-widget .monaco-list:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused).option-disabled{color:var(--vscode-disabledForeground)}.action-widget .monaco-list-row.action:not(.option-disabled) .codicon{color:inherit}.action-widget .monaco-list-row.action .title{text-overflow:ellipsis;flex:1;overflow:hidden}.action-widget .monaco-list-row.action .monaco-keybinding>.monaco-keybinding-key{background-color:var(--vscode-keybindingLabel-background);color:var(--vscode-keybindingLabel-foreground);border-style:solid;border-width:1px;border-color:var(--vscode-keybindingLabel-border);border-bottom-color:var(--vscode-keybindingLabel-bottomBorder);box-shadow:inset 0 -1px 0 var(--vscode-widget-shadow);border-radius:3px}.action-widget .action-widget-action-bar{background-color:var(--vscode-editorActionList-background);border-top:1px solid var(--vscode-editorHoverWidget-border);margin-top:2px}.action-widget .action-widget-action-bar:before{content:"";width:100%;display:block}.action-widget .action-widget-action-bar .actions-container{padding:3px 8px 0}.action-widget-action-bar .action-label{color:var(--vscode-textLink-activeForeground);pointer-events:all;padding:0;font-size:12px;line-height:22px}.action-widget-action-bar .action-item{pointer-events:none;margin-right:16px}.action-widget-action-bar .action-label:hover{background-color:#0000!important}.monaco-action-bar .actions-container.highlight-toggled .action-label.checked{background:var(--vscode-actionBar-toggledBackground)!important}.monaco-keybinding{align-items:center;line-height:10px;display:flex}.monaco-keybinding>.monaco-keybinding-key{vertical-align:middle;border-style:solid;border-width:1px;border-radius:3px;margin:0 2px;padding:3px 5px;font-size:11px;display:inline-block}.monaco-keybinding>.monaco-keybinding-key:first-child{margin-left:0}.monaco-keybinding>.monaco-keybinding-key:last-child{margin-right:0}.monaco-keybinding>.monaco-keybinding-key-separator{display:inline-block}.monaco-keybinding>.monaco-keybinding-key-chord-separator{width:6px}::-ms-clear{display:none}.monaco-editor .editor-widget input{color:inherit}.monaco-editor{-webkit-text-size-adjust:100%;color:var(--vscode-editor-foreground);background-color:var(--vscode-editor-background);overflow-wrap:initial;position:relative;overflow:visible}.monaco-editor-background{background-color:var(--vscode-editor-background)}.monaco-editor .rangeHighlight{background-color:var(--vscode-editor-rangeHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-rangeHighlightBorder)}.monaco-editor.hc-black .rangeHighlight,.monaco-editor.hc-light .rangeHighlight{border-style:dotted}.monaco-editor .symbolHighlight{background-color:var(--vscode-editor-symbolHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-symbolHighlightBorder)}.monaco-editor.hc-black .symbolHighlight,.monaco-editor.hc-light .symbolHighlight{border-style:dotted}.monaco-editor .overflow-guard{position:relative;overflow:hidden}.monaco-editor .view-overlays{position:absolute;top:0}.monaco-editor .view-overlays>div,.monaco-editor .margin-view-overlays>div{width:100%;position:absolute}.monaco-editor .squiggly-error{border-bottom:4px double var(--vscode-editorError-border)}.monaco-editor .squiggly-error:before{content:"";background:var(--vscode-editorError-background);width:100%;height:100%;display:block}.monaco-editor .squiggly-warning{border-bottom:4px double var(--vscode-editorWarning-border)}.monaco-editor .squiggly-warning:before{content:"";background:var(--vscode-editorWarning-background);width:100%;height:100%;display:block}.monaco-editor .squiggly-info{border-bottom:4px double var(--vscode-editorInfo-border)}.monaco-editor .squiggly-info:before{content:"";background:var(--vscode-editorInfo-background);width:100%;height:100%;display:block}.monaco-editor .squiggly-hint{border-bottom:2px dotted var(--vscode-editorHint-border)}.monaco-editor.showUnused .squiggly-unnecessary{border-bottom:2px dashed var(--vscode-editorUnnecessaryCode-border)}.monaco-editor.showDeprecated .squiggly-inline-deprecated{-webkit-text-decoration:line-through;text-decoration:line-through;-webkit-text-decoration-color:var(--vscode-editor-foreground,inherit);text-decoration-color:var(--vscode-editor-foreground,inherit)}.monaco-editor .inputarea{resize:none;color:#0000;z-index:-10;background-color:#0000;border:none;min-width:0;min-height:0;margin:0;padding:0;position:absolute;overflow:hidden;outline:none!important}.monaco-editor .inputarea.ime-input{z-index:10;caret-color:var(--vscode-editorCursor-foreground);color:var(--vscode-editor-foreground)}.monaco-editor .margin-view-overlays .line-numbers{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;text-align:right;vertical-align:middle;box-sizing:border-box;cursor:default;display:inline-block;position:absolute;bottom:0}.monaco-editor .relative-current-line-number{text-align:left;width:100%;display:inline-block}.monaco-editor .margin-view-overlays .line-numbers.lh-odd{margin-top:1px}.monaco-editor .line-numbers{color:var(--vscode-editorLineNumber-foreground)}.monaco-editor .line-numbers.active-line-number{color:var(--vscode-editorLineNumber-activeForeground)}.monaco-editor .margin{background-color:var(--vscode-editorGutter-background)}.monaco-mouse-cursor-text{cursor:text}.monaco-editor .blockDecorations-container{pointer-events:none;position:absolute;top:0}.monaco-editor .blockDecorations-block{box-sizing:border-box;position:absolute}.monaco-editor .view-overlays .current-line,.monaco-editor .margin-view-overlays .current-line{box-sizing:border-box;height:100%;display:block;position:absolute;top:0;left:0}.monaco-editor .margin-view-overlays .current-line.current-line-margin.current-line-margin-both{border-right:0}.monaco-editor .lines-content .cdr{height:100%;position:absolute}.monaco-editor .glyph-margin{position:absolute;top:0}.monaco-editor .glyph-margin-widgets .cgmr{justify-content:center;align-items:center;display:flex;position:absolute}.monaco-editor .glyph-margin-widgets .cgmr.codicon-modifier-spin:before{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.monaco-editor .lines-content .core-guide{box-sizing:border-box;height:100%;position:absolute}.mtkcontrol{color:#fff!important;background:#960000!important}.mtkoverflow{background-color:var(--vscode-button-background,var(--vscode-editor-background));color:var(--vscode-button-foreground,var(--vscode-editor-foreground));border-style:solid;border-width:1px;border-color:var(--vscode-contrastBorder);cursor:pointer;border-radius:2px;padding:4px}.mtkoverflow:hover{background-color:var(--vscode-button-hoverBackground)}.monaco-editor.no-user-select .lines-content,.monaco-editor.no-user-select .view-line,.monaco-editor.no-user-select .view-lines{-webkit-user-select:none;user-select:none}.monaco-editor.mac .lines-content:hover,.monaco-editor.mac .view-line:hover,.monaco-editor.mac .view-lines:hover{-webkit-user-select:text;user-select:text}.monaco-editor.enable-user-select{user-select:initial;-webkit-user-select:initial}.monaco-editor .view-lines{white-space:nowrap}.monaco-editor .view-line{width:100%;position:absolute}.monaco-editor .lines-content>.view-lines>.view-line>span{position:absolute;top:0;bottom:0}.monaco-editor .mtkw{color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .mtkz{display:inline-block;color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .lines-decorations{background:#fff;position:absolute;top:0}.monaco-editor .margin-view-overlays .cldr{height:100%;position:absolute}.monaco-editor .margin-view-overlays .cmdr{width:100%;height:100%;position:absolute;left:0}.monaco-editor .minimap.slider-mouseover .minimap-slider{opacity:0;transition:opacity .1s linear}.monaco-editor .minimap.slider-mouseover:hover .minimap-slider,.monaco-editor .minimap.slider-mouseover .minimap-slider.active{opacity:1}.monaco-editor .minimap-slider .minimap-slider-horizontal{background:var(--vscode-minimapSlider-background)}.monaco-editor .minimap-slider:hover .minimap-slider-horizontal{background:var(--vscode-minimapSlider-hoverBackground)}.monaco-editor .minimap-slider.active .minimap-slider-horizontal{background:var(--vscode-minimapSlider-activeBackground)}.monaco-editor .minimap-shadow-visible{box-shadow:var(--vscode-scrollbar-shadow)-6px 0 6px -6px inset}.monaco-editor .minimap-shadow-hidden{width:0;position:absolute}.monaco-editor .minimap-shadow-visible{width:6px;position:absolute;left:-6px}.monaco-editor.no-minimap-shadow .minimap-shadow-visible{width:1px;position:absolute;left:-1px}.minimap.autohide{opacity:0;transition:opacity .5s}.minimap.autohide:hover{opacity:1}.monaco-editor .minimap{z-index:5}.monaco-editor .overlayWidgets{position:absolute;top:0;left:0}.monaco-editor .view-ruler{box-shadow:1px 0 0 0 var(--vscode-editorRuler-foreground)inset;position:absolute;top:0}.monaco-editor .scroll-decoration{height:6px;box-shadow:var(--vscode-scrollbar-shadow)0 6px 6px -6px inset;position:absolute;top:0;left:0}.monaco-editor .lines-content .cslr{position:absolute}.monaco-editor .focused .selected-text{background-color:var(--vscode-editor-selectionBackground)}.monaco-editor .selected-text{background-color:var(--vscode-editor-inactiveSelectionBackground)}.monaco-editor .top-left-radius{border-top-left-radius:3px}.monaco-editor .bottom-left-radius{border-bottom-left-radius:3px}.monaco-editor .top-right-radius{border-top-right-radius:3px}.monaco-editor .bottom-right-radius{border-bottom-right-radius:3px}.monaco-editor.hc-black .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-black .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-black .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-black .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor.hc-light .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-light .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-light .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-light .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor .cursors-layer{position:absolute;top:0}.monaco-editor .cursors-layer>.cursor{box-sizing:border-box;position:absolute;overflow:hidden}.monaco-editor .cursors-layer.cursor-smooth-caret-animation>.cursor{transition:all 80ms}.monaco-editor .cursors-layer.cursor-block-outline-style>.cursor{border-style:solid;border-width:1px;background:0 0!important}.monaco-editor .cursors-layer.cursor-underline-style>.cursor{border-bottom-style:solid;border-bottom-width:2px;background:0 0!important}.monaco-editor .cursors-layer.cursor-underline-thin-style>.cursor{border-bottom-style:solid;border-bottom-width:1px;background:0 0!important}@keyframes monaco-cursor-smooth{0%,20%{opacity:1}60%,to{opacity:0}}@keyframes monaco-cursor-phase{0%,20%{opacity:1}90%,to{opacity:0}}@keyframes monaco-cursor-expand{0%,20%{transform:scaleY(1)}80%,to{transform:scaleY(0)}}.cursor-smooth{animation:.5s ease-in-out 20 alternate monaco-cursor-smooth}.cursor-phase{animation:.5s ease-in-out 20 alternate monaco-cursor-phase}.cursor-expand>.cursor{animation:.5s ease-in-out 20 alternate monaco-cursor-expand}.monaco-editor .mwh{position:absolute;color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .codelens-decoration{text-overflow:ellipsis;white-space:nowrap;color:var(--vscode-editorCodeLens-foreground);line-height:var(--vscode-editorCodeLens-lineHeight);font-size:var(--vscode-editorCodeLens-fontSize);padding-right:calc(var(--vscode-editorCodeLens-fontSize)*.5);font-feature-settings:var(--vscode-editorCodeLens-fontFeatureSettings);font-family:var(--vscode-editorCodeLens-fontFamily),var(--vscode-editorCodeLens-fontFamilyDefault);display:inline-block;overflow:hidden}.monaco-editor .codelens-decoration>span,.monaco-editor .codelens-decoration>a{-webkit-user-select:none;user-select:none;white-space:nowrap;vertical-align:sub}.monaco-editor .codelens-decoration>a{-webkit-text-decoration:none;text-decoration:none}.monaco-editor .codelens-decoration>a:hover{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration>a:hover .codicon{color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration .codicon{vertical-align:middle;color:var(--vscode-editorCodeLens-foreground);line-height:var(--vscode-editorCodeLens-lineHeight);font-size:var(--vscode-editorCodeLens-fontSize);color:currentColor!important}.monaco-editor .codelens-decoration>a:hover .codicon:before{cursor:pointer}@keyframes fadein{0%{opacity:0;visibility:visible}to{opacity:1}}.monaco-editor .codelens-decoration.fadein{animation:.1s linear fadein}.colorpicker-widget{-webkit-user-select:none;user-select:none;height:190px}.colorpicker-color-decoration,.hc-light .colorpicker-color-decoration{box-sizing:border-box;cursor:pointer;border:.1em solid #000;width:.8em;height:.8em;margin:.1em .2em 0;line-height:.8em;display:inline-block}.hc-black .colorpicker-color-decoration,.vs-dark .colorpicker-color-decoration{border:.1em solid #eee}.colorpicker-header{height:24px;image-rendering:pixelated;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=) 0 0/9px 9px;display:flex;position:relative}.colorpicker-header .picked-color{cursor:pointer;color:#fff;white-space:nowrap;flex:1;justify-content:center;align-items:center;width:240px;line-height:24px;display:flex;overflow:hidden}.colorpicker-header .picked-color .picked-color-presentation{white-space:nowrap;margin-left:5px;margin-right:5px}.colorpicker-header .picked-color .codicon{color:inherit;font-size:14px}.colorpicker-header .picked-color.light{color:#000}.colorpicker-header .original-color{width:74px;z-index:inherit;cursor:pointer}.standalone-colorpicker{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.colorpicker-header.standalone-colorpicker{border-bottom:none}.colorpicker-header .close-button{cursor:pointer;background-color:var(--vscode-editorHoverWidget-background);border-left:1px solid var(--vscode-editorHoverWidget-border)}.colorpicker-header .close-button-inner-div{text-align:center;width:100%;height:100%}.colorpicker-header .close-button-inner-div:hover{background-color:var(--vscode-toolbar-hoverBackground)}.colorpicker-header .close-icon{padding:3px}.colorpicker-body{padding:8px;display:flex;position:relative}.colorpicker-body .saturation-wrap{flex:1;min-width:220px;height:150px;position:relative;overflow:hidden}.colorpicker-body .saturation-box{height:150px;position:absolute}.colorpicker-body .saturation-selection{border:1px solid #fff;border-radius:100%;width:9px;height:9px;margin:-5px 0 0 -5px;position:absolute;box-shadow:0 0 2px #000c}.colorpicker-body .strip{width:25px;height:150px}.colorpicker-body .standalone-strip{width:25px;height:122px}.colorpicker-body .hue-strip{cursor:grab;background:linear-gradient(red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);margin-left:8px;position:relative}.colorpicker-body .opacity-strip{cursor:grab;image-rendering:pixelated;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=) 0 0/9px 9px;margin-left:8px;position:relative}.colorpicker-body .strip.grabbing{cursor:grabbing}.colorpicker-body .slider{box-sizing:border-box;border:1px solid #ffffffb5;width:calc(100% + 4px);height:4px;position:absolute;top:0;left:-2px;box-shadow:0 0 1px #000000d9}.colorpicker-body .strip .overlay{pointer-events:none;height:150px}.colorpicker-body .standalone-strip .standalone-overlay{pointer-events:none;height:122px}.standalone-colorpicker-body{border:1px solid #0000;border-bottom:1px solid var(--vscode-editorHoverWidget-border);display:block;overflow:hidden}.colorpicker-body .insert-button{background:var(--vscode-button-background);width:58px;height:20px;color:var(--vscode-button-foreground);cursor:pointer;border:none;border-radius:2px;padding:0;position:absolute;bottom:8px;right:8px}.colorpicker-body .insert-button:hover{background:var(--vscode-button-hoverBackground)}.monaco-editor .inlineSuggestionsHints.withBorder{z-index:39;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .inlineSuggestionsHints a,.monaco-editor .inlineSuggestionsHints a:hover{color:var(--vscode-foreground)}.monaco-editor .inlineSuggestionsHints .keybinding{opacity:.6;margin-left:4px;display:flex}.monaco-editor .inlineSuggestionsHints .keybinding .monaco-keybinding-key{padding:2px 3px;font-size:8px}.monaco-editor .inlineSuggestionsHints .availableSuggestionCount a{justify-content:center;min-width:19px;display:flex}.monaco-editor .inlineSuggestionStatusBarItemLabel{margin-right:2px}.monaco-dropdown{height:100%;padding:0}.monaco-dropdown>.dropdown-label{cursor:pointer;justify-content:center;align-items:center;height:100%;display:flex}.monaco-dropdown>.dropdown-label>.action-label.disabled{cursor:default}.monaco-dropdown-with-primary{border-radius:5px;flex-direction:row;display:flex!important}.monaco-dropdown-with-primary>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{margin-left:-3px;padding-left:0;padding-right:0;font-size:12px;line-height:16px}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{background-position:50%;background-repeat:no-repeat;background-size:16px;display:block}.monaco-action-bar .action-item.menu-entry .action-label.icon{background-position:50%;background-repeat:no-repeat;background-size:16px;width:16px;height:16px}.monaco-action-bar .action-item.menu-entry.text-only .action-label{color:var(--vscode-descriptionForeground);border-radius:2px;overflow:hidden}.monaco-action-bar .action-item.menu-entry.text-only.use-comma:not(:last-of-type) .action-label:after{content:", "}.monaco-action-bar .action-item.menu-entry.text-only+.action-item:not(.text-only)>.monaco-dropdown .action-label{color:var(--vscode-descriptionForeground)}.monaco-dropdown-with-default{border-radius:5px;flex-direction:row;display:flex!important}.monaco-dropdown-with-default>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-default>.action-container.menu-entry>.action-label.icon{background-position:50%;background-repeat:no-repeat;background-size:16px;width:16px;height:16px}.monaco-dropdown-with-default:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{margin-left:-3px;padding-left:0;padding-right:0;font-size:12px;line-height:16px}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{background-position:50%;background-repeat:no-repeat;background-size:16px;display:block}.monaco-toolbar{height:100%}.monaco-toolbar .toolbar-toggle-more{padding:0;display:inline-block}:root{--vscode-sash-size:4px;--vscode-sash-hover-size:4px}.monaco-sash{z-index:35;touch-action:none;position:absolute}.monaco-sash.disabled{pointer-events:none}.monaco-sash.mac.vertical{cursor:col-resize}.monaco-sash.vertical.minimum{cursor:e-resize}.monaco-sash.vertical.maximum{cursor:w-resize}.monaco-sash.mac.horizontal{cursor:row-resize}.monaco-sash.horizontal.minimum{cursor:s-resize}.monaco-sash.horizontal.maximum{cursor:n-resize}.monaco-sash.disabled{cursor:default!important;pointer-events:none!important}.monaco-sash.vertical{cursor:ew-resize;width:var(--vscode-sash-size);height:100%;top:0}.monaco-sash.horizontal{cursor:ns-resize;width:100%;height:var(--vscode-sash-size);left:0}.monaco-sash:not(.disabled)>.orthogonal-drag-handle{content:" ";height:calc(var(--vscode-sash-size)*2);width:calc(var(--vscode-sash-size)*2);z-index:100;cursor:all-scroll;display:block;position:absolute}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.start,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.end{cursor:nwse-resize}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.end,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.start{cursor:nesw-resize}.monaco-sash.vertical>.orthogonal-drag-handle.start{left:calc(var(--vscode-sash-size)*-.5);top:calc(var(--vscode-sash-size)*-1)}.monaco-sash.vertical>.orthogonal-drag-handle.end{left:calc(var(--vscode-sash-size)*-.5);bottom:calc(var(--vscode-sash-size)*-1)}.monaco-sash.horizontal>.orthogonal-drag-handle.start{top:calc(var(--vscode-sash-size)*-.5);left:calc(var(--vscode-sash-size)*-1)}.monaco-sash.horizontal>.orthogonal-drag-handle.end{top:calc(var(--vscode-sash-size)*-.5);right:calc(var(--vscode-sash-size)*-1)}.monaco-sash:before{content:"";pointer-events:none;background:0 0;width:100%;height:100%;position:absolute}.monaco-workbench:not(.reduce-motion) .monaco-sash:before{transition:background-color .1s ease-out}.monaco-sash.hover:before,.monaco-sash.active:before{background:var(--vscode-sash-hoverBorder)}.monaco-sash.vertical:before{width:var(--vscode-sash-hover-size);left:calc(50% - (var(--vscode-sash-hover-size)/2))}.monaco-sash.horizontal:before{height:var(--vscode-sash-hover-size);top:calc(50% - (var(--vscode-sash-hover-size)/2))}.pointer-events-disabled{pointer-events:none!important}.monaco-sash.debug{background:#0ff}.monaco-sash.debug.disabled{background:#0ff3}.monaco-sash.debug:not(.disabled)>.orthogonal-drag-handle{background:red}.monaco-hover{cursor:default;-webkit-user-select:text;user-select:text;box-sizing:border-box;white-space:var(--vscode-hover-whiteSpace,normal);line-height:1.5em;animation:.1s linear fadein;position:absolute;overflow:hidden}.monaco-hover.hidden{display:none}.monaco-hover a:hover:not(.disabled){cursor:pointer}.monaco-hover .hover-contents:not(.html-hover-contents){padding:4px 8px}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents){max-width:var(--vscode-hover-maxWidth,500px);word-wrap:break-word}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents) hr{min-width:100%}.monaco-hover p,.monaco-hover .code,.monaco-hover ul,.monaco-hover h1,.monaco-hover h2,.monaco-hover h3,.monaco-hover h4,.monaco-hover h5,.monaco-hover h6{margin:8px 0}.monaco-hover h1,.monaco-hover h2,.monaco-hover h3,.monaco-hover h4,.monaco-hover h5,.monaco-hover h6{line-height:1.1}.monaco-hover code{font-family:var(--monaco-monospace-font)}.monaco-hover hr{box-sizing:border-box;border-left:0;border-right:0;height:1px;margin:4px -8px -4px}.monaco-hover p:first-child,.monaco-hover .code:first-child,.monaco-hover ul:first-child{margin-top:0}.monaco-hover p:last-child,.monaco-hover .code:last-child,.monaco-hover ul:last-child{margin-bottom:0}.monaco-hover ul,.monaco-hover ol{padding-left:20px}.monaco-hover li>p{margin-bottom:0}.monaco-hover li>ul{margin-top:0}.monaco-hover code{border-radius:3px;padding:0 .4em}.monaco-hover .monaco-tokenized-source{white-space:var(--vscode-hover-sourceWhiteSpace,pre-wrap)}.monaco-hover .hover-row.status-bar{font-size:12px;line-height:22px}.monaco-hover .hover-row.status-bar .info{padding:0 8px;font-style:italic}.monaco-hover .hover-row.status-bar .actions{width:100%;padding:0 8px;display:flex}.monaco-hover .hover-row.status-bar .actions .action-container{cursor:pointer;margin-right:16px}.monaco-hover .hover-row.status-bar .actions .action-container .action .icon{padding-right:4px}.monaco-hover .hover-row.status-bar .actions .action-container a{color:var(--vscode-textLink-foreground);-webkit-text-decoration:var(--text-link-decoration);-webkit-text-decoration:var(--text-link-decoration);text-decoration:var(--text-link-decoration)}.monaco-hover .markdown-hover .hover-contents .codicon{color:inherit;font-size:inherit;vertical-align:middle}.monaco-hover .hover-contents a.code-link:hover,.monaco-hover .hover-contents a.code-link{color:inherit}.monaco-hover .hover-contents a.code-link:before{content:"("}.monaco-hover .hover-contents a.code-link:after{content:")"}.monaco-hover .hover-contents a.code-link>span{text-underline-position:under;color:var(--vscode-textLink-foreground);border-bottom:1px solid #0000;-webkit-text-decoration:underline;text-decoration:underline}.monaco-hover .hover-contents a.code-link>span:hover{color:var(--vscode-textLink-activeForeground)}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) span{margin-bottom:4px;display:inline-block}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) span.codicon{margin-bottom:2px}.monaco-hover-content .action-container a{-webkit-user-select:none;user-select:none}.monaco-hover-content .action-container.disabled{pointer-events:none;opacity:.4;cursor:default}.monaco-editor .peekview-widget .head{box-sizing:border-box;flex-wrap:nowrap;justify-content:space-between;display:flex}.monaco-editor .peekview-widget .head .peekview-title{text-overflow:ellipsis;align-items:baseline;min-width:0;margin-left:20px;font-size:13px;display:flex;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title.clickable{cursor:pointer}.monaco-editor .peekview-widget .head .peekview-title .dirname:not(:empty){margin-left:.5em;font-size:.9em}.monaco-editor .peekview-widget .head .peekview-title .meta{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title .dirname,.monaco-editor .peekview-widget .head .peekview-title .filename{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title .meta:not(:empty):before{content:"-";padding:0 .3em}.monaco-editor .peekview-widget .head .peekview-actions{text-align:right;flex:1;padding-right:2px}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar{display:inline-block}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar,.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar>.actions-container{height:100%}.monaco-editor .peekview-widget>.body{border-top:1px solid;position:relative}.monaco-editor .peekview-widget .head .peekview-title .codicon{align-self:center;margin-right:4px}.monaco-editor .peekview-widget .monaco-list .monaco-list-row.focused .codicon{color:inherit!important}.monaco-editor .zone-widget{z-index:10;position:absolute}.monaco-editor .zone-widget .zone-widget-container{border-top-style:solid;border-top-width:0;border-bottom-style:solid;border-bottom-width:0;position:relative}.monaco-split-view2{width:100%;height:100%;position:relative}.monaco-split-view2>.sash-container{pointer-events:none;width:100%;height:100%;position:absolute}.monaco-split-view2>.sash-container>.monaco-sash{pointer-events:initial}.monaco-split-view2>.monaco-scrollable-element{width:100%;height:100%}.monaco-split-view2>.monaco-scrollable-element>.split-view-container{white-space:nowrap;width:100%;height:100%;position:relative}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view{white-space:initial;position:absolute}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view:not(.visible){display:none}.monaco-split-view2.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view{width:100%}.monaco-split-view2.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view{height:100%}.monaco-split-view2.separator-border>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{content:" ";z-index:5;pointer-events:none;background-color:var(--separator-border);position:absolute;top:0;left:0}.monaco-split-view2.separator-border.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{width:1px;height:100%}.monaco-split-view2.separator-border.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{width:100%;height:1px}.monaco-table{white-space:nowrap;flex-direction:column;width:100%;height:100%;display:flex;position:relative;overflow:hidden}.monaco-table>.monaco-split-view2{border-bottom:1px solid #0000}.monaco-table>.monaco-list{flex:1}.monaco-table-tr{height:100%;display:flex}.monaco-table-th{text-overflow:ellipsis;width:100%;height:100%;font-weight:700;overflow:hidden}.monaco-table-th,.monaco-table-td{box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;flex-shrink:0;overflow:hidden}.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{content:"";left:calc(var(--vscode-sash-size)/2);border-left:1px solid #0000;width:0;position:absolute}.monaco-workbench:not(.reduce-motion) .monaco-table>.monaco-split-view2,.monaco-workbench:not(.reduce-motion) .monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{transition:border-color .2s ease-out}.monaco-custom-toggle{float:left;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;user-select:none;border:1px solid #0000;border-radius:3px;width:20px;height:20px;margin-left:2px;padding:1px;overflow:hidden}.monaco-custom-toggle:hover{background-color:var(--vscode-inputOption-hoverBackground)}.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{border:1px dashed var(--vscode-focusBorder)}.hc-black .monaco-custom-toggle,.hc-light .monaco-custom-toggle,.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{background:0 0}.monaco-custom-toggle.monaco-checkbox{opacity:1;border:1px solid #0000;border-radius:3px;width:18px;height:18px;margin-left:0;margin-right:9px;padding:0;background-size:16px!important}.monaco-action-bar .checkbox-action-item{border-radius:2px;align-items:center;padding-right:2px;display:flex}.monaco-action-bar .checkbox-action-item:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-action-bar .checkbox-action-item>.monaco-custom-toggle.monaco-checkbox{margin-right:4px}.monaco-action-bar .checkbox-action-item>.checkbox-label{font-size:12px}.monaco-custom-toggle.monaco-checkbox:not(.checked):before{visibility:hidden}.monaco-inputbox{box-sizing:border-box;font-size:inherit;border-radius:2px;padding:0;display:block;position:relative}.monaco-inputbox>.ibwrapper>.input,.monaco-inputbox>.ibwrapper>.mirror{padding:4px 6px}.monaco-inputbox>.ibwrapper{width:100%;height:100%;position:relative}.monaco-inputbox>.ibwrapper>.input{box-sizing:border-box;width:100%;height:100%;line-height:inherit;font-family:inherit;font-size:inherit;resize:none;color:inherit;border:none;display:inline-block}.monaco-inputbox>.ibwrapper>input{text-overflow:ellipsis}.monaco-inputbox>.ibwrapper>textarea.input{scrollbar-width:none;outline:none;display:block}.monaco-inputbox>.ibwrapper>textarea.input::-webkit-scrollbar{display:none}.monaco-inputbox>.ibwrapper>textarea.input.empty{white-space:nowrap}.monaco-inputbox>.ibwrapper>.mirror{box-sizing:border-box;white-space:pre-wrap;visibility:hidden;word-wrap:break-word;width:100%;display:inline-block;position:absolute;top:0;left:0}.monaco-inputbox-container{text-align:right}.monaco-inputbox-container .monaco-inputbox-message{text-align:left;box-sizing:border-box;word-wrap:break-word;width:100%;margin-top:-1px;padding:.4em;font-size:12px;line-height:17px;display:inline-block;overflow:hidden}.monaco-inputbox .monaco-action-bar{position:absolute;top:4px;right:2px}.monaco-inputbox .monaco-action-bar .action-item{margin-left:2px}.monaco-inputbox .monaco-action-bar .action-item .codicon{background-repeat:no-repeat;width:16px;height:16px}.monaco-findInput{position:relative}.monaco-findInput .monaco-inputbox{width:100%;font-size:13px}.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.vs .monaco-findInput.disabled{background-color:#e1e1e1}.vs-dark .monaco-findInput.disabled{background-color:#333}.monaco-findInput.highlight-0 .controls,.hc-light .monaco-findInput.highlight-0 .controls{animation:.1s linear monaco-findInput-highlight-0}.monaco-findInput.highlight-1 .controls,.hc-light .monaco-findInput.highlight-1 .controls{animation:.1s linear monaco-findInput-highlight-1}.hc-black .monaco-findInput.highlight-0 .controls,.vs-dark .monaco-findInput.highlight-0 .controls{animation:.1s linear monaco-findInput-highlight-dark-0}.hc-black .monaco-findInput.highlight-1 .controls,.vs-dark .monaco-findInput.highlight-1 .controls{animation:.1s linear monaco-findInput-highlight-dark-1}@keyframes monaco-findInput-highlight-0{0%{background:#fdff00cc}to{background:0 0}}@keyframes monaco-findInput-highlight-1{0%{background:#fdff00cc}99%{background:0 0}}@keyframes monaco-findInput-highlight-dark-0{0%{background:#ffffff70}to{background:0 0}}@keyframes monaco-findInput-highlight-dark-1{0%{background:#ffffff70}99%{background:0 0}}.monaco-tl-row{align-items:center;height:100%;display:flex;position:relative}.monaco-tl-row.disabled{cursor:default}.monaco-tl-indent{pointer-events:none;height:100%;position:absolute;top:0;left:16px}.hide-arrows .monaco-tl-indent{left:12px}.monaco-tl-indent>.indent-guide{box-sizing:border-box;border-left:1px solid #0000;height:100%;display:inline-block}.monaco-workbench:not(.reduce-motion) .monaco-tl-indent>.indent-guide{transition:border-color .1s linear}.monaco-tl-twistie,.monaco-tl-contents{height:100%}.monaco-tl-twistie{text-align:right;flex-shrink:0;justify-content:center;align-items:center;width:16px;padding-right:6px;font-size:10px;transform:translate(3px);display:flex!important}.monaco-tl-contents{flex:1;overflow:hidden}.monaco-tl-twistie:before{border-radius:20px}.monaco-tl-twistie.collapsed:before{transform:rotate(-90deg)}.monaco-tl-twistie.codicon-tree-item-loading:before{animation:1.25s steps(30,end) infinite codicon-spin}.monaco-tree-type-filter{z-index:100;border:1px solid var(--vscode-widget-border);border-bottom-right-radius:4px;border-bottom-left-radius:4px;max-width:200px;margin:0 6px;padding:3px;display:flex;position:absolute;top:0}.monaco-workbench:not(.reduce-motion) .monaco-tree-type-filter{transition:top .3s}.monaco-tree-type-filter.disabled{top:-40px!important}.monaco-tree-type-filter-grab{cursor:grab;justify-content:center;align-items:center;margin-right:2px;display:flex!important}.monaco-tree-type-filter-grab.grabbing{cursor:grabbing}.monaco-tree-type-filter-input{flex:1}.monaco-tree-type-filter-input .monaco-inputbox{height:23px}.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.input,.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.mirror{padding:2px 4px}.monaco-tree-type-filter-input .monaco-findInput>.controls{top:2px}.monaco-tree-type-filter-actionbar{margin-left:4px}.monaco-tree-type-filter-actionbar .monaco-action-bar .action-label{padding:2px}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container{z-index:13;background-color:var(--vscode-sideBar-background);width:100%;height:0;position:absolute;top:0;left:0}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row.monaco-list-row{background-color:var(--vscode-sideBar-background);width:100%;position:absolute;overflow:hidden;opacity:1!important}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row:hover{cursor:pointer;background-color:var(--vscode-list-hoverBackground)!important}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container.empty,.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container.empty .monaco-tree-sticky-container-shadow{display:none}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-container-shadow{width:100%;height:0;position:absolute;bottom:-3px;left:0}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container[tabindex="0"]:focus{outline:none}.monaco-editor .zone-widget .zone-widget-container.reference-zone-widget{border-top-width:1px;border-bottom-width:1px}.monaco-editor .reference-zone-widget .inline{vertical-align:top;display:inline-block}.monaco-editor .reference-zone-widget .messages{text-align:center;width:100%;height:100%;padding:3em 0}.monaco-editor .reference-zone-widget .ref-tree{background-color:var(--vscode-peekViewResult-background);color:var(--vscode-peekViewResult-lineForeground);line-height:23px}.monaco-editor .reference-zone-widget .ref-tree .reference{text-overflow:ellipsis;overflow:hidden}.monaco-editor .reference-zone-widget .ref-tree .reference-file{width:100%;height:100%;color:var(--vscode-peekViewResult-fileForeground);display:inline-flex}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .selected .reference-file{color:inherit!important}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows>.monaco-list-row.selected:not(.highlighted){background-color:var(--vscode-peekViewResult-selectionBackground);color:var(--vscode-peekViewResult-selectionForeground)!important}.monaco-editor .reference-zone-widget .ref-tree .reference-file .count{margin-left:auto;margin-right:12px}.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight{background-color:var(--vscode-peekViewResult-matchHighlightBackground)}.monaco-editor .reference-zone-widget .preview .reference-decoration{background-color:var(--vscode-peekViewEditor-matchHighlightBackground);border:2px solid var(--vscode-peekViewEditor-matchHighlightBorder);box-sizing:border-box}.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background,.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input{background-color:var(--vscode-peekViewEditor-background)}.monaco-editor .reference-zone-widget .preview .monaco-editor .margin{background-color:var(--vscode-peekViewEditorGutter-background)}.monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file,.monaco-editor.hc-light .reference-zone-widget .ref-tree .reference-file{font-weight:700}.monaco-editor.hc-black .reference-zone-widget .ref-tree .referenceMatch .highlight,.monaco-editor.hc-light .reference-zone-widget .ref-tree .referenceMatch .highlight{border:1px dotted var(--vscode-contrastActiveBorder,transparent);box-sizing:border-box}.monaco-count-badge{text-align:center;box-sizing:border-box;border-radius:11px;min-width:18px;min-height:18px;padding:3px 6px;font-size:11px;font-weight:400;line-height:11px;display:inline-block}.monaco-count-badge.long{border-radius:2px;min-height:auto;padding:2px 3px;line-height:normal}.monaco-icon-label{text-overflow:ellipsis;display:flex;overflow:hidden}.monaco-icon-label:before{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;background-position:0;background-repeat:no-repeat;background-size:16px;flex-shrink:0;width:16px;height:22px;padding-right:6px;display:inline-block;line-height:inherit!important}.monaco-icon-label-iconpath{width:16px;height:16px;margin-top:2px;padding-left:2px;display:flex}.monaco-icon-label-container.disabled{color:var(--vscode-disabledForeground)}.monaco-icon-label>.monaco-icon-label-container{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{color:inherit;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name>.label-separator{opacity:.5;margin:0 2px}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-suffix-container>.label-suffix{opacity:.7;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.7;white-space:pre;margin-left:.5em;font-size:.9em}.monaco-icon-label.nowrap>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{white-space:nowrap}.vs .monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.95}.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{font-style:italic}.monaco-icon-label.deprecated{opacity:.66;-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-icon-label.italic:after{font-style:italic}.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-icon-label:after{opacity:.75;text-align:center;margin:auto 16px 0 5px;font-size:90%;font-weight:600}.monaco-list:focus .selected .monaco-icon-label,.monaco-list:focus .selected .monaco-icon-label:after{color:inherit!important}.monaco-list-row.focused.selected .label-description,.monaco-list-row.selected .label-description{opacity:.8}.monaco-editor .hoverHighlight{background-color:var(--vscode-editor-hoverHighlightBackground)}.monaco-editor .monaco-hover-content{box-sizing:border-box;padding-bottom:2px;padding-right:2px}.monaco-editor .monaco-hover{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);border-radius:3px}.monaco-editor .monaco-hover a{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-hover a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .monaco-hover .hover-row{display:flex}.monaco-editor .monaco-hover .hover-row .hover-row-contents{flex-direction:column;min-width:0;display:flex}.monaco-editor .monaco-hover .hover-row .verbosity-actions{border-right:1px solid var(--vscode-editorHoverWidget-border);flex-direction:column;justify-content:end;padding-left:5px;padding-right:5px;display:flex}.monaco-editor .monaco-hover .hover-row .verbosity-actions .codicon{cursor:pointer;font-size:11px}.monaco-editor .monaco-hover .hover-row .verbosity-actions .codicon.enabled{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-hover .hover-row .verbosity-actions .codicon.disabled{opacity:.6}.monaco-editor .monaco-hover .hover-row .actions{background-color:var(--vscode-editorHoverWidget-statusBarBackground)}.monaco-editor .monaco-hover code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .diff-hidden-lines-widget{width:100%}.monaco-editor .diff-hidden-lines{height:0;font-size:13px;line-height:14px;transform:translateY(-10px)}.monaco-editor .diff-hidden-lines:not(.dragging) .top:hover,.monaco-editor .diff-hidden-lines:not(.dragging) .bottom:hover,.monaco-editor .diff-hidden-lines .top.dragging,.monaco-editor .diff-hidden-lines .bottom.dragging{background-color:var(--vscode-focusBorder)}.monaco-editor .diff-hidden-lines .top,.monaco-editor .diff-hidden-lines .bottom{background-color:#0000;background-clip:padding-box;border-top:4px solid #0000;border-bottom:2px solid #0000;height:4px;transition:background-color .1s ease-out}.monaco-editor.draggingUnchangedRegion.canMoveTop:not(.canMoveBottom) *,.monaco-editor .diff-hidden-lines .top.canMoveTop:not(.canMoveBottom),.monaco-editor .diff-hidden-lines .bottom.canMoveTop:not(.canMoveBottom){cursor:n-resize!important}.monaco-editor.draggingUnchangedRegion:not(.canMoveTop).canMoveBottom *,.monaco-editor .diff-hidden-lines .top:not(.canMoveTop).canMoveBottom,.monaco-editor .diff-hidden-lines .bottom:not(.canMoveTop).canMoveBottom{cursor:s-resize!important}.monaco-editor.draggingUnchangedRegion.canMoveTop.canMoveBottom *,.monaco-editor .diff-hidden-lines .top.canMoveTop.canMoveBottom,.monaco-editor .diff-hidden-lines .bottom.canMoveTop.canMoveBottom{cursor:ns-resize!important}.monaco-editor .diff-hidden-lines .top{transform:translateY(4px)}.monaco-editor .diff-hidden-lines .bottom{transform:translateY(-6px)}.monaco-editor .diff-unchanged-lines{background:var(--vscode-diffEditor-unchangedCodeBackground)}.monaco-editor .noModificationsOverlay{z-index:1;background:var(--vscode-editor-background);justify-content:center;align-items:center;display:flex}.monaco-editor .diff-hidden-lines .center{background:var(--vscode-diffEditor-unchangedRegionBackground);color:var(--vscode-diffEditor-unchangedRegionForeground);text-overflow:ellipsis;white-space:nowrap;height:24px;box-shadow:inset 0 -5px 5px -7px var(--vscode-diffEditor-unchangedRegionShadow),inset 0 5px 5px -7px var(--vscode-diffEditor-unchangedRegionShadow);display:block;overflow:hidden}.monaco-editor .diff-hidden-lines .center span.codicon{vertical-align:middle}.monaco-editor .diff-hidden-lines .center a:hover .codicon{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .diff-hidden-lines div.breadcrumb-item{cursor:pointer}.monaco-editor .diff-hidden-lines div.breadcrumb-item:hover{color:var(--vscode-editorLink-activeForeground)}.monaco-editor .movedOriginal,.monaco-editor .movedModified{border:2px solid var(--vscode-diffEditor-move-border)}.monaco-editor .movedOriginal.currentMove,.monaco-editor .movedModified.currentMove{border:2px solid var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines path.currentMove{stroke:var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines path{pointer-events:visiblestroke}.monaco-diff-editor .moved-blocks-lines .arrow{fill:var(--vscode-diffEditor-move-border)}.monaco-diff-editor .moved-blocks-lines .arrow.currentMove{fill:var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines .arrow-rectangle{fill:var(--vscode-editor-background)}.monaco-diff-editor .moved-blocks-lines{pointer-events:none;position:absolute}.monaco-diff-editor .moved-blocks-lines path{fill:none;stroke:var(--vscode-diffEditor-move-border);stroke-width:2px}.monaco-editor .char-delete.diff-range-empty{border-left:solid var(--vscode-diffEditor-removedTextBackground)3px;margin-left:-1px}.monaco-editor .char-insert.diff-range-empty{border-left:solid var(--vscode-diffEditor-insertedTextBackground)3px}.monaco-editor .fold-unchanged{cursor:pointer}.monaco-diff-editor .diff-moved-code-block{justify-content:flex-end;margin-top:-4px;display:flex}.monaco-diff-editor .diff-moved-code-block .action-bar .action-label.codicon{width:12px;height:12px;font-size:12px}.monaco-diff-editor .diffOverview{z-index:9}.monaco-diff-editor .diffOverview .diffViewport{z-index:10}.monaco-diff-editor.vs .diffOverview{background:#00000008}.monaco-diff-editor.vs-dark .diffOverview{background:#ffffff03}.monaco-scrollable-element.modified-in-monaco-diff-editor.vs .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.vs-dark .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-black .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-light .scrollbar{background:0 0}.monaco-scrollable-element.modified-in-monaco-diff-editor .slider{z-index:10}.modified-in-monaco-diff-editor .slider.active{background:#ababab66}.modified-in-monaco-diff-editor.hc-black .slider.active,.modified-in-monaco-diff-editor.hc-light .slider.active{background:0 0}.monaco-editor .insert-sign,.monaco-diff-editor .insert-sign,.monaco-editor .delete-sign,.monaco-diff-editor .delete-sign{align-items:center;opacity:.7!important;font-size:11px!important;display:flex!important}.monaco-editor.hc-black .insert-sign,.monaco-diff-editor.hc-black .insert-sign,.monaco-editor.hc-black .delete-sign,.monaco-diff-editor.hc-black .delete-sign,.monaco-editor.hc-light .insert-sign,.monaco-diff-editor.hc-light .insert-sign,.monaco-editor.hc-light .delete-sign,.monaco-diff-editor.hc-light .delete-sign{opacity:1}.monaco-editor .inline-deleted-margin-view-zone,.monaco-editor .inline-added-margin-view-zone{text-align:right}.monaco-editor .arrow-revert-change{z-index:10;position:absolute}.monaco-editor .arrow-revert-change:hover{cursor:pointer}.monaco-editor .view-zones .view-lines .view-line span{display:inline-block}.monaco-editor .margin-view-zones .lightbulb-glyph:hover{cursor:pointer}.monaco-editor .char-insert,.monaco-diff-editor .char-insert{background-color:var(--vscode-diffEditor-insertedTextBackground)}.monaco-editor .line-insert,.monaco-diff-editor .line-insert{background-color:var(--vscode-diffEditor-insertedLineBackground,var(--vscode-diffEditor-insertedTextBackground))}.monaco-editor .line-insert,.monaco-editor .char-insert{box-sizing:border-box;border:1px solid var(--vscode-diffEditor-insertedTextBorder)}.monaco-editor.hc-black .line-insert,.monaco-editor.hc-light .line-insert,.monaco-editor.hc-black .char-insert,.monaco-editor.hc-light .char-insert{border-style:dashed}.monaco-editor .line-delete,.monaco-editor .char-delete{box-sizing:border-box;border:1px solid var(--vscode-diffEditor-removedTextBorder)}.monaco-editor.hc-black .line-delete,.monaco-editor.hc-light .line-delete,.monaco-editor.hc-black .char-delete,.monaco-editor.hc-light .char-delete{border-style:dashed}.monaco-editor .inline-added-margin-view-zone,.monaco-editor .gutter-insert,.monaco-diff-editor .gutter-insert{background-color:var(--vscode-diffEditorGutter-insertedLineBackground,var(--vscode-diffEditor-insertedLineBackground),var(--vscode-diffEditor-insertedTextBackground))}.monaco-editor .char-delete,.monaco-diff-editor .char-delete,.monaco-editor .inline-deleted-text{background-color:var(--vscode-diffEditor-removedTextBackground)}.monaco-editor .inline-deleted-text{-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-editor .line-delete,.monaco-diff-editor .line-delete{background-color:var(--vscode-diffEditor-removedLineBackground,var(--vscode-diffEditor-removedTextBackground))}.monaco-editor .inline-deleted-margin-view-zone,.monaco-editor .gutter-delete,.monaco-diff-editor .gutter-delete{background-color:var(--vscode-diffEditorGutter-removedLineBackground,var(--vscode-diffEditor-removedLineBackground),var(--vscode-diffEditor-removedTextBackground))}.monaco-diff-editor.side-by-side .editor.modified{box-shadow:-6px 0 5px -5px var(--vscode-scrollbar-shadow);border-left:1px solid var(--vscode-diffEditor-border)}.monaco-diff-editor.side-by-side .editor.original{box-shadow:6px 0 5px -5px var(--vscode-scrollbar-shadow);border-right:1px solid var(--vscode-diffEditor-border)}.monaco-diff-editor .diffViewport{background:var(--vscode-scrollbarSlider-background)}.monaco-diff-editor .diffViewport:hover{background:var(--vscode-scrollbarSlider-hoverBackground)}.monaco-diff-editor .diffViewport:active{background:var(--vscode-scrollbarSlider-activeBackground)}.monaco-editor .diagonal-fill{background-image:linear-gradient(-45deg,var(--vscode-diffEditor-diagonalFill)12.5%,#0000 12.5%,#0000 50%,var(--vscode-diffEditor-diagonalFill)50%,var(--vscode-diffEditor-diagonalFill)62.5%,#0000 62.5%,#0000 100%);background-size:8px 8px}.monaco-diff-editor .gutter{flex-grow:0;flex-shrink:0;position:relative;overflow:hidden}:is(.monaco-diff-editor .gutter)>div{position:absolute}:is(.monaco-diff-editor .gutter) .gutterItem{opacity:0;transition:opacity .7s}.showAlways:is(:is(.monaco-diff-editor .gutter) .gutterItem){opacity:1;transition:none}.noTransition:is(:is(.monaco-diff-editor .gutter) .gutterItem){transition:none}:is(.monaco-diff-editor .gutter):hover .gutterItem{opacity:1;transition:opacity .1s ease-in-out}:is(:is(.monaco-diff-editor .gutter) .gutterItem) .background{border-left:2px var(--vscode-menu-border)solid;width:1px;height:100%;position:absolute;left:50%}:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons{justify-content:center;align-items:center;width:100%;display:flex;position:absolute}:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar{height:fit-content}:is(:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar) .monaco-action-bar{line-height:1}:is(:is(:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar) .monaco-action-bar) .actions-container{background:var(--vscode-editorGutter-commentRangeForeground);border-radius:4px;width:fit-content}:is(:is(:is(:is(:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar) .monaco-action-bar) .actions-container) .action-item):hover{background:var(--vscode-toolbar-hoverBackground)}:is(:is(:is(:is(:is(:is(:is(.monaco-diff-editor .gutter) .gutterItem) .buttons) .monaco-toolbar) .monaco-action-bar) .actions-container) .action-item) .action-label{padding:1px 2px}.monaco-diff-editor .diff-hidden-lines-compact{height:11px;display:flex}:is(.monaco-diff-editor .diff-hidden-lines-compact) .line-left,:is(.monaco-diff-editor .diff-hidden-lines-compact) .line-right{border-top:1px solid;border-color:var(--vscode-editorCodeLens-foreground);opacity:.5;width:100%;height:1px;margin:auto}:is(.monaco-diff-editor .diff-hidden-lines-compact) .line-left{width:20px}:is(.monaco-diff-editor .diff-hidden-lines-compact) .text{color:var(--vscode-editorCodeLens-foreground);text-wrap:nowrap;margin:0 4px;font-size:11px;line-height:11px}.monaco-component.diff-review{-webkit-user-select:none;user-select:none;z-index:99}.monaco-diff-editor .diff-review{position:absolute}.monaco-component.diff-review .diff-review-line-number{text-align:right;color:var(--vscode-editorLineNumber-foreground);display:inline-block}.monaco-component.diff-review .diff-review-summary{padding-left:10px}.monaco-component.diff-review .diff-review-shadow{box-shadow:var(--vscode-scrollbar-shadow)0 -6px 6px -6px inset;position:absolute}.monaco-component.diff-review .diff-review-row{white-space:pre}.monaco-component.diff-review .diff-review-table{min-width:100%;display:table}.monaco-component.diff-review .diff-review-row{width:100%;display:table-row}.monaco-component.diff-review .diff-review-spacer{vertical-align:middle;width:10px;display:inline-block}.monaco-component.diff-review .diff-review-spacer>.codicon{font-size:9px!important}.monaco-component.diff-review .diff-review-actions{z-index:100;display:inline-block;position:absolute;top:2px;right:10px}.monaco-component.diff-review .diff-review-actions .action-label{width:16px;height:16px;margin:2px 0}.monaco-component.diff-review .revertButton{cursor:pointer}.monaco-editor.vs .dnd-target,.monaco-editor.hc-light .dnd-target{color:#fff;border-right:2px dotted #000}.monaco-editor.vs-dark .dnd-target{color:#51504f;border-right:2px dotted #aeafad}.monaco-editor.hc-black .dnd-target{color:#000;border-right:2px dotted #fff}.monaco-editor.mouse-default .view-lines,.monaco-editor.vs-dark.mac.mouse-default .view-lines,.monaco-editor.hc-black.mac.mouse-default .view-lines,.monaco-editor.hc-light.mac.mouse-default .view-lines{cursor:default}.monaco-editor.mouse-copy .view-lines,.monaco-editor.vs-dark.mac.mouse-copy .view-lines,.monaco-editor.hc-black.mac.mouse-copy .view-lines,.monaco-editor.hc-light.mac.mouse-copy .view-lines{cursor:copy}.monaco-editor .findOptionsWidget{background-color:var(--vscode-editorWidget-background);color:var(--vscode-editorWidget-foreground);box-shadow:0 0 8px 2px var(--vscode-widget-shadow);border:2px solid var(--vscode-contrastBorder)}.monaco-editor .find-widget{z-index:35;box-sizing:border-box;height:33px;box-shadow:0 0 8px 2px var(--vscode-widget-shadow);color:var(--vscode-editorWidget-foreground);border-left:1px solid var(--vscode-widget-border);border-right:1px solid var(--vscode-widget-border);border-bottom:1px solid var(--vscode-widget-border);background-color:var(--vscode-editorWidget-background);border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:0 4px;line-height:19px;transition:transform .2s linear;position:absolute;overflow:hidden;transform:translateY(calc(-100% - 10px))}.monaco-workbench.reduce-motion .monaco-editor .find-widget{transition:transform linear}.monaco-editor .find-widget textarea{margin:0}.monaco-editor .find-widget.hiddenEditor{display:none}.monaco-editor .find-widget.replaceToggled>.replace-part{display:flex}.monaco-editor .find-widget.visible{transform:translateY(0)}.monaco-editor .find-widget .monaco-inputbox.synthetic-focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px;outline-color:var(--vscode-focusBorder)}.monaco-editor .find-widget .monaco-inputbox .input{background-color:#0000;min-height:0}.monaco-editor .find-widget .monaco-findInput .input{font-size:13px}.monaco-editor .find-widget>.find-part,.monaco-editor .find-widget>.replace-part{margin:3px 25px 0 17px;font-size:12px;display:flex}.monaco-editor .find-widget>.find-part .monaco-inputbox,.monaco-editor .find-widget>.replace-part .monaco-inputbox{min-height:25px}.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-right:22px}.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.mirror,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-top:2px;padding-bottom:2px}.monaco-editor .find-widget>.find-part .find-actions,.monaco-editor .find-widget>.replace-part .replace-actions{align-items:center;height:25px;display:flex}.monaco-editor .find-widget .monaco-findInput{vertical-align:middle;flex:1;display:flex}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element{width:100%}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element .scrollbar.vertical{opacity:0}.monaco-editor .find-widget .matchesCount{flex:initial;vertical-align:middle;box-sizing:border-box;text-align:center;height:25px;margin:0 0 0 3px;padding:2px 0 0 2px;line-height:23px;display:flex}.monaco-editor .find-widget .button{flex:initial;cursor:pointer;background-position:50%;background-repeat:no-repeat;border-radius:5px;justify-content:center;align-items:center;width:16px;height:16px;margin-left:3px;padding:3px;display:flex}.monaco-editor .find-widget .codicon-find-selection{border-radius:5px;width:22px;height:22px;padding:3px}.monaco-editor .find-widget .button.left{margin-left:0;margin-right:3px}.monaco-editor .find-widget .button.wide{width:auto;padding:1px 6px;top:-1px}.monaco-editor .find-widget .button.toggle{box-sizing:border-box;border-radius:0;width:18px;height:100%;position:absolute;top:0;left:3px}.monaco-editor .find-widget .button.toggle.disabled{display:none}.monaco-editor .find-widget .disabled{color:var(--vscode-disabledForeground);cursor:default}.monaco-editor .find-widget>.replace-part{display:none}.monaco-editor .find-widget>.replace-part>.monaco-findInput{vertical-align:middle;flex:none;display:flex;position:relative}.monaco-editor .find-widget>.replace-part>.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.monaco-editor .find-widget.reduced-find-widget .matchesCount{display:none}.monaco-editor .find-widget.narrow-find-widget{max-width:257px!important}.monaco-editor .find-widget.collapsed-find-widget{max-width:170px!important}.monaco-editor .find-widget.collapsed-find-widget .button.previous,.monaco-editor .find-widget.collapsed-find-widget .button.next,.monaco-editor .find-widget.collapsed-find-widget .button.replace,.monaco-editor .find-widget.collapsed-find-widget .button.replace-all,.monaco-editor .find-widget.collapsed-find-widget>.find-part .monaco-findInput .controls{display:none}.monaco-editor .find-widget.no-results .matchesCount{color:var(--vscode-errorForeground)}.monaco-editor .findMatch{animation-duration:0;background-color:var(--vscode-editor-findMatchHighlightBackground);animation-name:inherit!important}.monaco-editor .currentFindMatch{background-color:var(--vscode-editor-findMatchBackground);border:2px solid var(--vscode-editor-findMatchBorder);box-sizing:border-box;padding:1px}.monaco-editor .findScope{background-color:var(--vscode-editor-findRangeHighlightBackground)}.monaco-editor .find-widget .monaco-sash{background-color:var(--vscode-editorWidget-resizeBorder,var(--vscode-editorWidget-border));left:0!important}.monaco-editor.hc-black .find-widget .button:before{position:relative;top:1px;left:2px}.monaco-editor .find-widget .button:not(.disabled):hover,.monaco-editor .find-widget .codicon-find-selection:hover{background-color:var(--vscode-toolbar-hoverBackground)!important}.monaco-editor.currentFindMatch{background-color:var(--vscode-editor-findMatchBackground)}.monaco-editor.findScope{background-color:var(--vscode-editor-findRangeHighlightBackground)}.monaco-editor.findMatch{background-color:var(--vscode-editorWidget-background)}.monaco-editor .find-widget>.button.codicon-widget-close{position:absolute;top:5px;right:4px}.monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-manual-expanded,.monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-editor .margin-view-overlays .codicon-folding-collapsed{cursor:pointer;opacity:0;justify-content:center;align-items:center;margin-left:2px;font-size:140%;transition:opacity .5s;display:flex}.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-manual-expanded,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-collapsed{transition:initial}.monaco-editor .margin-view-overlays:hover .codicon,.monaco-editor .margin-view-overlays .codicon.codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon.codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon.alwaysShowFoldIcons{opacity:1}.monaco-editor .inline-folded:after{color:var(--vscode-editor-foldPlaceholderForeground);content:"⋯";cursor:pointer;margin:.1em .2em 0;line-height:1em;display:inline}.monaco-editor .folded-background{background-color:var(--vscode-editor-foldBackground)}.monaco-editor .cldr.codicon.codicon-folding-expanded,.monaco-editor .cldr.codicon.codicon-folding-collapsed,.monaco-editor .cldr.codicon.codicon-folding-manual-expanded,.monaco-editor .cldr.codicon.codicon-folding-manual-collapsed{color:var(--vscode-editorGutter-foldingControlForeground)!important}.monaco-editor .peekview-widget .head .peekview-title .severity-icon{vertical-align:text-top;margin-right:4px;display:inline-block}.monaco-editor .marker-widget{text-overflow:ellipsis;white-space:nowrap}.monaco-editor .marker-widget>.stale{opacity:.6;font-style:italic}.monaco-editor .marker-widget .title{padding-right:5px;display:inline-block}.monaco-editor .marker-widget .descriptioncontainer{white-space:pre;-webkit-user-select:text;user-select:text;padding:8px 12px 0 20px;position:absolute}.monaco-editor .marker-widget .descriptioncontainer .message{flex-direction:column;display:flex}.monaco-editor .marker-widget .descriptioncontainer .message .details{padding-left:6px}.monaco-editor .marker-widget .descriptioncontainer .message .source,.monaco-editor .marker-widget .descriptioncontainer .message span.code{opacity:.6}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link{opacity:.6;color:inherit}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:before{content:"("}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:after{content:")"}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link>span{text-underline-position:under;color:var(--vscode-textLink-activeForeground);border-bottom:1px solid #0000;-webkit-text-decoration:underline;text-decoration:underline}.monaco-editor .marker-widget .descriptioncontainer .filename{cursor:pointer;color:var(--vscode-textLink-activeForeground)}.monaco-editor .zone-widget .codicon.codicon-error,.markers-panel .marker-icon.error,.markers-panel .marker-icon .codicon.codicon-error,.text-search-provider-messages .providerMessage .codicon.codicon-error,.extensions-viewlet>.extensions .codicon.codicon-error,.extension-editor .codicon.codicon-error,.preferences-editor .codicon.codicon-error{color:var(--vscode-problemsErrorIcon-foreground)}.monaco-editor .zone-widget .codicon.codicon-warning,.markers-panel .marker-icon.warning,.markers-panel .marker-icon .codicon.codicon-warning,.text-search-provider-messages .providerMessage .codicon.codicon-warning,.extensions-viewlet>.extensions .codicon.codicon-warning,.extension-editor .codicon.codicon-warning,.preferences-editor .codicon.codicon-warning{color:var(--vscode-problemsWarningIcon-foreground)}.monaco-editor .zone-widget .codicon.codicon-info,.markers-panel .marker-icon.info,.markers-panel .marker-icon .codicon.codicon-info,.text-search-provider-messages .providerMessage .codicon.codicon-info,.extensions-viewlet>.extensions .codicon.codicon-info,.extension-editor .codicon.codicon-info,.preferences-editor .codicon.codicon-info{color:var(--vscode-problemsInfoIcon-foreground)}.monaco-editor .goto-definition-link{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .iPadShowKeyboard{resize:none;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCA1MyAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDguMDM2NCA0LjAxMDQySDQuMDA3NzlMNC4wMDc3OSAzMi4wMjg2SDQ4LjAzNjRWNC4wMTA0MlpNNC4wMDc3OSAwLjAwNzgxMjVDMS43OTcyMSAwLjAwNzgxMjUgMC4wMDUxODc5OSAxLjc5OTg0IDAuMDA1MTg3OTkgNC4wMTA0MlYzMi4wMjg2QzAuMDA1MTg3OTkgMzQuMjM5MiAxLjc5NzIxIDM2LjAzMTIgNC4wMDc3OSAzNi4wMzEySDQ4LjAzNjRDNTAuMjQ3IDM2LjAzMTIgNTIuMDM5IDM0LjIzOTIgNTIuMDM5IDMyLjAyODZWNC4wMTA0MkM1Mi4wMzkgMS43OTk4NCA1MC4yNDcgMC4wMDc4MTI1IDQ4LjAzNjQgMC4wMDc4MTI1SDQuMDA3NzlaTTguMDEwNDIgOC4wMTMwMkgxMi4wMTNWMTIuMDE1Nkg4LjAxMDQyVjguMDEzMDJaTTIwLjAxODIgOC4wMTMwMkgxNi4wMTU2VjEyLjAxNTZIMjAuMDE4MlY4LjAxMzAyWk0yNC4wMjA4IDguMDEzMDJIMjguMDIzNFYxMi4wMTU2SDI0LjAyMDhWOC4wMTMwMlpNMzYuMDI4NiA4LjAxMzAySDMyLjAyNlYxMi4wMTU2SDM2LjAyODZWOC4wMTMwMlpNNDAuMDMxMiA4LjAxMzAySDQ0LjAzMzlWMTIuMDE1Nkg0MC4wMzEyVjguMDEzMDJaTTE2LjAxNTYgMTYuMDE4Mkg4LjAxMDQyVjIwLjAyMDhIMTYuMDE1NlYxNi4wMTgyWk0yMC4wMTgyIDE2LjAxODJIMjQuMDIwOFYyMC4wMjA4SDIwLjAxODJWMTYuMDE4MlpNMzIuMDI2IDE2LjAxODJIMjguMDIzNFYyMC4wMjA4SDMyLjAyNlYxNi4wMTgyWk00NC4wMzM5IDE2LjAxODJWMjAuMDIwOEgzNi4wMjg2VjE2LjAxODJINDQuMDMzOVpNMTIuMDEzIDI0LjAyMzRIOC4wMTA0MlYyOC4wMjZIMTIuMDEzVjI0LjAyMzRaTTE2LjAxNTYgMjQuMDIzNEgzNi4wMjg2VjI4LjAyNkgxNi4wMTU2VjI0LjAyMzRaTTQ0LjAzMzkgMjQuMDIzNEg0MC4wMzEyVjI4LjAyNkg0NC4wMzM5VjI0LjAyMzRaIiBmaWxsPSIjNDI0MjQyIi8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDAiPgo8cmVjdCB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==) 50% no-repeat;border:4px solid #f6f6f6;border-radius:4px;width:58px;min-width:0;height:36px;min-height:0;margin:0;padding:0;position:absolute;overflow:hidden}.monaco-editor.vs-dark .iPadShowKeyboard{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCA1MyAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDguMDM2NCA0LjAxMDQySDQuMDA3NzlMNC4wMDc3OSAzMi4wMjg2SDQ4LjAzNjRWNC4wMTA0MlpNNC4wMDc3OSAwLjAwNzgxMjVDMS43OTcyMSAwLjAwNzgxMjUgMC4wMDUxODc5OSAxLjc5OTg0IDAuMDA1MTg3OTkgNC4wMTA0MlYzMi4wMjg2QzAuMDA1MTg3OTkgMzQuMjM5MiAxLjc5NzIxIDM2LjAzMTIgNC4wMDc3OSAzNi4wMzEySDQ4LjAzNjRDNTAuMjQ3IDM2LjAzMTIgNTIuMDM5IDM0LjIzOTIgNTIuMDM5IDMyLjAyODZWNC4wMTA0MkM1Mi4wMzkgMS43OTk4NCA1MC4yNDcgMC4wMDc4MTI1IDQ4LjAzNjQgMC4wMDc4MTI1SDQuMDA3NzlaTTguMDEwNDIgOC4wMTMwMkgxMi4wMTNWMTIuMDE1Nkg4LjAxMDQyVjguMDEzMDJaTTIwLjAxODIgOC4wMTMwMkgxNi4wMTU2VjEyLjAxNTZIMjAuMDE4MlY4LjAxMzAyWk0yNC4wMjA4IDguMDEzMDJIMjguMDIzNFYxMi4wMTU2SDI0LjAyMDhWOC4wMTMwMlpNMzYuMDI4NiA4LjAxMzAySDMyLjAyNlYxMi4wMTU2SDM2LjAyODZWOC4wMTMwMlpNNDAuMDMxMiA4LjAxMzAySDQ0LjAzMzlWMTIuMDE1Nkg0MC4wMzEyVjguMDEzMDJaTTE2LjAxNTYgMTYuMDE4Mkg4LjAxMDQyVjIwLjAyMDhIMTYuMDE1NlYxNi4wMTgyWk0yMC4wMTgyIDE2LjAxODJIMjQuMDIwOFYyMC4wMjA4SDIwLjAxODJWMTYuMDE4MlpNMzIuMDI2IDE2LjAxODJIMjguMDIzNFYyMC4wMjA4SDMyLjAyNlYxNi4wMTgyWk00NC4wMzM5IDE2LjAxODJWMjAuMDIwOEgzNi4wMjg2VjE2LjAxODJINDQuMDMzOVpNMTIuMDEzIDI0LjAyMzRIOC4wMTA0MlYyOC4wMjZIMTIuMDEzVjI0LjAyMzRaTTE2LjAxNTYgMjQuMDIzNEgzNi4wMjg2VjI4LjAyNkgxNi4wMTU2VjI0LjAyMzRaTTQ0LjAzMzkgMjQuMDIzNEg0MC4wMzEyVjI4LjAyNkg0NC4wMzM5VjI0LjAyMzRaIiBmaWxsPSIjQzVDNUM1Ii8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDAiPgo8cmVjdCB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==) 50% no-repeat;border:4px solid #252526}.monaco-editor.vs .valueSetReplacement{outline:solid 2px var(--vscode-editorBracketMatch-border)}.monaco-editor .suggest-preview-additional-widget{white-space:nowrap}.monaco-editor .suggest-preview-additional-widget .content-spacer{color:#0000;white-space:pre}.monaco-editor .suggest-preview-additional-widget .button{cursor:pointer;text-underline-position:under;-webkit-text-decoration:underline;text-decoration:underline;display:inline-block}.monaco-editor .ghost-text-hidden{opacity:0;font-size:0}.monaco-editor .ghost-text-decoration,.monaco-editor .suggest-preview-text .ghost-text{font-style:italic}.monaco-editor .ghost-text-decoration,.monaco-editor .ghost-text-decoration-preview,.monaco-editor .suggest-preview-text .ghost-text{background-color:var(--vscode-editorGhostText-background);border:1px solid var(--vscode-editorGhostText-border);color:var(--vscode-editorGhostText-foreground)!important}.monaco-editor .snippet-placeholder{background-color:var(--vscode-editor-snippetTabstopHighlightBackground,transparent);outline-width:1px;outline-style:solid;outline-color:var(--vscode-editor-snippetTabstopHighlightBorder,transparent);min-width:2px}.monaco-editor .finish-snippet-placeholder{background-color:var(--vscode-editor-snippetFinalTabstopHighlightBackground,transparent);outline-width:1px;outline-style:solid;outline-color:var(--vscode-editor-snippetFinalTabstopHighlightBorder,transparent)}.monaco-editor .suggest-widget{z-index:40;border-radius:3px;flex-direction:column;width:430px;display:flex}.monaco-editor .suggest-widget.message{flex-direction:row;align-items:center}.monaco-editor .suggest-widget,.monaco-editor .suggest-details{border-style:solid;border-width:1px;border-color:var(--vscode-editorSuggestWidget-border);background-color:var(--vscode-editorSuggestWidget-background);flex:0 auto;width:100%}.monaco-editor.hc-black .suggest-widget,.monaco-editor.hc-black .suggest-details,.monaco-editor.hc-light .suggest-widget,.monaco-editor.hc-light .suggest-details{border-width:2px}.monaco-editor .suggest-widget .suggest-status-bar{box-sizing:border-box;border-top:1px solid var(--vscode-editorSuggestWidget-border);flex-flow:row;justify-content:space-between;width:100%;padding:0 4px;font-size:80%;display:none;overflow:hidden}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar{display:flex}.monaco-editor .suggest-widget .suggest-status-bar .left{padding-right:8px}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-label{color:var(--vscode-editorSuggestWidgetStatus-foreground)}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label{margin-right:0}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label:after{content:", ";margin-right:.3em}.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget.with-status-bar:not(.docs-side) .monaco-list .monaco-list-row:hover>.contents>.main>.right.can-expand-details>.details-label{width:100%}.monaco-editor .suggest-widget>.message{padding-left:22px}.monaco-editor .suggest-widget>.tree{width:100%;height:100%}.monaco-editor .suggest-widget .monaco-list{-webkit-user-select:none;user-select:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row{-mox-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;cursor:pointer;touch-action:none;background-position:2px 2px;background-repeat:no-repeat;padding-right:10px;display:flex}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused{color:var(--vscode-editorSuggestWidget-selectedForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .codicon{color:var(--vscode-editorSuggestWidget-selectedIconForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents{flex:1;height:100%;padding-left:2px;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main{text-overflow:ellipsis;white-space:pre;justify-content:space-between;display:flex;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{display:flex}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.focused)>.contents>.main .monaco-icon-label{color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight{font-weight:700}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-highlightForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-focusHighlightForeground)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:before{color:inherit;opacity:1;cursor:pointer;font-size:14px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close{position:absolute;top:6px;right:2px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close:hover,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:hover{opacity:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{opacity:.7}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label{text-overflow:ellipsis;opacity:.6;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.qualifier-label{opacity:.4;font-size:85%;line-height:initial;text-overflow:ellipsis;align-self:center;margin-left:12px;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{text-overflow:ellipsis;white-space:nowrap;margin-left:1.1em;font-size:85%;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label>.monaco-tokenized-source{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{display:none}.monaco-editor .suggest-widget:not(.shows-details) .monaco-list .monaco-list-row.focused>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused:not(.string-label)>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget:not(.docs-side) .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right.can-expand-details>.details-label{width:calc(100% - 26px)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left{flex-grow:1;flex-shrink:1;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.monaco-icon-label{flex-shrink:0}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.left>.monaco-icon-label{max-width:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.left>.monaco-icon-label{flex-shrink:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{flex-shrink:4;max-width:70%;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{visibility:hidden;width:18px;height:18px;display:inline-block;position:absolute;right:10px}.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none!important}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:inline-block}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right>.readMore{visibility:visible}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated{opacity:.66;-webkit-text-decoration:unset;text-decoration:unset}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated>.monaco-icon-label-container>.monaco-icon-name-container{-webkit-text-decoration:line-through;text-decoration:line-through}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label:before{height:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon{background-position:50%;background-repeat:no-repeat;background-size:80%;width:16px;height:16px;margin-left:2px;display:block}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.hide{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon{align-items:center;margin-right:4px;display:flex}.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .icon,.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .suggest-icon:before{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor .colorspan{border:.1em solid #000;width:.7em;height:.7em;margin:0 0 0 .3em;display:inline-block}.monaco-editor .suggest-details-container{z-index:41}.monaco-editor .suggest-details{cursor:default;color:var(--vscode-editorSuggestWidget-foreground);flex-direction:column;display:flex}.monaco-editor .suggest-details.focused{border-color:var(--vscode-focusBorder)}.monaco-editor .suggest-details a{color:var(--vscode-textLink-foreground)}.monaco-editor .suggest-details a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .suggest-details code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .suggest-details.no-docs{display:none}.monaco-editor .suggest-details>.monaco-scrollable-element{flex:1}.monaco-editor .suggest-details>.monaco-scrollable-element>.body{box-sizing:border-box;width:100%;height:100%}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type{text-overflow:ellipsis;opacity:.7;white-space:pre;flex:2;margin:0 24px 0 0;padding:4px 0 12px 5px;overflow:hidden}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type.auto-wrap{white-space:normal;word-break:break-all}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs{white-space:pre-wrap;margin:0;padding:4px 5px}.monaco-editor .suggest-details.no-type>.monaco-scrollable-element>.body>.docs{margin-right:24px;overflow:hidden}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs{white-space:initial;min-height:calc(1rem + 8px);padding:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div,.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>span:not(:empty){padding:4px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:first-child{margin-top:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:last-child{margin-bottom:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .monaco-tokenized-source{white-space:pre}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs .code{white-space:pre-wrap;word-wrap:break-word}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .codicon{vertical-align:sub}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>p:empty{display:none}.monaco-editor .suggest-details code{border-radius:3px;padding:0 .4em}.monaco-editor .suggest-details ul,.monaco-editor .suggest-details ol{padding-left:20px}.monaco-editor .suggest-details p code{font-family:var(--monaco-monospace-font)}.monaco-editor .inline-edit-remove{background-color:var(--vscode-editorGhostText-background);font-style:italic}.monaco-editor .inline-edit-hidden{opacity:0;font-size:0}.monaco-editor .inline-edit-decoration,.monaco-editor .suggest-preview-text .inline-edit{font-style:italic}.monaco-editor .inline-completion-text-to-replace{text-underline-position:under;-webkit-text-decoration:underline;text-decoration:underline}.monaco-editor .inline-edit-decoration,.monaco-editor .inline-edit-decoration-preview,.monaco-editor .suggest-preview-text .inline-edit{background-color:var(--vscode-editorGhostText-background);border:1px solid var(--vscode-editorGhostText-border);color:var(--vscode-editorGhostText-foreground)!important}.monaco-editor .inlineEditHints.withBorder{z-index:39;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .inlineEditHints a,.monaco-editor .inlineEditHints a:hover{color:var(--vscode-foreground)}.monaco-editor .inlineEditHints .keybinding{opacity:.6;margin-left:4px;display:flex}.monaco-editor .inlineEditHints .keybinding .monaco-keybinding-key{padding:2px 3px;font-size:8px}.monaco-editor .inlineEditStatusBarItemLabel{margin-right:2px}.monaco-editor .inlineEditSideBySide{z-index:39;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);white-space:pre}.monaco-editor div.inline-edits-widget{--widget-color:var(--vscode-notifications-background)}:is(.monaco-editor div.inline-edits-widget) .promptEditor .monaco-editor{--vscode-editor-placeholder-foreground:var(--vscode-editorGhostText-foreground)}:is(.monaco-editor div.inline-edits-widget) .toolbar,:is(.monaco-editor div.inline-edits-widget) .promptEditor{opacity:0;transition:opacity .2s ease-in-out}:is(:is(.monaco-editor div.inline-edits-widget):hover,.focused:is(.monaco-editor div.inline-edits-widget)) .toolbar,:is(:is(.monaco-editor div.inline-edits-widget):hover,.focused:is(.monaco-editor div.inline-edits-widget)) .promptEditor{opacity:1}:is(:is(.monaco-editor div.inline-edits-widget) .preview .monaco-editor) .mtk1{color:var(--vscode-editorGhostText-foreground)}:is(:is(.monaco-editor div.inline-edits-widget) .preview .monaco-editor) .view-overlays .current-line-exact,:is(:is(.monaco-editor div.inline-edits-widget) .preview .monaco-editor) .current-line-margin{border:none}:is(.monaco-editor div.inline-edits-widget) .preview .monaco-editor{--vscode-editor-background:var(--widget-color)}:is(:is(.monaco-editor div.inline-edits-widget) svg) .gradient-start{stop-color:var(--vscode-editor-background)}:is(:is(.monaco-editor div.inline-edits-widget) svg) .gradient-stop{stop-color:var(--widget-color)}.monaco-editor .tokens-inspect-widget{z-index:50;-webkit-user-select:text;user-select:text;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);padding:10px}.monaco-editor.hc-black .tokens-inspect-widget,.monaco-editor.hc-light .tokens-inspect-widget{border-width:2px}.monaco-editor .tokens-inspect-widget .tokens-inspect-separator{background-color:var(--vscode-editorHoverWidget-border);border:0;height:1px}.monaco-editor .tokens-inspect-widget .tm-token{font-family:var(--monaco-monospace-font)}.monaco-editor .tokens-inspect-widget .tm-token-length{float:right;font-size:60%;font-weight:400}.monaco-editor .tokens-inspect-widget .tm-metadata-table{width:100%}.monaco-editor .tokens-inspect-widget .tm-metadata-value{font-family:var(--monaco-monospace-font);text-align:right}.monaco-editor .tokens-inspect-widget .tm-token-type{font-family:var(--monaco-monospace-font)}.monaco-editor .linked-editing-decoration{background-color:var(--vscode-editor-linkedEditingBackground);min-width:1px}.monaco-editor .detected-link,.monaco-editor .detected-link-active{text-underline-position:under;-webkit-text-decoration:underline;text-decoration:underline}.monaco-editor .detected-link-active{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .focused .selectionHighlight{background-color:var(--vscode-editor-selectionHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-selectionHighlightBorder)}.monaco-editor.hc-black .focused .selectionHighlight,.monaco-editor.hc-light .focused .selectionHighlight{border-style:dotted}.monaco-editor .wordHighlight{background-color:var(--vscode-editor-wordHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightBorder)}.monaco-editor.hc-black .wordHighlight,.monaco-editor.hc-light .wordHighlight{border-style:dotted}.monaco-editor .wordHighlightStrong{background-color:var(--vscode-editor-wordHighlightStrongBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightStrongBorder)}.monaco-editor.hc-black .wordHighlightStrong,.monaco-editor.hc-light .wordHighlightStrong{border-style:dotted}.monaco-editor .wordHighlightText{background-color:var(--vscode-editor-wordHighlightTextBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightTextBorder)}.monaco-editor.hc-black .wordHighlightText,.monaco-editor.hc-light .wordHighlightText{border-style:dotted}.monaco-editor .parameter-hints-widget{z-index:39;cursor:default;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);flex-direction:column;line-height:1.5em;display:flex}.hc-black .monaco-editor .parameter-hints-widget,.hc-light .monaco-editor .parameter-hints-widget{border-width:2px}.monaco-editor .parameter-hints-widget>.phwrapper{flex-direction:row;max-width:440px;display:flex}.monaco-editor .parameter-hints-widget.multiple{min-height:3.3em;padding:0}.monaco-editor .parameter-hints-widget.multiple .body:before{content:"";opacity:.5;border-left:1px solid var(--vscode-editorHoverWidget-border);height:100%;display:block;position:absolute}.monaco-editor .parameter-hints-widget p,.monaco-editor .parameter-hints-widget ul{margin:8px 0}.monaco-editor .parameter-hints-widget .monaco-scrollable-element,.monaco-editor .parameter-hints-widget .body{flex-direction:column;flex:1;min-height:100%;display:flex}.monaco-editor .parameter-hints-widget .signature{padding:4px 5px;position:relative}.monaco-editor .parameter-hints-widget .signature.has-docs:after{content:"";opacity:.5;border-bottom:1px solid var(--vscode-editorHoverWidget-border);width:100%;padding-top:4px;display:block;position:absolute;left:0}.monaco-editor .parameter-hints-widget .code{font-family:var(--vscode-parameterHintsWidget-editorFontFamily),var(--vscode-parameterHintsWidget-editorFontFamilyDefault)}.monaco-editor .parameter-hints-widget .docs{white-space:pre-wrap;padding:0 10px 0 5px}.monaco-editor .parameter-hints-widget .docs.empty{display:none}.monaco-editor .parameter-hints-widget .docs a{color:var(--vscode-textLink-foreground)}.monaco-editor .parameter-hints-widget .docs a:hover{color:var(--vscode-textLink-activeForeground);cursor:pointer}.monaco-editor .parameter-hints-widget .docs .markdown-docs{white-space:initial}.monaco-editor .parameter-hints-widget .docs code{font-family:var(--monaco-monospace-font);background-color:var(--vscode-textCodeBlock-background);border-radius:3px;padding:0 .4em}.monaco-editor .parameter-hints-widget .docs .monaco-tokenized-source,.monaco-editor .parameter-hints-widget .docs .code{white-space:pre-wrap}.monaco-editor .parameter-hints-widget .controls{flex-direction:column;justify-content:flex-end;align-items:center;min-width:22px;display:none}.monaco-editor .parameter-hints-widget.multiple .controls{padding:0 2px;display:flex}.monaco-editor .parameter-hints-widget.multiple .button{cursor:pointer;background-repeat:no-repeat;width:16px;height:16px}.monaco-editor .parameter-hints-widget .button.previous{bottom:24px}.monaco-editor .parameter-hints-widget .overloads{text-align:center;height:12px;line-height:12px;font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .signature .parameter.active{color:var(--vscode-editorHoverWidget-highlightForeground);font-weight:700}.monaco-editor .parameter-hints-widget .documentation-parameter>.parameter{margin-right:.5em;font-weight:700}.monaco-editor{--vscode-editor-placeholder-foreground:var(--vscode-editorGhostText-foreground)}.monaco-editor .editorPlaceholder{text-overflow:ellipsis;text-wrap:nowrap;pointer-events:none;color:var(--vscode-editor-placeholder-foreground);position:absolute;top:0;overflow:hidden}.monaco-editor .rename-box{z-index:100;color:inherit;border-radius:4px}.monaco-editor .rename-box.preview{padding:4px 4px 0}.monaco-editor .rename-box .rename-input-with-button{border-radius:2px;width:calc(100% - 8px);padding:3px}.monaco-editor .rename-box .rename-input{width:calc(100% - 8px);padding:0}.monaco-editor .rename-box .rename-input:focus{outline:none}.monaco-editor .rename-box .rename-suggestions-button{cursor:pointer;background-color:#0000;border:none;border-radius:5px;align-items:center;padding:3px;display:flex}.monaco-editor .rename-box .rename-suggestions-button:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-editor .rename-box .rename-candidate-list-container .monaco-list-row{border-radius:2px}.monaco-editor .rename-box .rename-label{opacity:.8;display:none}.monaco-editor .rename-box.preview .rename-label{display:inherit}.monaco-editor .sticky-widget{overflow:hidden}.monaco-editor .sticky-widget-line-numbers{float:left;background-color:inherit}.monaco-editor .sticky-widget-lines-scrollable{width:var(--vscode-editorStickyScroll-scrollableWidth);background-color:inherit;display:inline-block;position:absolute;overflow:hidden}.monaco-editor .sticky-widget-lines{background-color:inherit;position:absolute}.monaco-editor .sticky-line-number,.monaco-editor .sticky-line-content{color:var(--vscode-editorLineNumber-foreground);white-space:nowrap;background-color:inherit;display:inline-block;position:absolute}.monaco-editor .sticky-line-number .codicon-folding-expanded,.monaco-editor .sticky-line-number .codicon-folding-collapsed{float:right;transition:var(--vscode-editorStickyScroll-foldingOpacityTransition)}.monaco-editor .sticky-line-content{width:var(--vscode-editorStickyScroll-scrollableWidth);background-color:inherit;white-space:nowrap}.monaco-editor .sticky-line-number-inner{text-align:right;display:inline-block}.monaco-editor .sticky-widget{border-bottom:1px solid var(--vscode-editorStickyScroll-border)}.monaco-editor .sticky-line-content:hover{background-color:var(--vscode-editorStickyScrollHover-background);cursor:pointer}.monaco-editor .sticky-widget{width:100%;box-shadow:var(--vscode-editorStickyScroll-shadow)0 4px 2px -2px;z-index:4;background-color:var(--vscode-editorStickyScroll-background);right:initial!important}.monaco-editor .sticky-widget.peek{background-color:var(--vscode-peekViewEditorStickyScroll-background)}.monaco-editor .unicode-highlight{border:1px solid var(--vscode-editorUnicodeHighlight-border);background-color:var(--vscode-editorUnicodeHighlight-background);box-sizing:border-box}.editor-banner{box-sizing:border-box;cursor:default;background:var(--vscode-banner-background);width:100%;height:26px;font-size:12px;display:flex;overflow:visible}.editor-banner .icon-container{flex-shrink:0;align-items:center;padding:0 6px 0 10px;display:flex}.editor-banner .icon-container.custom-icon{background-position:50%;background-repeat:no-repeat;background-size:16px;width:16px;margin:0 6px 0 10px;padding:0}.editor-banner .message-container{text-overflow:ellipsis;white-space:nowrap;align-items:center;line-height:26px;display:flex;overflow:hidden}.editor-banner .message-container p{margin-block:0}.editor-banner .message-actions-container{flex-grow:1;flex-shrink:0;margin:0 4px;line-height:26px}.editor-banner .message-actions-container a.monaco-button{width:inherit;margin:2px 8px;padding:0 12px}.editor-banner .message-actions-container a{margin-left:12px;padding:3px;-webkit-text-decoration:underline;text-decoration:underline}.editor-banner .action-container{padding:0 10px 0 6px}.editor-banner{background-color:var(--vscode-banner-background)}.editor-banner,.editor-banner .action-container .codicon,.editor-banner .message-actions-container .monaco-link{color:var(--vscode-banner-foreground)}.editor-banner .icon-container .codicon{color:var(--vscode-banner-iconForeground)}.monaco-link{color:var(--vscode-textLink-foreground)}.monaco-link:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor{--monaco-monospace-font:"SF Mono",Monaco,Menlo,Consolas,"Ubuntu Mono","Liberation Mono","DejaVu Sans Mono","Courier New",monospace;font-family:-apple-system,BlinkMacSystemFont,Segoe WPC,Segoe UI,HelveticaNeue-Light,system-ui,Ubuntu,Droid Sans,sans-serif}.monaco-menu .monaco-action-bar.vertical .action-item .action-menu-item:focus .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-black .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-light .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-hover p{margin:0}.monaco-aria-container{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);width:1px;height:1px;margin:-1px;padding:0;top:0;overflow:hidden;position:absolute!important}.monaco-editor,.monaco-diff-editor .synthetic-focus,.monaco-editor,.monaco-diff-editor [tabindex="0"]:focus,.monaco-editor,.monaco-diff-editor [tabindex="-1"]:focus,.monaco-editor,.monaco-diff-editor button:focus,.monaco-editor,.monaco-diff-editor input[type=button]:focus,.monaco-editor,.monaco-diff-editor input[type=checkbox]:focus,.monaco-editor,.monaco-diff-editor input[type=search]:focus,.monaco-editor,.monaco-diff-editor input[type=text]:focus,.monaco-editor,.monaco-diff-editor select:focus,.monaco-editor,.monaco-diff-editor textarea:focus{outline-offset:-1px;outline-width:1px;outline-style:solid;outline-color:var(--vscode-focusBorder);opacity:1}.monaco-workbench .workbench-hover{z-index:40;background:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);max-width:700px;color:var(--vscode-editorHoverWidget-foreground);box-shadow:0 2px 8px var(--vscode-widget-shadow);border-radius:3px;font-size:13px;line-height:19px;position:relative;overflow:hidden}.monaco-workbench .workbench-hover hr{border-bottom:none}.monaco-workbench .workbench-hover:not(.skip-fade-in){animation:.1s linear fadein}.monaco-workbench .workbench-hover.compact{font-size:12px}.monaco-workbench .workbench-hover.compact .hover-contents{padding:2px 8px}.monaco-workbench .workbench-hover-container.locked .workbench-hover{outline:1px solid var(--vscode-editorHoverWidget-border)}.monaco-workbench .workbench-hover-container.locked .workbench-hover:focus,.monaco-workbench .workbench-hover-lock:focus{outline:1px solid var(--vscode-focusBorder)}.monaco-workbench .workbench-hover-container.locked .workbench-hover-lock:hover{background:var(--vscode-toolbar-hoverBackground)}.monaco-workbench .workbench-hover-pointer{z-index:41;pointer-events:none;position:absolute}.monaco-workbench .workbench-hover-pointer:after{content:"";background-color:var(--vscode-editorHoverWidget-background);border-right:1px solid var(--vscode-editorHoverWidget-border);border-bottom:1px solid var(--vscode-editorHoverWidget-border);width:5px;height:5px;position:absolute}.monaco-workbench .locked .workbench-hover-pointer:after{border-bottom-width:2px;border-right-width:2px;width:4px;height:4px}.monaco-workbench .workbench-hover-pointer.left{left:-3px}.monaco-workbench .workbench-hover-pointer.right{right:3px}.monaco-workbench .workbench-hover-pointer.top{top:-3px}.monaco-workbench .workbench-hover-pointer.bottom{bottom:3px}.monaco-workbench .workbench-hover-pointer.left:after{transform:rotate(135deg)}.monaco-workbench .workbench-hover-pointer.right:after{transform:rotate(315deg)}.monaco-workbench .workbench-hover-pointer.top:after{transform:rotate(225deg)}.monaco-workbench .workbench-hover-pointer.bottom:after{transform:rotate(45deg)}.monaco-workbench .workbench-hover a{color:var(--vscode-textLink-foreground)}.monaco-workbench .workbench-hover a:focus{outline-offset:-1px;outline:1px solid;outline-color:var(--vscode-focusBorder);-webkit-text-decoration:underline;text-decoration:underline}.monaco-workbench .workbench-hover a:hover,.monaco-workbench .workbench-hover a:active{color:var(--vscode-textLink-activeForeground)}.monaco-workbench .workbench-hover code{background:var(--vscode-textCodeBlock-background)}.monaco-workbench .workbench-hover .hover-row .actions{background:var(--vscode-editorHoverWidget-statusBarBackground)}.monaco-workbench .workbench-hover.right-aligned{left:1px}.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions{flex-direction:row-reverse}.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions .action-container{margin-left:16px;margin-right:0}.context-view{position:absolute}.context-view.fixed{all:initial;color:inherit;font-family:inherit;font-size:13px;position:fixed}.quick-input-widget{font-size:13px}.quick-input-widget .monaco-highlighted-label .highlight,.quick-input-widget .monaco-highlighted-label .highlight{color:#0066bf}.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight,.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight{color:#9dddff}.vs-dark .quick-input-widget .monaco-highlighted-label .highlight,.vs-dark .quick-input-widget .monaco-highlighted-label .highlight{color:#0097fb}.hc-black .quick-input-widget .monaco-highlighted-label .highlight,.hc-black .quick-input-widget .monaco-highlighted-label .highlight{color:#f38518}.hc-light .quick-input-widget .monaco-highlighted-label .highlight,.hc-light .quick-input-widget .monaco-highlighted-label .highlight{color:#0f4a85}.monaco-keybinding>.monaco-keybinding-key{color:#555;background-color:#ddd6;border:1px solid #ccc6;border-bottom-color:#bbb6;box-shadow:inset 0 -1px #bbb6}.hc-black .monaco-keybinding>.monaco-keybinding-key{box-shadow:none;color:#fff;background-color:#0000;border:1px solid #6fc3df}.hc-light .monaco-keybinding>.monaco-keybinding-key{box-shadow:none;color:#292929;background-color:#0000;border:1px solid #0f4a85}.vs-dark .monaco-keybinding>.monaco-keybinding-key{color:#ccc;background-color:#8080802b;border:1px solid #3339;border-bottom-color:#4449;box-shadow:inset 0 -1px #4449}.quick-input-widget{z-index:2550;-webkit-app-region:no-drag;border-radius:6px;width:600px;margin-left:-300px;position:absolute;left:50%}.quick-input-titlebar{border-top-left-radius:5px;border-top-right-radius:5px;align-items:center;display:flex}.quick-input-left-action-bar{flex:1;margin-left:4px;display:flex}.quick-input-inline-action-bar{margin:2px 0 0 5px}.quick-input-title{text-align:center;text-overflow:ellipsis;padding:3px 0;overflow:hidden}.quick-input-right-action-bar{flex:1;margin-right:4px;display:flex}.quick-input-right-action-bar>.actions-container{justify-content:flex-end}.quick-input-titlebar .monaco-action-bar .action-label.codicon{background-position:50%;background-repeat:no-repeat;padding:2px}.quick-input-description{margin:6px 6px 6px 11px}.quick-input-header .quick-input-description{flex:1;margin:4px 2px}.quick-input-header{padding:8px 6px 2px;display:flex}.quick-input-widget.hidden-input .quick-input-header{margin-bottom:0;padding:0}.quick-input-and-message{flex-direction:column;flex-grow:1;min-width:0;display:flex;position:relative}.quick-input-check-all{align-self:center;margin:0}.quick-input-filter{flex-grow:1;display:flex;position:relative}.quick-input-box{flex-grow:1}.quick-input-widget.show-checkboxes .quick-input-box,.quick-input-widget.show-checkboxes .quick-input-message{margin-left:5px}.quick-input-visible-count{position:absolute;left:-10000px}.quick-input-count{align-self:center;align-items:center;display:flex;position:absolute;right:4px}.quick-input-count .monaco-count-badge{vertical-align:middle;border-radius:2px;min-height:auto;padding:2px 4px;line-height:normal}.quick-input-action{margin-left:6px}.quick-input-action .monaco-text-button{align-items:center;height:25px;padding:0 6px;font-size:11px;display:flex}.quick-input-message{overflow-wrap:break-word;margin-top:-1px;padding:5px}.quick-input-message>.codicon{vertical-align:text-bottom;margin:0 .2em}.quick-input-message a{color:inherit}.quick-input-progress.monaco-progress-container{position:relative}.quick-input-list{line-height:22px}.quick-input-widget.hidden-input .quick-input-list{margin-top:4px;padding-bottom:4px}.quick-input-list .monaco-list{max-height:440px;padding-bottom:5px;overflow:hidden}.quick-input-list .monaco-scrollable-element{padding:0 5px}.quick-input-list .quick-input-list-entry{box-sizing:border-box;padding:0 6px;display:flex;overflow:hidden}.quick-input-list .quick-input-list-entry.quick-input-list-separator-border{border-top-style:solid;border-top-width:1px}.quick-input-list .monaco-list-row{border-radius:3px}.quick-input-list .monaco-list-row[data-index="0"] .quick-input-list-entry.quick-input-list-separator-border{border-top-style:none}.quick-input-list .quick-input-list-label{flex:1;height:100%;display:flex;overflow:hidden}.quick-input-list .quick-input-list-checkbox{align-self:center;margin:0}.quick-input-list .quick-input-list-icon{background-position:0;background-repeat:no-repeat;background-size:16px;justify-content:center;align-items:center;width:16px;height:22px;padding-right:6px;display:flex}.quick-input-list .quick-input-list-rows{text-overflow:ellipsis;flex-direction:column;flex:1;height:100%;margin-left:5px;display:flex;overflow:hidden}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-rows{margin-left:10px}.quick-input-widget .quick-input-list .quick-input-list-checkbox{display:none}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-checkbox{display:inline}.quick-input-list .quick-input-list-rows>.quick-input-list-row{align-items:center;display:flex}.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label,.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label .monaco-icon-label-container>.monaco-icon-name-container{flex:1}.quick-input-list .quick-input-list-rows>.quick-input-list-row .codicon[class*=codicon-]{vertical-align:text-bottom}.quick-input-list .quick-input-list-rows .monaco-highlighted-label>span{opacity:1}.quick-input-list .quick-input-list-entry .quick-input-list-entry-keybinding{margin-right:8px}.quick-input-list .quick-input-list-label-meta{opacity:.7;text-overflow:ellipsis;line-height:normal;overflow:hidden}.quick-input-list .monaco-list .monaco-list-row .monaco-highlighted-label .highlight{background-color:unset;font-weight:700;color:var(--vscode-list-highlightForeground)!important}.quick-input-list .monaco-list .monaco-list-row.focused .monaco-highlighted-label .highlight{color:var(--vscode-list-focusHighlightForeground)!important}.quick-input-list .quick-input-list-entry .quick-input-list-separator{margin-right:4px}.quick-input-list .quick-input-list-entry-action-bar{flex:0;display:flex;overflow:visible}.quick-input-list .quick-input-list-entry-action-bar .action-label{display:none}.quick-input-list .quick-input-list-entry-action-bar .action-label.codicon{margin-right:4px;padding:2px}.quick-input-list .quick-input-list-entry-action-bar{margin-top:1px;margin-right:4px}.quick-input-list .quick-input-list-entry .quick-input-list-entry-action-bar .action-label.always-visible,.quick-input-list .quick-input-list-entry:hover .quick-input-list-entry-action-bar .action-label,.quick-input-list .quick-input-list-entry.focus-inside .quick-input-list-entry-action-bar .action-label,.quick-input-list .monaco-list-row.focused .quick-input-list-entry-action-bar .action-label,.quick-input-list .monaco-list-row.passive-focused .quick-input-list-entry-action-bar .action-label{display:flex}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key,.quick-input-list .monaco-list-row.focused .quick-input-list-entry .quick-input-list-separator{color:inherit}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key{background:0 0}.quick-input-list .quick-input-list-separator-as-item{padding:4px 6px;font-size:12px}.quick-input-list .quick-input-list-separator-as-item .label-name{font-weight:600}.quick-input-list .quick-input-list-separator-as-item .label-description{opacity:1!important}.quick-input-list .monaco-tree-sticky-row .quick-input-list-entry.quick-input-list-separator-as-item.quick-input-list-separator-border{border-top-style:none}.quick-input-list .monaco-tree-sticky-row{padding:0 5px}.quick-input-list .monaco-tl-twistie{display:none!important}.monaco-progress-container{width:100%;height:2px;overflow:hidden}.monaco-progress-container .progress-bit{width:2%;height:2px;display:none;position:absolute;left:0}.monaco-progress-container.active .progress-bit{display:inherit}.monaco-progress-container.discrete .progress-bit{transition:width .1s linear;left:0}.monaco-progress-container.discrete.done .progress-bit{width:100%}.monaco-progress-container.infinite .progress-bit{animation-name:progress;animation-duration:4s;animation-timing-function:linear;animation-iteration-count:infinite;transform:translate(0,0)}.monaco-progress-container.infinite.infinite-long-running .progress-bit{animation-timing-function:steps(100,end)}@keyframes progress{0%{transform:translate(0%)scaleX(1)}50%{transform:translate(2500%)scaleX(3)}to{transform:translate(4900%)scaleX(1)}}.monaco-component.multiDiffEditor{background:var(--vscode-multiDiffEditor-background);width:100%;height:100%;position:relative;overflow-y:hidden}.monaco-component.multiDiffEditor>div{width:100%;height:100%;position:absolute;top:0;left:0}.placeholder:is(.monaco-component.multiDiffEditor>div){visibility:hidden}.placeholder.visible:is(.monaco-component.multiDiffEditor>div){visibility:visible}.placeholder:is(.monaco-component.multiDiffEditor>div){place-content:center;place-items:center;display:grid}.monaco-component.multiDiffEditor .active{--vscode-multiDiffEditor-border:var(--vscode-focusBorder)}.monaco-component.multiDiffEditor .multiDiffEntry{flex-direction:column;flex:1;display:flex;overflow:hidden}:is(.monaco-component.multiDiffEditor .multiDiffEntry) .collapse-button{cursor:pointer;margin:0 5px}:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .collapse-button) a{display:block}:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header{z-index:1000;background:var(--vscode-editor-background)}:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header):not(.collapsed) .header-content{border-bottom:1px solid var(--vscode-sideBarSectionHeader-border)}:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content{border-top:1px solid var(--vscode-multiDiffEditor-border);color:var(--vscode-foreground);background:var(--vscode-multiDiffEditor-headerBackground);align-items:center;margin:8px 0 0;padding:4px 5px;display:flex}.shadow:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content){box-shadow:var(--vscode-scrollbar-shadow)0px 6px 6px -6px}:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .file-path{flex:1;min-width:0;display:flex}:is(:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .file-path) .title{font-size:14px;line-height:22px}.original:is(:is(:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .file-path) .title){text-overflow:ellipsis;flex:1;min-width:0}:is(:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .file-path) .status{opacity:.75;margin:0 10px;font-weight:600;line-height:22px}:is(:is(:is(.monaco-component.multiDiffEditor .multiDiffEntry) .header) .header-content) .actions{padding:0 8px}:is(.monaco-component.multiDiffEditor .multiDiffEntry) .editorParent{border-bottom:1px solid var(--vscode-multiDiffEditor-border);flex-direction:column;flex:1;display:flex;overflow:hidden}:is(.monaco-component.multiDiffEditor .multiDiffEntry) .editorContainer{flex:1}.containsTaskList_mC6p{list-style:none}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight)var(--ifm-h5-font-size)/var(--ifm-heading-line-height)var(--ifm-heading-font-family);text-transform:uppercase}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{vertical-align:middle;margin-right:.4em;display:inline-block}.admonitionIcon_Rf37 svg{width:1.6em;height:1.6em;fill:var(--ifm-alert-foreground-color);display:inline-block}.admonitionContent_BuS1>:last-child{margin-bottom:0}.breadcrumbHomeIcon_YNFT{vertical-align:top;width:1.1rem;height:1.1rem;position:relative;top:1px}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:.8;margin-bottom:.8rem}@media (width>=997px){.generatedIndexPage_vN6x{max-width:75%!important}}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(1.25*var(--ifm-leading))}.docItemContainer_Djhp header+*,.docItemContainer_Djhp article>:first-child{margin-top:0}@media (width>=997px){.docItemCol_VOVn{max-width:75%!important}}
-13
assets/js/04d926a5.6943d148.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8051"],{70003:function(e,n,i){i.d(n,{ZP:()=>a,d$:()=>o});var s=i(85893),r=i(50065),l=i(75752),t=i.n(l);let o=[];function c(e){let n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["A ",(0,s.jsx)(n.strong,{children:"Source"})," that monitors active listening uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,s.jsxs)(n.li,{children:["or amount of time (",(0,s.jsx)(n.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["These default values are based on ",(0,s.jsx)(n.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,s.jsxs)(n.p,{children:["These values can be customized in the ",(0,s.jsx)(n.code,{children:"options"})," of Source's ",(0,s.jsx)(n.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,s.jsx)(t(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 - "data": { 3 - // ... 4 - }, 5 - "options": { 6 - // highlight-start 7 - "scrobbleThresholds": { 8 - "duration": 40, // scrobbable if listened to for 40 seconds or more 9 - "percent": 20 // scrobbable if listened to for 20% or more of the track's length 10 - } 11 - // highlight-end 12 - } 13 - }`})]})}function a(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},68875:function(e,n,i){i.r(n),i.d(n,{frontMatter:()=>h,default:()=>p,toc:()=>j,metadata:()=>s,assets:()=>x,contentTitle:()=>u});var s=JSON.parse('{"id":"configuration/configuration","title":"Overview","description":"Check the FAQ if you have any issues after configuration!","source":"@site/docs/configuration/configuration.mdx","sourceDirName":"configuration","slug":"/configuration/","permalink":"/multi-scrobbler/configuration/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/configuration.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","toc_max_heading_level":3},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/updating/"},"next":{"title":"Overview","permalink":"/multi-scrobbler/configuration/clients/"}}'),r=i(85893),l=i(50065),t=i(703),o=i(73752),c=i(75752),a=i.n(c);i(13727),i(49437),i(94728),i(70003);var d=i(51952);let h={sidebar_position:2,title:"Overview",toc_max_heading_level:3},u=void 0,x={},j=[{value:"Configuration Types",id:"configuration-types",level:2},{value:"Setup Sources and Clients",id:"setup-sources-and-clients",level:2},{value:"Secrets Interpolation",id:"secrets-interpolation",level:2},{value:"Application Options",id:"application-options",level:2},{value:"Base URL",id:"base-url",level:3},{value:"Caching",id:"caching",level:3},{value:"Configuration",id:"configuration",level:5},{value:"Configuration",id:"configuration-1",level:5},{value:"Configuration",id:"configuration-2",level:5},{value:"Secondary Caching Configuration",id:"secondary-caching-configuration",level:4},{value:"Debug Mode",id:"debug-mode",level:3},{value:"Disable Web",id:"disable-web",level:3},{value:"Monitoring",id:"monitoring",level:2},{value:"Webhook Configurations",id:"webhook-configurations",level:3},{value:"Gotify",id:"gotify",level:4},{value:"Ntfy",id:"ntfy",level:4},{value:"Apprise",id:"apprise",level:4},{value:"Health Endpoint",id:"health-endpoint",level:3}];function f(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components},{Details:i}=n;return i||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Check the ",(0,r.jsx)(n.a,{href:"/multi-scrobbler/FAQ",children:(0,r.jsx)(n.strong,{children:"FAQ"})})," if you have any issues after configuration!"]})}),"\n",(0,r.jsx)(n.h2,{id:"configuration-types",children:"Configuration Types"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/sources",children:(0,r.jsx)(n.strong,{children:"Sources"})})," and ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:(0,r.jsx)(n.strong,{children:"Clients"})})," are configured using:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"environmental (ENV) variables"}),"\n",(0,r.jsx)(n.li,{children:"client/source specific json config files"}),"\n",(0,r.jsx)(n.li,{children:"an all-in-one json config file"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"MS will parse configuration from all configuration types."})," You can mix and match configurations but it is generally better to stick to one or the other."]}),"\n",(0,r.jsxs)(t.default,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.p,{children:["MS will parse environmental variables present in the OS/container when it is run. ",(0,r.jsx)(n.strong,{children:"This method means MS does not require files to run."})]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Use ENV-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You are the only person for whom MS is scrobbling for"}),"\n",(0,r.jsxs)(n.li,{children:["You have a very simple setup for MS such as one scrobble ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Client"})," and one ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:"Source"})," IE Plex -> Maloja"]}),"\n"]})]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(n.p,{children:"For Docker container..."}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'docker run -e "SPOTIFY_CLIENT_ID=yourId" -e "SPOTIFY_CLIENT_SECRET=yourSecret" ...\n'})}),(0,r.jsx)(n.p,{children:"For Docker Compose"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n environment:\n - SPOTIFY_CLIENT_ID=yourId\n - SPOTIFY_CLIENT_SECRET=yourSecret\n - MALOJA_URL=http://domain.tld:42010\n - MALOJA_API_KEY=1234\n # ...\n # ...\n"})}),(0,r.jsx)(n.p,{children:"For a local/node installation export variables before running..."}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"SPOTIFY_CLIENT_ID=yourId SPOTIFY_CLIENT_SECRET=yourSecret npm run start\n"})})]})]}),(0,r.jsxs)(o.default,{value:"file",label:"File",children:[(0,r.jsxs)(n.p,{children:["MS will parse configuration files located in the directory specified by the ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"})," environmental variable. This variable defaults to:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Local installation -> ",(0,r.jsx)(n.code,{children:"PROJECT_DIR/config"})]}),"\n",(0,r.jsxs)(n.li,{children:["Docker -> ",(0,r.jsx)(n.code,{children:"/config"})," (in the container) -- see the ",(0,r.jsx)(n.a,{href:"/multi-scrobbler/installation/#docker",children:"install docs"})," for how to configure this correctly"]}),"\n"]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Use File-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["You have many ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:"Sources"})]}),"\n",(0,r.jsxs)(n.li,{children:["You have many of each type of ",(0,r.jsx)(n.strong,{children:"Source"})," you want to scrobble from IE 2x Plex accounts, 3x Spotify accounts, 1x\nFunkwhale..."]}),"\n",(0,r.jsxs)(n.li,{children:["You have more than one scrobble ",(0,r.jsx)(n.strong,{children:"Client"})," you want to scrobble to IE multiple Maloja servers"]}),"\n",(0,r.jsxs)(n.li,{children:["You want only to scrobble to specific ",(0,r.jsx)(n.strong,{children:"Clients"})]}),"\n",(0,r.jsxs)(n.li,{children:["You need to setup more advanced configuration for a Source/Client","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Most Source/Clients only support basic configuration through ENV, all configuration is possible using File/AIO"}),"\n"]}),"\n"]}),"\n"]})]}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["There are ",(0,r.jsx)(n.strong,{children:"example configurations"})," for all Source/Client types and AIO config located in the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tree/master/config",children:(0,r.jsx)(n.code,{children:"/config"})})," directory of this project. These can be used as-is by renaming them to ",(0,r.jsx)(n.code,{children:".json"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"For docker installations these examples are copied to your configuration directory on first-time use."}),"\n",(0,r.jsxs)(n.li,{children:["There is also a ",(0,r.jsx)(n.a,{href:"/configuration/kitchensink",children:(0,r.jsx)(n.strong,{children:"kitchensink example"})})," that provides examples of using all sources/clients in a complex configuration."]}),"\n"]})}),(0,r.jsxs)(n.p,{children:["Each file is named by the ",(0,r.jsx)(n.strong,{children:"type"})," of the Client/Source found in below sections. Each file as an ",(0,r.jsx)(n.strong,{children:"array"})," of that type of Client/Source."]}),(0,r.jsx)(n.p,{children:"Example directory structure:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/CONFIG_DIR\n plex.json\n spotify.json\n maloja.json\n"})}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(a(),{title:"CONFIG_DIR/spotify.json",language:"json5",children:d.Z})]})]}),(0,r.jsxs)(o.default,{value:"aio",label:"File AIO",children:[(0,r.jsxs)(n.p,{children:["MS will parse an ",(0,r.jsx)(n.strong,{children:"all-in-one"})," configuration file located in the directory specified by the ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"})," environmental variable. This variable defaults to:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Local installation -> ",(0,r.jsx)(n.code,{children:"PROJECT_DIR/config/config.json"})]}),"\n",(0,r.jsxs)(n.li,{children:["Docker -> ",(0,r.jsx)(n.code,{children:"/config/config.json"})," (in the container) -- see the ",(0,r.jsx)(n.a,{href:"/multi-scrobbler/installation/#docker",children:"install docs"})," for how to configure this correctly"]}),"\n"]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Use AIO-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["You have many ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:"Sources"})]}),"\n",(0,r.jsxs)(n.li,{children:["You have many of each type of ",(0,r.jsx)(n.strong,{children:"Source"})," you want to scrobble from IE 2x Plex accounts, 3x Spotify accounts, 1x\nFunkwhale..."]}),"\n",(0,r.jsxs)(n.li,{children:["You have more than one scrobble ",(0,r.jsx)(n.strong,{children:"Client"})," you want to scrobble to IE multiple Maloja servers"]}),"\n",(0,r.jsxs)(n.li,{children:["You want only to scrobble to specific ",(0,r.jsx)(n.strong,{children:"Clients"})]}),"\n",(0,r.jsxs)(n.li,{children:["You need to setup ",(0,r.jsx)(n.a,{href:"#monitoring",children:"monitoring/webhooks"})]}),"\n",(0,r.jsx)(n.li,{children:"You want to setup defaults for all Sources/Clients"}),"\n"]})]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"The AIO config also enables setting default options for sources/clients as well as global options for MS itself."})}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["An example AIO config files can be found in the project directory at ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tree/master/config/config.json.example",children:(0,r.jsx)(n.code,{children:"/config/config.json.example"})})]}),"\n",(0,r.jsx)(n.li,{children:"For docker installations this example is copied to your configuration directory on first-time use."}),"\n",(0,r.jsxs)(n.li,{children:["There is also a ",(0,r.jsx)(n.a,{href:"/configuration/kitchensink",children:(0,r.jsx)(n.strong,{children:"kitchensink example"})})," that provides examples of using all sources/clients in a complex configuration."]}),"\n"]})}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://json-schema.app/view/%23?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Faio.json",children:(0,r.jsx)(n.strong,{children:"Explore the schema for this configuration, along with an example generator and validator, here"})})}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(a(),{title:"CONFIG_DIR/config.json",language:"json5",children:'{\n "debugMode": false,\n "disableWeb": false,\n "sourceDefaults": {\n "logPayload": false,\n "logFilterFailure": "warn",\n "logPlayerState": false,\n "scrobbleThresholds": {\n "duration": 30,\n "percent": 50\n },\n "maxPollRetries": 1,\n "maxRequestRetries": 1,\n "retryMultiplier": 1.5\n },\n "clientDefaults": {\n "maxRequestRetries": 1,\n "retryMultiplier": 1.5\n },\n "sources": [\n {\n "type": "spotify",\n "enable": true,\n "clients": ["myConfig"],\n "name": "mySpotifySource",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback"\n }\n }\n ],\n "clients": [\n {\n "type": "maloja",\n "enable": true,\n "name": "myConfig",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n }\n ],\n "webhooks": [\n {\n "name": "FirstGotifyServer",\n "type": "gotify",\n "url": "http://localhost:8070",\n "token": "MyGotifyToken",\n "priorities": {\n "info": 5,\n "warn": 7,\n "error": 10\n }\n },\n {\n "type": "ntfy",\n "name": "MyNtfyFriendlyNameForLogs",\n "url": "http://localhost:9991",\n "topic": "MyMultiScrobblerTopic",\n "username": "Optional",\n "password": "Optional",\n "priorities": {\n "info": 3,\n "warn": 4,\n "error": 5\n }\n }\n ]\n}\n'})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"setup-sources-and-clients",children:"Setup Sources and Clients"}),"\n",(0,r.jsxs)(n.p,{children:["See the ",(0,r.jsx)(n.a,{href:"#configuration-types",children:"Configuration Types"})," above for your options for creating Source and Client configurations."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Reference ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:(0,r.jsx)(n.strong,{children:"Scrobble Sources"})})," for what Sources are available"]}),"\n",(0,r.jsxs)(n.li,{children:["Reference ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:(0,r.jsx)(n.strong,{children:"Scrobble Clients"})})," for what Clients are available"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Each entry for a Source/Client includes a ",(0,r.jsx)(n.strong,{children:"Configuration"})," section that describes how to configure it using a ",(0,r.jsx)(n.a,{href:"#configuration-types",children:"configuration type"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"secrets-interpolation",children:"Secrets Interpolation"}),"\n",(0,r.jsxs)(n.p,{children:["When using ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})," or ",(0,r.jsx)(n.a,{href:"./?configType=aio#configuration-types",children:"AIO"})," Configuration, Multi-Scrobbler can interpolate Environmental Variables into your json files. This can be used, for example, to keep sensitive data (like ",(0,r.jsx)(n.a,{href:"/configurations/clients/lastfm#configuration",children:"Last.fm Client/Secret"}),") out of your configuration files so that they can be committed to git."]}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler will look for patterns in text fields within ",(0,r.jsx)(n.em,{children:"all"})," of your json files:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Some part of the text field matches: ",(0,r.jsx)(n.code,{children:"[[MY_ENV]]"})]}),"\n",(0,r.jsxs)(n.li,{children:["Is replaced by the value of the Environmental Variable named ",(0,r.jsx)(n.code,{children:"MY_ENV"})]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Given this ",(0,r.jsx)(n.a,{href:"/configurations/clients/lastfm#configuration",children:"Last.fm"})," ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})," config:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="lastfm.json"',children:'[\n {\n "name": "myLastFmClient",\n "configureAs": "client",\n "data": {\n "apiKey": "[[MY_APIKEY]]",\n "secret": "[[MY_SECRET]]",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})}),(0,r.jsxs)(n.p,{children:["And these environmental variables, in this scenario set through ",(0,r.jsx)(n.code,{children:"environment"})," in the ",(0,r.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"docker compose installation"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"MY_APIKEY=a89cba1569901a0671d5a9875fed4be1\nMY_SECRET=ec42e09d5ae0ee0f0816ca151008412a\n"})}),(0,r.jsx)(n.p,{children:"The resulting json multi-scrobbler would use:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="lastfm.json"',children:'[\n {\n "name": "myLastFmClient",\n "configureAs": "client",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.admonition,{title:"Caveats",type:"note",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"ENV variable names/interpolation keys are case-insensitive"}),"\n",(0,r.jsxs)(n.li,{children:["Interpolation only works for ",(0,r.jsx)(n.strong,{children:"string"})," values within json. This cannot be used for numbers, booleans, objects, etc..."]}),"\n"]})}),"\n",(0,r.jsxs)(n.admonition,{title:"Missing ENVS",type:"warning",children:[(0,r.jsxs)(n.p,{children:["Multi-scrobbler ",(0,r.jsx)(n.strong,{children:"will not"})," throw an error if the environmental value is not found. Instead, it will leave the string as-is and log a warning (",(0,r.jsx)(n.code,{children:"WARN"})," level) with the names of the missing environmental variable names like so:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"WARN : [App] [Sources] [spotify Secrets] Matched: None | Unmatched: SPOTIFY_SECRET\n"})})]}),"\n",(0,r.jsx)(n.admonition,{title:"ENV Name Collisions",type:"warning",children:(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Verify that interpolation keys/environmental variable names you will use do not collide with existing ENV names used by multi-scrobbler."})," Use the docs search to verify the name you want to use is not already used elsewhere by multi-scrobbler."]})}),"\n",(0,r.jsx)(n.h2,{id:"application-options",children:"Application Options"}),"\n",(0,r.jsx)(n.p,{children:"These options affect multi-scrobbler's behavior and are not specific to any source/client."}),"\n",(0,r.jsx)(n.h3,{id:"base-url",children:"Base URL"}),"\n",(0,r.jsxs)(n.p,{children:["Defines the URL that is used to generate default redirect URLs for authentication on ",(0,r.jsx)(n.a,{href:"/configuration/sources/spotify",children:"spotify"})," and ",(0,r.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"lastfm"})," -- as well as some logging hints."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Default => ",(0,r.jsx)(n.code,{children:"http://localhost:9078"})]}),"\n",(0,r.jsxs)(n.li,{children:["Set with ",(0,r.jsx)(n.a,{href:"./?configType=env#configuration-types",children:"ENV"})," ",(0,r.jsx)(n.code,{children:"BASE_URL"})," or ",(0,r.jsx)(n.code,{children:"baseUrl"})," ",(0,r.jsx)(n.a,{href:"./?configType=aio#configuration-types",children:"all-in-one configuration"})]}),"\n",(0,r.jsxs)(n.li,{children:["If protocol is ",(0,r.jsx)(n.code,{children:"http"})," or no protocol is specified MS will try to use port ",(0,r.jsx)(n.code,{children:"9078"})," -- to override this explicitly set the port or use ",(0,r.jsx)(n.code,{children:"https"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Useful when running with ",(0,r.jsx)(n.a,{href:"/multi-scrobbler/installation/#docker",children:"docker"})," so that you do not need to specify redirect URLs for each configuration."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["EX Lastfm Redirect Url is ",(0,r.jsx)(n.code,{children:"BASE_URL:PORT/lastfm/callback"})," (when no other redirectUri is specified for ",(0,r.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"lastfm configuration"}),")"]}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:(0,r.jsx)(n.code,{children:"BASE_URL"})}),(0,r.jsx)(n.th,{children:"Redirect URL"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"192.168.0.101"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101:9078/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://my.domain.local"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://my.domain.local:9078/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101/my/subfolder"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101:9078/my/subfolder/lastfm/callback"})})]})]})]}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:(0,r.jsx)(n.code,{children:"BASE_URL"})}),(0,r.jsx)(n.th,{children:"Redirect URL"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"my.domain.local:80"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101:80/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"my.domain.local:9000"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://my.domain.local:9000/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"192.168.0.101:4000/my/subfolder"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101:4000/my/subfolder/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"https://192.168.0.101"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"https://192.168.0.101:443/lastfm/callback"})})]})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"caching",children:"Caching"}),"\n",(0,r.jsx)(n.p,{children:"Multi-scrobbler caches some activities to persist important data across restarts, reduce external API calls, and make some actions faster."}),"\n",(0,r.jsxs)(n.p,{children:["All of the activities below are ",(0,r.jsx)(n.strong,{children:"always"})," cached ",(0,r.jsx)(n.strong,{children:"in-memory"})," with an optional, configurable ",(0,r.jsxs)(n.a,{href:"#secondary-caching-configuration",children:[(0,r.jsx)(n.strong,{children:"secondary"})," store"]})," for persistence."]}),"\n",(0,r.jsxs)(t.default,{groupId:"cachedThings",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"scrobbles",label:"Scrobbles",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Queued"})," and ",(0,r.jsx)(n.strong,{children:"Failed"})," Scrobbles are cached so that any un-scrobbled data you have is persisted across restarts of multi-scrobbler."]}),(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["By default, this data use a ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary"})," ",(0,r.jsx)(n.a,{href:"./?cacheType=file#secondary-caching-configuration",children:"File"})," store, configured for you automatically."]}),(0,r.jsxs)(n.p,{children:["If you have configured a ",(0,r.jsx)(n.a,{href:"/installation#storage",children:"persisted volume/bind mount"})," for configuration (",(0,r.jsx)(n.code,{children:"/config"})," is mounted in ",(0,r.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"docker compose"}),") then you are already done. If you are not persisting this directory then you should consider setting up ",(0,r.jsx)(n.a,{href:"./?cacheType=valkey#secondary-caching-configuration",children:"Valkey Cache"})," for this."]})]}),(0,r.jsx)(n.h5,{id:"configuration",children:"Configuration"}),(0,r.jsxs)(n.p,{children:["Use any ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary Cache"}),", the config examples below show the default values:"]}),(0,r.jsxs)(t.default,{children:[(0,r.jsx)(o.default,{value:"env",label:"ENV",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"file"})}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE_CONN"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"/config"})}),(0,r.jsx)(n.td,{})]})]})]})}),(0,r.jsx)(o.default,{value:"aio",label:"AIO",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "scrobble": {\n "provider": "file",\n "connection": "/config"\n }\n },\n // ...\n}\n'})})})]})]}),(0,r.jsxs)(o.default,{value:"auth",label:"Auth Data",children:[(0,r.jsx)(n.p,{children:"Authentication sessions/tokens/etc... are cached for quicker requests and for persistence across restarts."}),(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["By default, this data use a ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary"})," ",(0,r.jsx)(n.a,{href:"./?cacheType=file#secondary-caching-configuration",children:"File"})," store, configured for you automatically."]}),(0,r.jsxs)(n.p,{children:["If you have configured a ",(0,r.jsx)(n.a,{href:"/installation#storage",children:"persisted volume/bind mount"})," for configuration (",(0,r.jsx)(n.code,{children:"/config"})," is mounted in ",(0,r.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"docker compose"}),") then you are already done. If you are not persisting this directory then you should consider setting up ",(0,r.jsx)(n.a,{href:"./?cacheType=valkey#secondary-caching-configuration",children:"Valkey Cache"})," for this."]})]}),(0,r.jsx)(n.h5,{id:"configuration-1",children:"Configuration"}),(0,r.jsxs)(n.p,{children:["Use any ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary Cache"}),", the config examples below show the default values:"]}),(0,r.jsxs)(t.default,{children:[(0,r.jsx)(o.default,{value:"env",label:"ENV",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_AUTH"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"file"})}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_AUTH_CONN"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"/config"})}),(0,r.jsx)(n.td,{})]})]})]})}),(0,r.jsx)(o.default,{value:"aio",label:"AIO",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "auth": {\n "provider": "file",\n "connection": "/config"\n }\n },\n // ...\n}\n'})})})]})]}),(0,r.jsxs)(o.default,{value:"metadata",label:"Transform API Calls",children:[(0,r.jsxs)(n.p,{children:["API Calls to external (metadata) services used to ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"Enhance Scrobbles"}),", like calls to ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"}),", can be cached to avoid duplicate calls and speed up scrobble transformations."]}),(0,r.jsxs)(n.p,{children:["By default, these calls are only cached in memory. If you wish for cached calls to be persisted across restarts then setup ",(0,r.jsx)(n.a,{href:"./?cacheType=valkey#secondary-caching-configuration",children:"Valkey Cache"}),"."]}),(0,r.jsx)(n.h5,{id:"configuration-2",children:"Configuration"}),(0,r.jsxs)(n.p,{children:["Use any ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary Cache"}),", the config examples below show the default values:"]}),(0,r.jsxs)(t.default,{children:[(0,r.jsx)(o.default,{value:"env",label:"ENV",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_METADATA"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_METADATA_CONN"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]})]})]})}),(0,r.jsx)(o.default,{value:"aio",label:"AIO",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "metadata": {\n "provider": "valkey",\n "connection": "yourConnectionStringHere"\n }\n },\n // ...\n}\n'})})})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"secondary-caching-configuration",children:"Secondary Caching Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["The type of cache used, and its connection properties, can be configured through ",(0,r.jsx)(n.strong,{children:"ENV"})," or ",(0,r.jsx)(n.strong,{children:"AIO"})," config."]}),"\n",(0,r.jsxs)(t.default,{groupId:"cacheType",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"file",label:"File",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"File"})," cache is stored in the ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"})," directory using the pre-defined file name ",(0,r.jsx)(n.code,{children:"ms-[cacheName].cache"}),"."]}),(0,r.jsxs)(t.default,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"env",label:"ENV",children:[(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"file"})}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE_CONN"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"/config"})}),(0,r.jsx)(n.td,{children:"The directory, within the container, to store the cache file"})]})]})]})]}),(0,r.jsxs)(o.default,{value:"aio",label:"AIO",children:[(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "scrobble": {\n "provider": "file",\n "connection": "/config"\n }\n },\n // ...\n}\n'})})]})]})]}),(0,r.jsxs)(o.default,{value:"valkey",label:"Valkey",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://valkey.io/",children:(0,r.jsx)(n.strong,{children:"Valkey"})})," is an open-source fork of Redis."]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Adding Valkey container to multi-scrobbler"}),(0,r.jsxs)(n.p,{children:["A valkey container can be added to the ",(0,r.jsx)(n.a,{href:"/installation?runType=docker-compose#docker",children:"multi-scrobbler docker compose stack"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n # ...\n # adding everything below\n // highlight-start\n valkey:\n image: valkey/valkey\n volumes:\n - valkeydata:/data\n\nvolumes:\n valkeydata:\n driver: local\n // highlight-end\n"})}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.code,{children:"redis://valkey:6379"})," as the connection string in the configurations below."]})]}),(0,r.jsx)(n.p,{children:"The connection string used by multi-scrobbler to connect to your Valkey instance must be in the form:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"redis://HOST_IP:HOST_PORT\n"})}),(0,r.jsxs)(t.default,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"env",label:"ENV",children:[(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_METADATA"})}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"valkey"})}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_METADATA_CONN"})}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The host/IP and port to connect to EX: ",(0,r.jsx)(n.code,{children:"redis://192.168.0.120:6379"})]})]})]})]})]}),(0,r.jsxs)(o.default,{value:"aio",label:"AIO",children:[(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "metadata": {\n "provider": "valkey",\n "connection": "redis://192.168.0.120:6379"\n }\n },\n // ...\n}\n'})})]})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"debug-mode",children:"Debug Mode"}),"\n",(0,r.jsx)(n.p,{children:"Turning on Debug Mode will"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:'override and enable all optional "debugging" options found in configuration'}),"\n",(0,r.jsx)(n.li,{children:"set log output to DEBUG"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Use this as a shortcut for enabling output that can be used for troubleshooting and issue reporting. Be aware that logs will likely be VERY noisy while Debug Mode is on. You should only have this mode on while gathering logs for troubleshooting and then turn it off afterwards."}),"\n",(0,r.jsxs)(n.p,{children:["To set debug mode either add it to ",(0,r.jsxs)(n.a,{href:"./?configType=aio#configuration-types",children:["AIO ",(0,r.jsx)(n.code,{children:"config.json"})]})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "debugMode": true,\n "sources": [...],\n // ...\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["or set the ",(0,r.jsx)(n.a,{href:"./?configType=env#configuration-types",children:"ENV"})," ",(0,r.jsx)(n.code,{children:"DEBUG_MODE=true"})]}),"\n",(0,r.jsx)(n.h3,{id:"disable-web",children:"Disable Web"}),"\n",(0,r.jsx)(n.p,{children:"If you do not need the dashboard and/or ingress sources, or have security concerns about ingress and cannot control your hosting environment, the web server and API can be disabled."}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsxs)(n.p,{children:["Any ",(0,r.jsxs)(n.strong,{children:[(0,r.jsx)(n.a,{href:"/configuration/sources#ingress",children:"ingress-based sources"})," will be unusable"]})," (Webscrobbler, etc...) if this is disabled."]})}),"\n",(0,r.jsx)(n.p,{children:"Disable using either:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ENV ",(0,r.jsx)(n.code,{children:"DISABLE_WEB=true"})]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.a,{href:"./?configType=aio#configuration-types",children:"All-in-One File"})," use the top-level property ",(0,r.jsx)(n.code,{children:'"disableWeb": true'})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"monitoring",children:"Monitoring"}),"\n",(0,r.jsx)(n.p,{children:"Multi-scrobbler supports some common webhooks and a healthcheck endpoint in order to monitor Sources and Clients for errors."}),"\n",(0,r.jsx)(n.h3,{id:"webhook-configurations",children:"Webhook Configurations"}),"\n",(0,r.jsxs)(n.p,{children:["Webhooks will ",(0,r.jsx)(n.strong,{children:"push"})," a notification to your configured servers on these events:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Source polling started"}),"\n",(0,r.jsx)(n.li,{children:"Source polling retry"}),"\n",(0,r.jsx)(n.li,{children:"Source polling stopped on error"}),"\n",(0,r.jsx)(n.li,{children:"Scrobble client scrobble failure"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Webhooks are configured in the AIO ",(0,r.jsx)(n.a,{href:"#configuration-types",children:"config.json"})," file under the ",(0,r.jsx)(n.code,{children:"webhook"})," top-level property. Multiple webhooks may be configured for each webhook type."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "sources": [\n //...\n ],\n "clients": [\n //...\n ],\n "webhooks": [\n {\n "name": "FirstGotifyServer",\n "type": "gotify",\n "url": "http://192.168.0.100:8070",\n "token": "abcd"\n },\n {\n "name": "SecondGotifyServer",\n "type": "gotify",\n //...\n },\n {\n "name": "NtfyServerOne",\n "type": "ntfy",\n //...\n },\n //...\n ]\n}\n'})})]}),"\n",(0,r.jsx)(n.h4,{id:"gotify",children:(0,r.jsx)(n.a,{href:"https://gotify.net/",children:"Gotify"})}),"\n",(0,r.jsxs)(n.p,{children:["Refer to the ",(0,r.jsx)(n.a,{href:"https://json-schema.app/view/%23/%23%2Fdefinitions%2FGotifyConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Faio.json",children:"config schema for GotifyConfig"})]}),"\n",(0,r.jsxs)(n.p,{children:["multi-scrobbler optionally supports setting message notification priority via ",(0,r.jsx)(n.code,{children:"info"})," ",(0,r.jsx)(n.code,{children:"warn"})," and ",(0,r.jsx)(n.code,{children:"error"})," mappings."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "type": "gotify",\n "name": "MyGotifyFriendlyNameForLogs",\n "url": "http://192.168.0.100:8070",\n "token": "AQZI58fA.rfSZbm",\n "priorities": {\n "info": 5,\n "warn": 7,\n "error": 10\n }\n}\n'})})]}),"\n",(0,r.jsx)(n.h4,{id:"ntfy",children:(0,r.jsx)(n.a,{href:"https://ntfy.sh/",children:"Ntfy"})}),"\n",(0,r.jsxs)(n.p,{children:["Refer to the ",(0,r.jsx)(n.a,{href:"https://json-schema.app/view/%23/%23%2Fdefinitions%2FNtfyConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Faio.json",children:"config schema for NtfyConfig"})]}),"\n",(0,r.jsxs)(n.p,{children:["multi-scrobbler optionally supports setting message notification priority via ",(0,r.jsx)(n.code,{children:"info"})," ",(0,r.jsx)(n.code,{children:"warn"})," and ",(0,r.jsx)(n.code,{children:"error"})," mappings."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "type": "ntfy",\n "name": "MyNtfyFriendlyNameForLogs",\n "url": "http://192.168.0.100:9991",\n "topic": "RvOwKJ1XtIVMXGLR",\n "username": "Optional",\n "password": "Optional",\n "priorities": {\n "info": 3,\n "warn": 4,\n "error": 5\n }\n}\n'})})]}),"\n",(0,r.jsx)(n.h4,{id:"apprise",children:(0,r.jsx)(n.a,{href:"https://github.com/caronc/apprise-api",children:"Apprise"})}),"\n",(0,r.jsxs)(n.p,{children:["Refer to the ",(0,r.jsx)(n.a,{href:"https://json-schema.app/view/%23/%23%2Fdefinitions%2FAppriseConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Faio.json",children:"config schema for AppriseConfig"})]}),"\n",(0,r.jsxs)(n.p,{children:["multi-scrobbler supports ",(0,r.jsx)(n.a,{href:"https://github.com/caronc/apprise-api?tab=readme-ov-file#stateless-solution",children:"stateless"})," and ",(0,r.jsx)(n.a,{href:"https://github.com/caronc/apprise-api?tab=readme-ov-file#persistent-storage-solution",children:"persistent storage"})," endpoints as well as ",(0,r.jsx)(n.a,{href:"https://github.com/caronc/apprise-api?tab=readme-ov-file#tagging",children:"tags"}),"/"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "type": "apprise",\n "name": "MyAppriseFriendlyNameForLogs",\n "host": "http://192.168.0.100:8080",\n "urls": ["gotify://192.168.0.101:8070/MyToken"], // stateless endpoints\n "keys": ["e90b20526808373353afad7fb98a201198c0c3e0555bea19f182df3388af7b17"], //persistent storage endpoints\n "tags": ["my","optional","tags"]\n}\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"health-endpoint",children:"Health Endpoint"}),"\n",(0,r.jsxs)(n.p,{children:["An endpoint for monitoring the health of sources/clients is available at GET ",(0,r.jsx)(n.code,{children:"http://YourMultiScrobblerDomain/health"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Returns ",(0,r.jsx)(n.code,{children:"200 OK"})," when ",(0,r.jsx)(n.strong,{children:"everything"})," is working or ",(0,r.jsx)(n.code,{children:"500 Internal Server Error"})," if ",(0,r.jsx)(n.strong,{children:"anything"})," is not"]}),"\n",(0,r.jsxs)(n.li,{children:["The plain url (",(0,r.jsx)(n.code,{children:"/health"}),") aggregates status of ",(0,r.jsx)(n.strong,{children:"all clients/sources"})," -- so any failing client/source will make status return 500","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Use query params ",(0,r.jsx)(n.code,{children:"type"})," or ",(0,r.jsx)(n.code,{children:"name"})," to restrict client/sources aggregated IE ",(0,r.jsx)(n.code,{children:"/health?type=spotify"})," or ",(0,r.jsx)(n.code,{children:"/health?name=MyMaloja"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["On 500 the response returns a JSON payload with ",(0,r.jsx)(n.code,{children:"messages"})," array that describes any issues","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For any clients/sources that require authentication ",(0,r.jsx)(n.code,{children:"/health"})," will return 500 if they are ",(0,r.jsx)(n.strong,{children:"not authenticated"})]}),"\n",(0,r.jsxs)(n.li,{children:["For sources that poll (spotify, yt music, subsonic) ",(0,r.jsx)(n.code,{children:"/health"})," will 500 if they are ",(0,r.jsx)(n.strong,{children:"not polling"})]}),"\n"]}),"\n"]}),"\n"]})]})}function p(e={}){let{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(f,{...e})}):f(e)}},49437:function(e,n,i){i.d(n,{Z:()=>h}),i(67294);var s=i(75752),r=i.n(s),l=i(29097),t=i(77084);i(8267);var o=i(11142),c=i.n(o),a=i(85893);let d=e=>{let n,{data:i,name:s,client:t=!1}=e;try{n=c().parse(i)}catch(e){return console.error(e),(0,a.jsxs)(l.Z,{type:"danger",title:"Unexpected Error",children:[(0,a.jsx)("p",{children:"Example component crashed because of error!"}),(0,a.jsx)(r(),{children:e.message})]})}n=(n=n.filter(e=>void 0===e.configureAs||e.configureAs===(t?"client":"source"))).map(e=>({...e,type:s}));let o={[t?"clients":"sources"]:n};return(0,a.jsx)(r(),{title:"CONFIG_DIR/config.json",language:"json5",children:JSON.stringify(o,null,2)})},h=e=>(0,a.jsx)(t.default,{fallback:({error:e})=>(0,a.jsx)("div",{children:(0,a.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,a.jsx)(d,{...e})})},94728:function(e,n,i){i.d(n,{Z:()=>h}),i(67294);var s=i(75752),r=i.n(s),l=i(29097),t=i(77084);i(8267);var o=i(11142),c=i.n(o),a=i(85893);let d=e=>{let n,{data:i,client:s=!1,...t}=e;try{n=c().parse(i)}catch(e){return console.error(e),(0,a.jsxs)(l.Z,{type:"danger",title:"Unexpected Error",children:[(0,a.jsx)("p",{children:"Example component crashed because of error!"}),(0,a.jsx)(r(),{children:e.message})]})}return n=n.filter(e=>void 0===e.configureAs||e.configureAs===(s?"client":"source")),(0,a.jsx)(r(),{...t,language:"json5",children:JSON.stringify(n,null,2)})},h=e=>(0,a.jsx)(t.default,{fallback:({error:e})=>(0,a.jsx)("div",{children:(0,a.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,a.jsx)(d,{...e})})},13727:function(e,n,i){i.d(n,{Z:()=>l});var s=i(67294),r=i(85893);let l=e=>{let{children:n,lower:i,client:l=!1}=e,t=n;void 0===t&&(t=(0,r.jsxs)(s.Fragment,{children:[i?"explore":"Explore"," the schema with an example and live editor/validator"]}));let o=`https://json-schema.app/view/%23/%23%2Fdefinitions%2F${e.objectName}`;return(0,r.jsx)("a",{target:"_blank",href:`${o}?url=${l?"https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fclient.json":"https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json"}`,children:t})}},51952:function(e,n,i){i.d(n,{Z:()=>s});let s='[\n {\n "name": "MySpotify",\n "enable": true,\n "clients": [],\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n }\n]\n'}}]);
+13
assets/js/04d926a5.bdf38d3d.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8051"],{70003:function(e,n,i){i.d(n,{ZP:()=>a,d$:()=>o});var s=i(85893),r=i(50065),l=i(75752),t=i.n(l);let o=[];function c(e){let n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["A ",(0,s.jsx)(n.strong,{children:"Source"})," that monitors active listening uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,s.jsxs)(n.li,{children:["or amount of time (",(0,s.jsx)(n.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["These default values are based on ",(0,s.jsx)(n.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,s.jsxs)(n.p,{children:["These values can be customized in the ",(0,s.jsx)(n.code,{children:"options"})," of Source's ",(0,s.jsx)(n.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,s.jsx)(t(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 + "data": { 3 + // ... 4 + }, 5 + "options": { 6 + // highlight-start 7 + "scrobbleThresholds": { 8 + "duration": 40, // scrobbable if listened to for 40 seconds or more 9 + "percent": 20 // scrobbable if listened to for 20% or more of the track's length 10 + } 11 + // highlight-end 12 + } 13 + }`})]})}function a(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},68875:function(e,n,i){i.r(n),i.d(n,{frontMatter:()=>h,default:()=>p,toc:()=>j,metadata:()=>s,assets:()=>x,contentTitle:()=>u});var s=JSON.parse('{"id":"configuration/configuration","title":"Overview","description":"Check the FAQ if you have any issues after configuration!","source":"@site/docs/configuration/configuration.mdx","sourceDirName":"configuration","slug":"/configuration/","permalink":"/multi-scrobbler/configuration/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/configuration.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","toc_max_heading_level":3},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/updating/"},"next":{"title":"Overview","permalink":"/multi-scrobbler/configuration/clients/"}}'),r=i(85893),l=i(50065),t=i(703),o=i(73752),c=i(75752),a=i.n(c);i(13727),i(49437),i(94728),i(70003);var d=i(51952);let h={sidebar_position:2,title:"Overview",toc_max_heading_level:3},u=void 0,x={},j=[{value:"Configuration Types",id:"configuration-types",level:2},{value:"Setup Sources and Clients",id:"setup-sources-and-clients",level:2},{value:"Secrets Interpolation",id:"secrets-interpolation",level:2},{value:"Application Options",id:"application-options",level:2},{value:"Base URL",id:"base-url",level:3},{value:"Caching",id:"caching",level:3},{value:"Configuration",id:"configuration",level:5},{value:"Configuration",id:"configuration-1",level:5},{value:"Configuration",id:"configuration-2",level:5},{value:"Secondary Caching Configuration",id:"secondary-caching-configuration",level:4},{value:"Debug Mode",id:"debug-mode",level:3},{value:"Disable Web",id:"disable-web",level:3},{value:"Monitoring",id:"monitoring",level:2},{value:"Webhook Configurations",id:"webhook-configurations",level:3},{value:"Gotify",id:"gotify",level:4},{value:"Ntfy",id:"ntfy",level:4},{value:"Apprise",id:"apprise",level:4},{value:"Health Endpoint",id:"health-endpoint",level:3}];function f(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components},{Details:i,DetailsAdmo:s}=n;return i||g("Details",!0),s||g("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Check the ",(0,r.jsx)(n.a,{href:"/multi-scrobbler/FAQ",children:(0,r.jsx)(n.strong,{children:"FAQ"})})," if you have any issues after configuration!"]})}),"\n",(0,r.jsx)(n.h2,{id:"configuration-types",children:"Configuration Types"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/sources",children:(0,r.jsx)(n.strong,{children:"Sources"})})," and ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:(0,r.jsx)(n.strong,{children:"Clients"})})," are configured using:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"environmental (ENV) variables"}),"\n",(0,r.jsx)(n.li,{children:"client/source specific json config files"}),"\n",(0,r.jsx)(n.li,{children:"an all-in-one json config file"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"MS will parse configuration from all configuration types."})," You can mix and match configurations but it is generally better to stick to one or the other."]}),"\n",(0,r.jsxs)(t.default,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.p,{children:["MS will parse environmental variables present in the OS/container when it is run. ",(0,r.jsx)(n.strong,{children:"This method means MS does not require files to run."})]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Use ENV-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You are the only person for whom MS is scrobbling for"}),"\n",(0,r.jsxs)(n.li,{children:["You have a very simple setup for MS such as one scrobble ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Client"})," and one ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:"Source"})," IE Plex -> Maloja"]}),"\n"]})]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(n.p,{children:"For Docker container..."}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'docker run -e "SPOTIFY_CLIENT_ID=yourId" -e "SPOTIFY_CLIENT_SECRET=yourSecret" ...\n'})}),(0,r.jsx)(n.p,{children:"For Docker Compose"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n environment:\n - SPOTIFY_CLIENT_ID=yourId\n - SPOTIFY_CLIENT_SECRET=yourSecret\n - MALOJA_URL=http://domain.tld:42010\n - MALOJA_API_KEY=1234\n # ...\n # ...\n"})}),(0,r.jsx)(n.p,{children:"For a local/node installation export variables before running..."}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"SPOTIFY_CLIENT_ID=yourId SPOTIFY_CLIENT_SECRET=yourSecret npm run start\n"})})]})]}),(0,r.jsxs)(o.default,{value:"file",label:"File",children:[(0,r.jsxs)(n.p,{children:["MS will parse configuration files located in the directory specified by the ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"})," environmental variable. This variable defaults to:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Local installation -> ",(0,r.jsx)(n.code,{children:"PROJECT_DIR/config"})]}),"\n",(0,r.jsxs)(n.li,{children:["Docker -> ",(0,r.jsx)(n.code,{children:"/config"})," (in the container) -- see the ",(0,r.jsx)(n.a,{href:"/multi-scrobbler/installation/#docker",children:"install docs"})," for how to configure this correctly"]}),"\n"]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Use File-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["You have many ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:"Sources"})]}),"\n",(0,r.jsxs)(n.li,{children:["You have many of each type of ",(0,r.jsx)(n.strong,{children:"Source"})," you want to scrobble from IE 2x Plex accounts, 3x Spotify accounts, 1x\nFunkwhale..."]}),"\n",(0,r.jsxs)(n.li,{children:["You have more than one scrobble ",(0,r.jsx)(n.strong,{children:"Client"})," you want to scrobble to IE multiple Maloja servers"]}),"\n",(0,r.jsxs)(n.li,{children:["You want only to scrobble to specific ",(0,r.jsx)(n.strong,{children:"Clients"})]}),"\n",(0,r.jsxs)(n.li,{children:["You need to setup more advanced configuration for a Source/Client","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Most Source/Clients only support basic configuration through ENV, all configuration is possible using File/AIO"}),"\n"]}),"\n"]}),"\n"]})]}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["There are ",(0,r.jsx)(n.strong,{children:"example configurations"})," for all Source/Client types and AIO config located in the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tree/master/config",children:(0,r.jsx)(n.code,{children:"/config"})})," directory of this project. These can be used as-is by renaming them to ",(0,r.jsx)(n.code,{children:".json"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"For docker installations these examples are copied to your configuration directory on first-time use."}),"\n",(0,r.jsxs)(n.li,{children:["There is also a ",(0,r.jsx)(n.a,{href:"/configuration/kitchensink",children:(0,r.jsx)(n.strong,{children:"kitchensink example"})})," that provides examples of using all sources/clients in a complex configuration."]}),"\n"]})}),(0,r.jsxs)(n.p,{children:["Each file is named by the ",(0,r.jsx)(n.strong,{children:"type"})," of the Client/Source found in below sections. Each file as an ",(0,r.jsx)(n.strong,{children:"array"})," of that type of Client/Source."]}),(0,r.jsx)(n.p,{children:"Example directory structure:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/CONFIG_DIR\n plex.json\n spotify.json\n maloja.json\n"})}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(a(),{title:"CONFIG_DIR/spotify.json",language:"json5",children:d.Z})]})]}),(0,r.jsxs)(o.default,{value:"aio",label:"File AIO",children:[(0,r.jsxs)(n.p,{children:["MS will parse an ",(0,r.jsx)(n.strong,{children:"all-in-one"})," configuration file located in the directory specified by the ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"})," environmental variable. This variable defaults to:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Local installation -> ",(0,r.jsx)(n.code,{children:"PROJECT_DIR/config/config.json"})]}),"\n",(0,r.jsxs)(n.li,{children:["Docker -> ",(0,r.jsx)(n.code,{children:"/config/config.json"})," (in the container) -- see the ",(0,r.jsx)(n.a,{href:"/multi-scrobbler/installation/#docker",children:"install docs"})," for how to configure this correctly"]}),"\n"]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Use AIO-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["You have many ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:"Sources"})]}),"\n",(0,r.jsxs)(n.li,{children:["You have many of each type of ",(0,r.jsx)(n.strong,{children:"Source"})," you want to scrobble from IE 2x Plex accounts, 3x Spotify accounts, 1x\nFunkwhale..."]}),"\n",(0,r.jsxs)(n.li,{children:["You have more than one scrobble ",(0,r.jsx)(n.strong,{children:"Client"})," you want to scrobble to IE multiple Maloja servers"]}),"\n",(0,r.jsxs)(n.li,{children:["You want only to scrobble to specific ",(0,r.jsx)(n.strong,{children:"Clients"})]}),"\n",(0,r.jsxs)(n.li,{children:["You need to setup ",(0,r.jsx)(n.a,{href:"#monitoring",children:"monitoring/webhooks"})]}),"\n",(0,r.jsx)(n.li,{children:"You want to setup defaults for all Sources/Clients"}),"\n"]})]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"The AIO config also enables setting default options for sources/clients as well as global options for MS itself."})}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["An example AIO config files can be found in the project directory at ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tree/master/config/config.json.example",children:(0,r.jsx)(n.code,{children:"/config/config.json.example"})})]}),"\n",(0,r.jsx)(n.li,{children:"For docker installations this example is copied to your configuration directory on first-time use."}),"\n",(0,r.jsxs)(n.li,{children:["There is also a ",(0,r.jsx)(n.a,{href:"/configuration/kitchensink",children:(0,r.jsx)(n.strong,{children:"kitchensink example"})})," that provides examples of using all sources/clients in a complex configuration."]}),"\n"]})}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://json-schema.app/view/%23?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Faio.json",children:(0,r.jsx)(n.strong,{children:"Explore the schema for this configuration, along with an example generator and validator, here"})})}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(a(),{title:"CONFIG_DIR/config.json",language:"json5",children:'{\n "debugMode": false,\n "disableWeb": false,\n "sourceDefaults": {\n "logPayload": false,\n "logFilterFailure": "warn",\n "logPlayerState": false,\n "scrobbleThresholds": {\n "duration": 30,\n "percent": 50\n },\n "maxPollRetries": 1,\n "maxRequestRetries": 1,\n "retryMultiplier": 1.5\n },\n "clientDefaults": {\n "maxRequestRetries": 1,\n "retryMultiplier": 1.5\n },\n "sources": [\n {\n "type": "spotify",\n "enable": true,\n "clients": ["myConfig"],\n "name": "mySpotifySource",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback"\n }\n }\n ],\n "clients": [\n {\n "type": "maloja",\n "enable": true,\n "name": "myConfig",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n }\n ],\n "webhooks": [\n {\n "name": "FirstGotifyServer",\n "type": "gotify",\n "url": "http://localhost:8070",\n "token": "MyGotifyToken",\n "priorities": {\n "info": 5,\n "warn": 7,\n "error": 10\n }\n },\n {\n "type": "ntfy",\n "name": "MyNtfyFriendlyNameForLogs",\n "url": "http://localhost:9991",\n "topic": "MyMultiScrobblerTopic",\n "username": "Optional",\n "password": "Optional",\n "priorities": {\n "info": 3,\n "warn": 4,\n "error": 5\n }\n }\n ]\n}\n'})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"setup-sources-and-clients",children:"Setup Sources and Clients"}),"\n",(0,r.jsxs)(n.p,{children:["See the ",(0,r.jsx)(n.a,{href:"#configuration-types",children:"Configuration Types"})," above for your options for creating Source and Client configurations."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Reference ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:(0,r.jsx)(n.strong,{children:"Scrobble Sources"})})," for what Sources are available"]}),"\n",(0,r.jsxs)(n.li,{children:["Reference ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:(0,r.jsx)(n.strong,{children:"Scrobble Clients"})})," for what Clients are available"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Each entry for a Source/Client includes a ",(0,r.jsx)(n.strong,{children:"Configuration"})," section that describes how to configure it using a ",(0,r.jsx)(n.a,{href:"#configuration-types",children:"configuration type"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"secrets-interpolation",children:"Secrets Interpolation"}),"\n",(0,r.jsxs)(n.p,{children:["When using ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})," or ",(0,r.jsx)(n.a,{href:"./?configType=aio#configuration-types",children:"AIO"})," Configuration, Multi-Scrobbler can interpolate Environmental Variables into your json files. This can be used, for example, to keep sensitive data (like ",(0,r.jsx)(n.a,{href:"/configurations/clients/lastfm#configuration",children:"Last.fm Client/Secret"}),") out of your configuration files so that they can be committed to git."]}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler will look for patterns in text fields within ",(0,r.jsx)(n.em,{children:"all"})," of your json files:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Some part of the text field matches: ",(0,r.jsx)(n.code,{children:"[[MY_ENV]]"})]}),"\n",(0,r.jsxs)(n.li,{children:["Is replaced by the value of the Environmental Variable named ",(0,r.jsx)(n.code,{children:"MY_ENV"})]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Given this ",(0,r.jsx)(n.a,{href:"/configurations/clients/lastfm#configuration",children:"Last.fm"})," ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})," config:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="lastfm.json"',children:'[\n {\n "name": "myLastFmClient",\n "configureAs": "client",\n "data": {\n "apiKey": "[[MY_APIKEY]]",\n "secret": "[[MY_SECRET]]",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})}),(0,r.jsxs)(n.p,{children:["And these environmental variables, in this scenario set through ",(0,r.jsx)(n.code,{children:"environment"})," in the ",(0,r.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"docker compose installation"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"MY_APIKEY=a89cba1569901a0671d5a9875fed4be1\nMY_SECRET=ec42e09d5ae0ee0f0816ca151008412a\n"})}),(0,r.jsx)(n.p,{children:"The resulting json multi-scrobbler would use:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="lastfm.json"',children:'[\n {\n "name": "myLastFmClient",\n "configureAs": "client",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(s,{type:"note",summary:"Caveats",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"ENV variable names/interpolation keys are case-insensitive"}),"\n",(0,r.jsxs)(n.li,{children:["Interpolation only works for ",(0,r.jsx)(n.strong,{children:"string"})," values within json. This cannot be used for numbers, booleans, objects, etc..."]}),"\n"]})}),"\n",(0,r.jsxs)(s,{type:"warning",summary:"Missing ENVs",children:[(0,r.jsxs)(n.p,{children:["Multi-scrobbler ",(0,r.jsx)(n.strong,{children:"will not"})," throw an error if the environmental value is not found. Instead, it will leave the string as-is and log a warning (",(0,r.jsx)(n.code,{children:"WARN"})," level) with the names of the missing environmental variable names like so:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"WARN : [App] [Sources] [spotify Secrets] Matched: None | Unmatched: SPOTIFY_SECRET\n"})})]}),"\n",(0,r.jsx)(s,{type:"warning",summary:"ENV Name Collisions",children:(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Verify that interpolation keys/environmental variable names you will use do not collide with existing ENV names used by multi-scrobbler."})," Use the docs search to verify the name you want to use is not already used elsewhere by multi-scrobbler."]})}),"\n",(0,r.jsx)(n.h2,{id:"application-options",children:"Application Options"}),"\n",(0,r.jsx)(n.p,{children:"These options affect multi-scrobbler's behavior and are not specific to any source/client."}),"\n",(0,r.jsx)(n.h3,{id:"base-url",children:"Base URL"}),"\n",(0,r.jsxs)(n.p,{children:["Defines the URL that is used to generate default redirect URLs for authentication on ",(0,r.jsx)(n.a,{href:"/configuration/sources/spotify",children:"spotify"})," and ",(0,r.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"lastfm"})," -- as well as some logging hints."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Default => ",(0,r.jsx)(n.code,{children:"http://localhost:9078"})]}),"\n",(0,r.jsxs)(n.li,{children:["Set with ",(0,r.jsx)(n.a,{href:"./?configType=env#configuration-types",children:"ENV"})," ",(0,r.jsx)(n.code,{children:"BASE_URL"})," or ",(0,r.jsx)(n.code,{children:"baseUrl"})," ",(0,r.jsx)(n.a,{href:"./?configType=aio#configuration-types",children:"all-in-one configuration"})]}),"\n",(0,r.jsxs)(n.li,{children:["If protocol is ",(0,r.jsx)(n.code,{children:"http"})," or no protocol is specified MS will try to use port ",(0,r.jsx)(n.code,{children:"9078"})," -- to override this explicitly set the port or use ",(0,r.jsx)(n.code,{children:"https"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Useful when running with ",(0,r.jsx)(n.a,{href:"/multi-scrobbler/installation/#docker",children:"docker"})," so that you do not need to specify redirect URLs for each configuration."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["EX Lastfm Redirect Url is ",(0,r.jsx)(n.code,{children:"BASE_URL:PORT/lastfm/callback"})," (when no other redirectUri is specified for ",(0,r.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"lastfm configuration"}),")"]}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:(0,r.jsx)(n.code,{children:"BASE_URL"})}),(0,r.jsx)(n.th,{children:"Redirect URL"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"192.168.0.101"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101:9078/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://my.domain.local"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://my.domain.local:9078/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101/my/subfolder"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101:9078/my/subfolder/lastfm/callback"})})]})]})]}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:(0,r.jsx)(n.code,{children:"BASE_URL"})}),(0,r.jsx)(n.th,{children:"Redirect URL"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"my.domain.local:80"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101:80/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"my.domain.local:9000"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://my.domain.local:9000/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"192.168.0.101:4000/my/subfolder"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"http://192.168.0.101:4000/my/subfolder/lastfm/callback"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"https://192.168.0.101"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"https://192.168.0.101:443/lastfm/callback"})})]})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"caching",children:"Caching"}),"\n",(0,r.jsx)(n.p,{children:"Multi-scrobbler caches some activities to persist important data across restarts, reduce external API calls, and make some actions faster."}),"\n",(0,r.jsxs)(n.p,{children:["All of the activities below are ",(0,r.jsx)(n.strong,{children:"always"})," cached ",(0,r.jsx)(n.strong,{children:"in-memory"})," with an optional, configurable ",(0,r.jsxs)(n.a,{href:"#secondary-caching-configuration",children:[(0,r.jsx)(n.strong,{children:"secondary"})," store"]})," for persistence."]}),"\n",(0,r.jsxs)(t.default,{groupId:"cachedThings",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"scrobbles",label:"Scrobbles",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Queued"})," and ",(0,r.jsx)(n.strong,{children:"Failed"})," Scrobbles are cached so that any un-scrobbled data you have is persisted across restarts of multi-scrobbler."]}),(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["By default, this data use a ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary"})," ",(0,r.jsx)(n.a,{href:"./?cacheType=file#secondary-caching-configuration",children:"File"})," store, configured for you automatically."]}),(0,r.jsxs)(n.p,{children:["If you have configured a ",(0,r.jsx)(n.a,{href:"/installation#storage",children:"persisted volume/bind mount"})," for configuration (",(0,r.jsx)(n.code,{children:"/config"})," is mounted in ",(0,r.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"docker compose"}),") then you are already done. If you are not persisting this directory then you should consider setting up ",(0,r.jsx)(n.a,{href:"./?cacheType=valkey#secondary-caching-configuration",children:"Valkey Cache"})," for this."]})]}),(0,r.jsx)(n.h5,{id:"configuration",children:"Configuration"}),(0,r.jsxs)(n.p,{children:["Use any ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary Cache"}),", the config examples below show the default values:"]}),(0,r.jsxs)(t.default,{children:[(0,r.jsx)(o.default,{value:"env",label:"ENV",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"file"})}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE_CONN"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"/config"})}),(0,r.jsx)(n.td,{})]})]})]})}),(0,r.jsx)(o.default,{value:"aio",label:"AIO",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "scrobble": {\n "provider": "file",\n "connection": "/config"\n }\n },\n // ...\n}\n'})})})]})]}),(0,r.jsxs)(o.default,{value:"auth",label:"Auth Data",children:[(0,r.jsx)(n.p,{children:"Authentication sessions/tokens/etc... are cached for quicker requests and for persistence across restarts."}),(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["By default, this data use a ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary"})," ",(0,r.jsx)(n.a,{href:"./?cacheType=file#secondary-caching-configuration",children:"File"})," store, configured for you automatically."]}),(0,r.jsxs)(n.p,{children:["If you have configured a ",(0,r.jsx)(n.a,{href:"/installation#storage",children:"persisted volume/bind mount"})," for configuration (",(0,r.jsx)(n.code,{children:"/config"})," is mounted in ",(0,r.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"docker compose"}),") then you are already done. If you are not persisting this directory then you should consider setting up ",(0,r.jsx)(n.a,{href:"./?cacheType=valkey#secondary-caching-configuration",children:"Valkey Cache"})," for this."]})]}),(0,r.jsx)(n.h5,{id:"configuration-1",children:"Configuration"}),(0,r.jsxs)(n.p,{children:["Use any ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary Cache"}),", the config examples below show the default values:"]}),(0,r.jsxs)(t.default,{children:[(0,r.jsx)(o.default,{value:"env",label:"ENV",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_AUTH"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"file"})}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_AUTH_CONN"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"/config"})}),(0,r.jsx)(n.td,{})]})]})]})}),(0,r.jsx)(o.default,{value:"aio",label:"AIO",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "auth": {\n "provider": "file",\n "connection": "/config"\n }\n },\n // ...\n}\n'})})})]})]}),(0,r.jsxs)(o.default,{value:"metadata",label:"Transform API Calls",children:[(0,r.jsxs)(n.p,{children:["API Calls to external (metadata) services used to ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"Enhance Scrobbles"}),", like calls to ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"}),", can be cached to avoid duplicate calls and speed up scrobble transformations."]}),(0,r.jsxs)(n.p,{children:["By default, these calls are only cached in memory. If you wish for cached calls to be persisted across restarts then setup ",(0,r.jsx)(n.a,{href:"./?cacheType=valkey#secondary-caching-configuration",children:"Valkey Cache"}),"."]}),(0,r.jsx)(n.h5,{id:"configuration-2",children:"Configuration"}),(0,r.jsxs)(n.p,{children:["Use any ",(0,r.jsx)(n.a,{href:"#secondary-caching-configuration",children:"Secondary Cache"}),", the config examples below show the default values:"]}),(0,r.jsxs)(t.default,{children:[(0,r.jsx)(o.default,{value:"env",label:"ENV",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_METADATA"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_METADATA_CONN"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]})]})]})}),(0,r.jsx)(o.default,{value:"aio",label:"AIO",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "metadata": {\n "provider": "valkey",\n "connection": "yourConnectionStringHere"\n }\n },\n // ...\n}\n'})})})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"secondary-caching-configuration",children:"Secondary Caching Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["The type of cache used, and its connection properties, can be configured through ",(0,r.jsx)(n.strong,{children:"ENV"})," or ",(0,r.jsx)(n.strong,{children:"AIO"})," config."]}),"\n",(0,r.jsxs)(t.default,{groupId:"cacheType",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"file",label:"File",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"File"})," cache is stored in the ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"})," directory using the pre-defined file name ",(0,r.jsx)(n.code,{children:"ms-[cacheName].cache"}),"."]}),(0,r.jsxs)(t.default,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"env",label:"ENV",children:[(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"file"})}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE_CONN"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"/config"})}),(0,r.jsx)(n.td,{children:"The directory, within the container, to store the cache file"})]})]})]})]}),(0,r.jsxs)(o.default,{value:"aio",label:"AIO",children:[(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "scrobble": {\n "provider": "file",\n "connection": "/config"\n }\n },\n // ...\n}\n'})})]})]})]}),(0,r.jsxs)(o.default,{value:"valkey",label:"Valkey",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://valkey.io/",children:(0,r.jsx)(n.strong,{children:"Valkey"})})," is an open-source fork of Redis."]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Adding Valkey container to multi-scrobbler"}),(0,r.jsxs)(n.p,{children:["A valkey container can be added to the ",(0,r.jsx)(n.a,{href:"/installation?runType=docker-compose#docker",children:"multi-scrobbler docker compose stack"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n # ...\n # adding everything below\n // highlight-start\n valkey:\n image: valkey/valkey\n volumes:\n - valkeydata:/data\n\nvolumes:\n valkeydata:\n driver: local\n // highlight-end\n"})}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.code,{children:"redis://valkey:6379"})," as the connection string in the configurations below."]})]}),(0,r.jsx)(n.p,{children:"The connection string used by multi-scrobbler to connect to your Valkey instance must be in the form:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"redis://HOST_IP:HOST_PORT\n"})}),(0,r.jsxs)(t.default,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"env",label:"ENV",children:[(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_METADATA"})}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"valkey"})}),(0,r.jsx)(n.td,{children:"The cache type to use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"CACHE_METADATA_CONN"})}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The host/IP and port to connect to EX: ",(0,r.jsx)(n.code,{children:"redis://192.168.0.120:6379"})]})]})]})]})]}),(0,r.jsxs)(o.default,{value:"aio",label:"AIO",children:[(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "cache": {\n "metadata": {\n "provider": "valkey",\n "connection": "redis://192.168.0.120:6379"\n }\n },\n // ...\n}\n'})})]})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"debug-mode",children:"Debug Mode"}),"\n",(0,r.jsx)(n.p,{children:"Turning on Debug Mode will"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:'override and enable all optional "debugging" options found in configuration'}),"\n",(0,r.jsx)(n.li,{children:"set log output to DEBUG"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Use this as a shortcut for enabling output that can be used for troubleshooting and issue reporting. Be aware that logs will likely be VERY noisy while Debug Mode is on. You should only have this mode on while gathering logs for troubleshooting and then turn it off afterwards."}),"\n",(0,r.jsxs)(n.p,{children:["To set debug mode either add it to ",(0,r.jsxs)(n.a,{href:"./?configType=aio#configuration-types",children:["AIO ",(0,r.jsx)(n.code,{children:"config.json"})]})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "debugMode": true,\n "sources": [...],\n // ...\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["or set the ",(0,r.jsx)(n.a,{href:"./?configType=env#configuration-types",children:"ENV"})," ",(0,r.jsx)(n.code,{children:"DEBUG_MODE=true"})]}),"\n",(0,r.jsx)(n.h3,{id:"disable-web",children:"Disable Web"}),"\n",(0,r.jsx)(n.p,{children:"If you do not need the dashboard and/or ingress sources, or have security concerns about ingress and cannot control your hosting environment, the web server and API can be disabled."}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsxs)(n.p,{children:["Any ",(0,r.jsxs)(n.strong,{children:[(0,r.jsx)(n.a,{href:"/configuration/sources#ingress",children:"ingress-based sources"})," will be unusable"]})," (Webscrobbler, etc...) if this is disabled."]})}),"\n",(0,r.jsx)(n.p,{children:"Disable using either:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ENV ",(0,r.jsx)(n.code,{children:"DISABLE_WEB=true"})]}),"\n",(0,r.jsxs)(n.li,{children:["In ",(0,r.jsx)(n.a,{href:"./?configType=aio#configuration-types",children:"All-in-One File"})," use the top-level property ",(0,r.jsx)(n.code,{children:'"disableWeb": true'})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"monitoring",children:"Monitoring"}),"\n",(0,r.jsx)(n.p,{children:"Multi-scrobbler supports some common webhooks and a healthcheck endpoint in order to monitor Sources and Clients for errors."}),"\n",(0,r.jsx)(n.h3,{id:"webhook-configurations",children:"Webhook Configurations"}),"\n",(0,r.jsxs)(n.p,{children:["Webhooks will ",(0,r.jsx)(n.strong,{children:"push"})," a notification to your configured servers on these events:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Source polling started"}),"\n",(0,r.jsx)(n.li,{children:"Source polling retry"}),"\n",(0,r.jsx)(n.li,{children:"Source polling stopped on error"}),"\n",(0,r.jsx)(n.li,{children:"Scrobble client scrobble failure"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Webhooks are configured in the AIO ",(0,r.jsx)(n.a,{href:"#configuration-types",children:"config.json"})," file under the ",(0,r.jsx)(n.code,{children:"webhook"})," top-level property. Multiple webhooks may be configured for each webhook type."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "sources": [\n //...\n ],\n "clients": [\n //...\n ],\n "webhooks": [\n {\n "name": "FirstGotifyServer",\n "type": "gotify",\n "url": "http://192.168.0.100:8070",\n "token": "abcd"\n },\n {\n "name": "SecondGotifyServer",\n "type": "gotify",\n //...\n },\n {\n "name": "NtfyServerOne",\n "type": "ntfy",\n //...\n },\n //...\n ]\n}\n'})})]}),"\n",(0,r.jsx)(n.h4,{id:"gotify",children:(0,r.jsx)(n.a,{href:"https://gotify.net/",children:"Gotify"})}),"\n",(0,r.jsxs)(n.p,{children:["Refer to the ",(0,r.jsx)(n.a,{href:"https://json-schema.app/view/%23/%23%2Fdefinitions%2FGotifyConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Faio.json",children:"config schema for GotifyConfig"})]}),"\n",(0,r.jsxs)(n.p,{children:["multi-scrobbler optionally supports setting message notification priority via ",(0,r.jsx)(n.code,{children:"info"})," ",(0,r.jsx)(n.code,{children:"warn"})," and ",(0,r.jsx)(n.code,{children:"error"})," mappings."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "type": "gotify",\n "name": "MyGotifyFriendlyNameForLogs",\n "url": "http://192.168.0.100:8070",\n "token": "AQZI58fA.rfSZbm",\n "priorities": {\n "info": 5,\n "warn": 7,\n "error": 10\n }\n}\n'})})]}),"\n",(0,r.jsx)(n.h4,{id:"ntfy",children:(0,r.jsx)(n.a,{href:"https://ntfy.sh/",children:"Ntfy"})}),"\n",(0,r.jsxs)(n.p,{children:["Refer to the ",(0,r.jsx)(n.a,{href:"https://json-schema.app/view/%23/%23%2Fdefinitions%2FNtfyConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Faio.json",children:"config schema for NtfyConfig"})]}),"\n",(0,r.jsxs)(n.p,{children:["multi-scrobbler optionally supports setting message notification priority via ",(0,r.jsx)(n.code,{children:"info"})," ",(0,r.jsx)(n.code,{children:"warn"})," and ",(0,r.jsx)(n.code,{children:"error"})," mappings."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "type": "ntfy",\n "name": "MyNtfyFriendlyNameForLogs",\n "url": "http://192.168.0.100:9991",\n "topic": "RvOwKJ1XtIVMXGLR",\n "username": "Optional",\n "password": "Optional",\n "priorities": {\n "info": 3,\n "warn": 4,\n "error": 5\n }\n}\n'})})]}),"\n",(0,r.jsx)(n.h4,{id:"apprise",children:(0,r.jsx)(n.a,{href:"https://github.com/caronc/apprise-api",children:"Apprise"})}),"\n",(0,r.jsxs)(n.p,{children:["Refer to the ",(0,r.jsx)(n.a,{href:"https://json-schema.app/view/%23/%23%2Fdefinitions%2FAppriseConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Faio.json",children:"config schema for AppriseConfig"})]}),"\n",(0,r.jsxs)(n.p,{children:["multi-scrobbler supports ",(0,r.jsx)(n.a,{href:"https://github.com/caronc/apprise-api?tab=readme-ov-file#stateless-solution",children:"stateless"})," and ",(0,r.jsx)(n.a,{href:"https://github.com/caronc/apprise-api?tab=readme-ov-file#persistent-storage-solution",children:"persistent storage"})," endpoints as well as ",(0,r.jsx)(n.a,{href:"https://github.com/caronc/apprise-api?tab=readme-ov-file#tagging",children:"tags"}),"/"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n "type": "apprise",\n "name": "MyAppriseFriendlyNameForLogs",\n "host": "http://192.168.0.100:8080",\n "urls": ["gotify://192.168.0.101:8070/MyToken"], // stateless endpoints\n "keys": ["e90b20526808373353afad7fb98a201198c0c3e0555bea19f182df3388af7b17"], //persistent storage endpoints\n "tags": ["my","optional","tags"]\n}\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"health-endpoint",children:"Health Endpoint"}),"\n",(0,r.jsxs)(n.p,{children:["An endpoint for monitoring the health of sources/clients is available at GET ",(0,r.jsx)(n.code,{children:"http://YourMultiScrobblerDomain/health"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Returns ",(0,r.jsx)(n.code,{children:"200 OK"})," when ",(0,r.jsx)(n.strong,{children:"everything"})," is working or ",(0,r.jsx)(n.code,{children:"500 Internal Server Error"})," if ",(0,r.jsx)(n.strong,{children:"anything"})," is not"]}),"\n",(0,r.jsxs)(n.li,{children:["The plain url (",(0,r.jsx)(n.code,{children:"/health"}),") aggregates status of ",(0,r.jsx)(n.strong,{children:"all clients/sources"})," -- so any failing client/source will make status return 500","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Use query params ",(0,r.jsx)(n.code,{children:"type"})," or ",(0,r.jsx)(n.code,{children:"name"})," to restrict client/sources aggregated IE ",(0,r.jsx)(n.code,{children:"/health?type=spotify"})," or ",(0,r.jsx)(n.code,{children:"/health?name=MyMaloja"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["On 500 the response returns a JSON payload with ",(0,r.jsx)(n.code,{children:"messages"})," array that describes any issues","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For any clients/sources that require authentication ",(0,r.jsx)(n.code,{children:"/health"})," will return 500 if they are ",(0,r.jsx)(n.strong,{children:"not authenticated"})]}),"\n",(0,r.jsxs)(n.li,{children:["For sources that poll (spotify, yt music, subsonic) ",(0,r.jsx)(n.code,{children:"/health"})," will 500 if they are ",(0,r.jsx)(n.strong,{children:"not polling"})]}),"\n"]}),"\n"]}),"\n"]})]})}function p(e={}){let{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(f,{...e})}):f(e)}function g(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},49437:function(e,n,i){i.d(n,{Z:()=>h}),i(67294);var s=i(75752),r=i.n(s),l=i(57682),t=i(77084);i(8267);var o=i(11142),c=i.n(o),a=i(85893);let d=e=>{let n,{data:i,name:s,client:t=!1}=e;try{n=c().parse(i)}catch(e){return console.error(e),(0,a.jsxs)(l.Z,{type:"danger",title:"Unexpected Error",children:[(0,a.jsx)("p",{children:"Example component crashed because of error!"}),(0,a.jsx)(r(),{children:e.message})]})}n=(n=n.filter(e=>void 0===e.configureAs||e.configureAs===(t?"client":"source"))).map(e=>({...e,type:s}));let o={[t?"clients":"sources"]:n};return(0,a.jsx)(r(),{title:"CONFIG_DIR/config.json",language:"json5",children:JSON.stringify(o,null,2)})},h=e=>(0,a.jsx)(t.default,{fallback:({error:e})=>(0,a.jsx)("div",{children:(0,a.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,a.jsx)(d,{...e})})},94728:function(e,n,i){i.d(n,{Z:()=>h}),i(67294);var s=i(75752),r=i.n(s),l=i(57682),t=i(77084);i(8267);var o=i(11142),c=i.n(o),a=i(85893);let d=e=>{let n,{data:i,client:s=!1,...t}=e;try{n=c().parse(i)}catch(e){return console.error(e),(0,a.jsxs)(l.Z,{type:"danger",title:"Unexpected Error",children:[(0,a.jsx)("p",{children:"Example component crashed because of error!"}),(0,a.jsx)(r(),{children:e.message})]})}return n=n.filter(e=>void 0===e.configureAs||e.configureAs===(s?"client":"source")),(0,a.jsx)(r(),{...t,language:"json5",children:JSON.stringify(n,null,2)})},h=e=>(0,a.jsx)(t.default,{fallback:({error:e})=>(0,a.jsx)("div",{children:(0,a.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,a.jsx)(d,{...e})})},13727:function(e,n,i){i.d(n,{Z:()=>l});var s=i(67294),r=i(85893);let l=e=>{let{children:n,lower:i,client:l=!1}=e,t=n;void 0===t&&(t=(0,r.jsxs)(s.Fragment,{children:[i?"explore":"Explore"," the schema with an example and live editor/validator"]}));let o=`https://json-schema.app/view/%23/%23%2Fdefinitions%2F${e.objectName}`;return(0,r.jsx)("a",{target:"_blank",href:`${o}?url=${l?"https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fclient.json":"https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json"}`,children:t})}},51952:function(e,n,i){i.d(n,{Z:()=>s});let s='[\n {\n "name": "MySpotify",\n "enable": true,\n "clients": [],\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n }\n]\n'}}]);
+1
assets/js/094000d3.7e10d90e.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["9325"],{77994:function(e,n,s){s.r(n),s.d(n,{frontMatter:()=>t,default:()=>h,toc:()=>c,metadata:()=>i,assets:()=>l,contentTitle:()=>o});var i=JSON.parse('{"id":"configuration/transforms/transforms","title":"Enhancing Scrobbles","description":"Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler\'s lifecycle.","source":"@site/docs/configuration/transforms/transforms.mdx","sourceDirName":"configuration/transforms","slug":"/configuration/transforms/","permalink":"/multi-scrobbler/configuration/transforms/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/transforms/transforms.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"Enhancing Scrobbles","toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Kitchen Sink","permalink":"/multi-scrobbler/configuration/kitchensink"},"next":{"title":"Musicbrainz Stage","permalink":"/multi-scrobbler/configuration/transforms/musicbrainz"}}'),a=s(85893),r=s(50065);let t={sidebar_position:4,title:"Enhancing Scrobbles",toc_max_heading_level:5},o=void 0,l={},c=[{value:"Journey of a Scrobble",id:"journey-of-a-scrobble",level:2},{value:"Lifecyle Hooks",id:"lifecyle-hooks",level:2},{value:"TLDR",id:"tldr",level:5},{value:"Hook",id:"hook",level:3},{value:"Modification Stage",id:"stage",level:2},{value:"Configuring Stages",id:"configuring-stages",level:3},{value:"Overriding Configuration",id:"overriding-configuration",level:4},{value:"Rules for Play Data",id:"stage-rules",level:3},{value:"Stage Flow Control",id:"flow-control",level:2},{value:"Conditionally Run",id:"conditional-modification",level:3},{value:"Logging",id:"logging",level:2},{value:"Examples",id:"examples",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components},{Details:s,DetailsAdmo:i}=n;return s||u("Details",!0),i||u("DetailsAdmo",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(n.p,{children:["Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in ",(0,a.jsx)(n.strong,{children:"title, artists, and album"})," at many different times in multi-scrobbler's lifecycle."]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Why Would I Do This?"}),(0,a.jsx)(n.p,{children:'You may need to "clean up" data from a Source or before sending to a scrobble Client due to any number of reasons:'}),(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["ID3 tags in your music collection are dirty or have repeating garbage IE ",(0,a.jsx)(n.code,{children:"[YourMusicSource.com] My Artist - My Title"})]}),"\n",(0,a.jsxs)(n.li,{children:["A Source's service often incorrectly adds data to some field IE ",(0,a.jsx)(n.code,{children:"My Artist - My Title (Album Version)"})," when the title should just be ",(0,a.jsx)(n.code,{children:"My Title"})]}),"\n",(0,a.jsx)(n.li,{children:"An Artist you listen to often is spelled different between a Source and a Client which causes duplicate scrobbles"}),"\n"]}),(0,a.jsx)(n.p,{children:"In any scenario where a repeating pattern can be found in the data it would be nice to be able to fix it before the data gets downstream or to help prevent duplicate scrobbling. Multi-scrobbler can help you do this."})]}),"\n",(0,a.jsx)(n.h2,{id:"journey-of-a-scrobble",children:"Journey of a Scrobble"}),"\n",(0,a.jsx)(n.p,{children:"First, let's recap the lifecycle of a scrobble in multi-scrobbler:"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Sources"})," are the beginning of the journey for a ",(0,a.jsx)(n.strong,{children:"Play"})," (song you've listened to long enough to be scrobblable)"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["A Source finds a new valid ",(0,a.jsx)(n.strong,{children:"Play"})]}),"\n",(0,a.jsxs)(n.li,{children:["The Source ",(0,a.jsx)(n.strong,{children:"compares"})," this new Play to all the other Plays it has already seen, if the Play is unique (title/artist/album/listened datetime) then..."]}),"\n",(0,a.jsxs)(n.li,{children:["The Source ",(0,a.jsx)(n.strong,{children:"discovers"})," the Play, adds it to Plays it has seen already, and broadcasts the Play should be scrobbled to all Clients"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Scrobble ",(0,a.jsx)(n.strong,{children:"Clients"})," listen for discovered Plays from Sources, then..."]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["A Client receives a ",(0,a.jsx)(n.strong,{children:"Play"})," from a Source"]}),"\n",(0,a.jsxs)(n.li,{children:["The Client ",(0,a.jsx)(n.strong,{children:"compares"})," this Play to all the other scrobbles it has already seen, if the Play is unique (title/artist/album/listened datetime) then..."]}),"\n",(0,a.jsxs)(n.li,{children:["The Client ",(0,a.jsx)(n.strong,{children:"scrobbles"})," the Play downstream to the scrobble service and adds it as a Scrobble it has seen already"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"lifecyle-hooks",children:"Lifecyle Hooks"}),"\n",(0,a.jsx)(n.p,{children:"You'll notice there is a pattern above that looks like this:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Before"})," data is compared"]}),"\n",(0,a.jsxs)(n.li,{children:["Data is ",(0,a.jsx)(n.strong,{children:"compared"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"After"})," data is compared"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"These points, during both Source and Client processes, are when you can hook into the scrobble lifecycle and modify it."}),"\n",(0,a.jsx)(n.h5,{id:"tldr",children:"TLDR"}),"\n",(0,a.jsxs)(n.p,{children:["In more concrete terms this is the structure of hooks within a configuration (can be used in any ",(0,a.jsx)(n.strong,{children:"Source"})," or ",(0,a.jsx)(n.strong,{children:"Client"}),"):"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json" {10-14}',children:'[\n {\n "name": "myLastFm",\n "enable": true,\n "configureAs": "source",\n "data": {\n // ...\n },\n "options": {\n "playTransform": {\n "preCompare": [/* ... */],\n "compare": [/* ... */],\n "postCompare": [/* ... */]\n }\n }\n }\n]\n'})}),"\n",(0,a.jsx)(n.h3,{id:"hook",children:"Hook"}),"\n",(0,a.jsxs)(n.p,{children:["For ",(0,a.jsx)(n.strong,{children:"Sources"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"preCompare"})," - modify Play data immediately when received"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"compare"})," - temporarily modify Play data when it is being compared to see if Play was already discovered"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"postCompare"})," - modify Play data before sending to scrobble ",(0,a.jsx)(n.strong,{children:"Clients"})]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["For ",(0,a.jsx)(n.strong,{children:"Clients"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"preCompare"})," - modify Play data immediately when received"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"compare"})," - temporarily modify Play data when it is being compared to see if it was already scrobbled"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"postCompare"})," - modify Play data before scrobbling it to downstream service and adding to already seen scrobbles"]}),"\n"]}),"\n",(0,a.jsxs)(i,{type:"tip",summary:"Transformed Scrobbles Are Permanently Modified",children:[(0,a.jsxs)(n.p,{children:["Keep in mind that modifying Scrobble/Play data earlier in the lifecycle will affect that data at all times later in the lifecycle (except when using the ",(0,a.jsx)(n.strong,{children:"compare"})," hook)."]}),(0,a.jsxs)(n.p,{children:["For example, to modify the track so it's the same anywhere it is processed in multi-scrobbler you only need to modify it in the ",(0,a.jsx)(n.strong,{children:"Source's"})," ",(0,a.jsx)(n.code,{children:"preCompare"})," hook because all later processes will receive the data with the modified track."]})]}),"\n",(0,a.jsx)(n.admonition,{title:"TLDR",type:"tip",children:(0,a.jsx)(n.p,{children:(0,a.jsxs)(n.strong,{children:["To modify a scrobble coming from one of your Sources use the ",(0,a.jsx)(n.code,{children:"preCompare"})," hook."]})})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsxs)("summary",{children:["Using ",(0,a.jsx)(n.code,{children:"compare"})," hook"]}),(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"compare"})," ",(0,a.jsx)(n.a,{href:"#hook",children:"hook"})," is slightly different than ",(0,a.jsx)(n.code,{children:"preCompare"})," and ",(0,a.jsx)(n.code,{children:"postCompare"}),". It consists of an object where you define which side(s) of the comparison should be modified. It also ",(0,a.jsx)(n.strong,{children:"does not modify downstream data!"})," Instead, the modifications are made only for use in the comparison."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json"',children:'[\n {\n "name": "myLastFm",\n // ...\n "options": {\n "playTransform": {\n "compare": [\n {\n "candidate": {/* ... */}, // modify the "new" Play being compared\n "existing": {/* ... */}, // modify all "existing" Play/Scrobbles the new Play is being compared against\n }\n ],\n }\n }\n }\n]\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"stage",children:"Modification Stage"}),"\n",(0,a.jsxs)(n.p,{children:["Each ",(0,a.jsx)(n.a,{href:"#hook",children:(0,a.jsx)(n.strong,{children:"hook"})})," is made up of one or more ",(0,a.jsx)(n.strong,{children:"Stages"}),". A Stage is a self-contained, unique way of enhancing or modifying the Play data. Some examples of a Stage:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.a,{href:"/configuration/transforms/user",children:"User"})," Stage allows a user to define search-and-replace terms for Artist/Title/Album"]}),"\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.a,{href:"/configuration/transforms/native",children:"Native"})," Stage uses MS's built-in heuristics to extract Artists from a single Artist string"]}),"\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," Stage tries to match Play data with the Musicbrainz database and to standardize the Artist/Title/Album data"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"Each Stage in a Hook receives Play data from the previous Stage."}),"\n",(0,a.jsxs)(n.p,{children:["Within a hook, each Stage minimally consists of a ",(0,a.jsx)(n.code,{children:"type"})," to identify what Stage it is along with any other data specific to that stage:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "type": "native"\n // optional, stage specific data here...\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"configuring-stages",children:"Configuring Stages"}),"\n",(0,a.jsxs)(n.p,{children:["Stages may be globally configured using ",(0,a.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"})," ",(0,a.jsx)(n.code,{children:"config.json"})," file in the top-level ",(0,a.jsx)(n.code,{children:"transformers"})," block."]}),"\n",(0,a.jsx)(n.p,{children:"Each Stage consists of:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"type"})," the type of Stage"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"name"})," a unique name for the Stage, to be (potentially) used with hooks"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"defaults"})," - An object defining default configuration for this stage, when used in a Hook."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"data"})," - An object containing any data required to initially configure the stage itself (Example: API URL, username, password, etc...)"]}),"\n"]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsxs)(n.p,{children:["Your ",(0,a.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "native",\n "name": "MyNativeTransformer",\n "defaults": {\n // default delimiters when this Stage is used in a hook\n "delimiters": [\n "\u2022"\n ],\n // default delimiters when this Stage is used in a hook\n "artistsParseFrom": ["artists"]\n }\n }\n ]\n}\n'})}),(0,a.jsxs)(n.p,{children:["In a ",(0,a.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,a.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "native"\n "name": "MyNativeTransformer" // when "name" is not defined, uses first found "native" transformer\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,a.jsx)(n.p,{children:"Multiple stages of the same type may be configured, allowing you to define several sets of default behavior."}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsxs)(n.p,{children:["Your ",(0,a.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "native",\n "name": "DotTransformer",\n "defaults": {\n "delimiters": [\n "\u2022"\n ],\n "artistsParseFrom": ["artists"]\n }\n },\n {\n "type": "native",\n "name": "TitleOnly",\n "defaults": {\n // extracts and uses *only* artists found in title string\n "artistsParseFrom": ["title"]\n }\n }\n ]\n}\n'})}),(0,a.jsxs)(n.p,{children:["In a ",(0,a.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,a.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "native"\n "name": "DotTransformer"\n }\n ]\n }\n }\n }\n]\n'})}),(0,a.jsxs)(n.p,{children:["In a ",(0,a.jsx)(n.a,{href:"/configuration/sources/vlc",children:"VLC"})," ",(0,a.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="vlc.json"',children:'[\n { \n "name": "MyVLC",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "native"\n "name": "TitleOnly"\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,a.jsx)(n.h4,{id:"overriding-configuration",children:"Overriding Configuration"}),"\n",(0,a.jsx)(n.p,{children:"The default configuration you set for your Stage may be overridden in any usage of the Stage within a Hook."}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsxs)(n.p,{children:["Your ",(0,a.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "native",\n "name": "MyNativeTransformer",\n "defaults": {\n // default delimiters when this Stage is used in a hook\n "delimiters": [\n "\u2022"\n ],\n // default delimiters when this Stage is used in a hook\n "artistsParseFrom": ["artists"]\n }\n }\n ]\n}\n'})}),(0,a.jsxs)(n.p,{children:["In a ",(0,a.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,a.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "native"\n "name": "MyNativeTransformer",\n // overrides property from "defaults"\n "artistsParseFrom": ["artists", "title"]\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,a.jsx)(n.h3,{id:"stage-rules",children:"Rules for Play Data"}),"\n",(0,a.jsxs)(n.p,{children:["Each ",(0,a.jsx)(n.a,{href:"#stage",children:"Stage"})," may specify whether it should apply the resulting transformation to different parts of the Play data by specifying ",(0,a.jsx)(n.code,{children:"title"}),", ",(0,a.jsx)(n.code,{children:"artists"})," and/or ",(0,a.jsx)(n.code,{children:"album"})," in the Stage object."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "type": "native",\n // ...\n "title": false, // will not apply any changes to Play title\n "artists": {\n "when": {/* ... */}, // will only apply changes to Play artists if "when" is satisfied\n /* ... */\n },\n "albumArtists": true, // will always apply changes to Play album artists\n "album": true, // will always apply changes to Play album\n "duration": true, // will always apply changes to Play duration (length of track)\n "meta": true, // will always apply changes to Play meta (MBIDs, spotify links, etc...)\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:"The actual value of each property may be different for each Stage. Check the docs for the Stage you want to use to see its usage of each."}),"\n",(0,a.jsxs)(n.p,{children:["Generically, though, each property may be some value ",(0,a.jsx)(n.strong,{children:"or"})," an object combining a ",(0,a.jsxs)(n.a,{href:"#conditional-modification",children:[(0,a.jsx)(n.code,{children:"when"})," condition"]})," and that value."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"If none of the properties are specified in the stage then it's assumed all transformed data should be used."})}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["Specifying these Rules is ",(0,a.jsx)(n.strong,{children:"not"})," the same as ",(0,a.jsx)(n.a,{href:"#configuring-stages",children:"configuring the Stage"}),". Rules only determine if the ",(0,a.jsx)(n.em,{children:"result"})," of the transformation should be used (replace) the existing Play Data."]})}),"\n",(0,a.jsx)(n.h2,{id:"flow-control",children:"Stage Flow Control"}),"\n",(0,a.jsxs)(n.p,{children:["Stages may be optionally configured to ",(0,a.jsx)(n.strong,{children:"continue"})," to the next Stage or ",(0,a.jsx)(n.strong,{children:"stop"})," (end early) all subsequent Stages, based on the outcome of the currently running Stage."]}),"\n",(0,a.jsxs)(n.p,{children:["These three properties can be added to the ",(0,a.jsx)(n.a,{href:"#modification-stage",children:"Modification Stage"})," data, alongside ",(0,a.jsx)(n.a,{href:"#rules-for-play-data",children:"Rules"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"onSuccess"})," (default ",(0,a.jsx)(n.code,{children:"continue"}),") - If the Stage successfully finishes processing"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"onFailure"})," (default ",(0,a.jsx)(n.code,{children:"stop"}),") - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation result"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"onSkip"})," (default ",(0,a.jsx)(n.code,{children:"continue"}),") - If the Stage does not process the Play data due to stage-level ",(0,a.jsx)(n.a,{href:"#conditional-modification",children:(0,a.jsx)(n.code,{children:"when"})})," or other stage-specific skip conditions"]}),"\n"]}),"\n",(0,a.jsxs)(n.admonition,{type:"tip",children:[(0,a.jsx)(n.p,{children:"The default behaviors for Flow Control are the same as you would intuitively think Stages should run IE the next Stage you have defined runs if the current Stage does not fail."}),(0,a.jsx)(n.p,{children:"Specifying Flow Control is only necessary if the above assumptions are not true for your scenario."}),(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Default Flow Control Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:' // ...\n "options": {\n "playTransform": {\n "preCompare": [\n {\n // if this stage is successful, native is run\n // if this stage fails, native does not run\n "type": "musicbrainz",\n "name": "MyMB"\n },\n {\n "type": "native",\n "name": "MyNative"\n }\n ]\n }\n }\n'})})]})]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Customized Flow Control Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:' // ...\n "options": {\n "playTransform": {\n "preCompare": [\n {\n // if musicbrainz is successful then do NOT run native,\n // only run native if musicbrainz fails to find a match (onFailure)\n "type": "musicbrainz",\n "name": "MyMB"\n "onSuccess": "stop",\n "onFailure": "continue"\n },\n {\n "type": "native",\n "name": "MyNative"\n }\n ]\n }\n }\n'})})]}),"\n",(0,a.jsx)(n.h3,{id:"conditional-modification",children:"Conditionally Run"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.a,{href:"#stage",children:"Stages"})," within a ",(0,a.jsx)(n.a,{href:"#hook",children:"Hook"}),", and ",(0,a.jsx)(n.a,{href:"#stage-rules",children:"Rules"})," within each Stage, support a ",(0,a.jsx)(n.code,{children:"when"})," object for testing ",(0,a.jsx)(n.strong,{children:"if they should be run."})]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"when"})," object may have propertes for rule. Each property may be a string or regular expression. The value of the property is used to match the ",(0,a.jsx)(n.strong,{children:"pre-transformation"})," values from Play data."]}),"\n",(0,a.jsxs)(n.p,{children:["All parts of an individual ",(0,a.jsx)(n.code,{children:"when"}),' clause must test true to "pass" but if ',(0,a.jsx)(n.strong,{children:"any"})," ",(0,a.jsx)(n.code,{children:"when"})," clauses pass the Stage/Rule is processed."]}),"\n",(0,a.jsxs)(n.p,{children:["If the ",(0,a.jsx)(n.code,{children:"when"})," test does not pass then the Stage is ",(0,a.jsx)(n.a,{href:"#flow-control",children:(0,a.jsxs)(n.strong,{children:["skipped (",(0,a.jsx)(n.code,{children:"onSkip"}),")"]})}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "when":\n {\n "artist": "Elephant Gym", // Play must have an artist matching "Elephant Gym" (AND)\n "album": "Dreams" // Play object must have an album matching "Dreams" (AND)\n }\n}\n'})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "when": [\n {\n "artist": "Elephant Gym", // Play must have an artist matching "Elephant Gym" (AND)\n "album": "Dreams" // Play object must have an album matching "Dreams" (AND)\n },\n // OR\n {\n "title": "/(Remastered)$/", // Play title must match regular expression (AND)\n "album": "Various Artists" // Play album must match "Various Artists" (AND)\n }\n ]\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:"More succinctly:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["All parts (",(0,a.jsx)(n.code,{children:"artist"})," ",(0,a.jsx)(n.code,{children:"album"})," ",(0,a.jsx)(n.code,{children:"albumArtist"})," ",(0,a.jsx)(n.code,{children:"duration"})," ",(0,a.jsx)(n.code,{children:"meta"})," ",(0,a.jsx)(n.code,{children:"title"}),") of a ",(0,a.jsx)(n.code,{children:"when"})," are ",(0,a.jsx)(n.code,{children:"AND"})," conditions"]}),"\n",(0,a.jsxs)(n.li,{children:["All part-objects in the ",(0,a.jsx)(n.code,{children:"when"})," array are ",(0,a.jsx)(n.code,{children:"OR"})," conditions"]}),"\n"]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsxs)("summary",{children:["Example of Stage with ",(0,a.jsx)(n.code,{children:"when"})," condition"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n // IF the artist is Elephant Gym \n // THEN Run native stage\n "playTransform": {\n "preCompare": [\n {\n "type": "native",\n "when": [\n {\n "artist": "/Elephant Gym/"\n }\n ]\n }\n ],\n }\n}\n'})})]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example of individual rule with when condition"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n // Always run native Stage\n //\n // IF artist matches "Elephant Gym"\n // THEN use result of native stage for "artists" of Play data\n "playTransform": {\n "preCompare": {\n "type": "native",\n "artists":\n {\n "when": [\n {\n "artist": "/Elephant Gym/"\n }\n ]\n },\n }\n }\n}\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,a.jsxs)(n.p,{children:["MS can log a diff of Stage transformations if/when they occur. In the ",(0,a.jsx)(n.code,{children:"playTransform"})," object of a Source/Client config use ",(0,a.jsx)(n.code,{children:"log"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:'"log": true'})," => Output original play + final transformed output of last Stage in the array","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["This can also be enabled by using ",(0,a.jsx)(n.a,{href:"/configuration/#debug-mode",children:(0,a.jsx)(n.code,{children:"DEBUG_MODE=true"})})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:'"log": "all"'})," => Output original play + final transformed output of ",(0,a.jsx)(n.strong,{children:"each"})," Stage in the array"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "name": "myThing",\n "data": {/*...*/},\n "options": {\n "playTransform": {\n "preCompare": {/*...*/},\n "log": true\n }\n }\n}\n'})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(n.p,{children:"The output shows the diff between the previous stage (or original Play) and the current stage. In docker logs this is highlighted with diff syntax:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-diff",children:'[2025-12-17 08:53:10.467 -0500] DEBUG : [App] [Sources] [Lastfm - mylfm] [Play Transform] [preCompare] [VLDJJo] Transform Diff\n- Original\n+ musicbrainz-MyMB\n\n Title : Demons Theme Part II (original 12" mix)\n Artists : LTJ Bukem\n Album Artists: (None)\n- Album : Producer 05: Rarities (Original 12" Version)\n+ Album : Producer 05: Rarities (original 12" version)\n Meta : \n * brainz-album: 36759a8a-d3df-47da-a236-60f84fdc0cab\n+ * brainz-artist: 28c1b7b7-355a-48b1-b2c4-75b8eb8080ef\n+ * brainz-track: a0d51240-7ef1-4676-882e-be9f354075cb\n+ * brainz-releaseGroup: e0cce74f-abcc-343b-9390-1673e4d57ce7\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.strong,{children:"Examples"})," sections in specific Stage docs (also in the sidebar):"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"/configuration/transforms/user#examples",children:"User Stage"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"/configuration/transforms/native#examples",children:"Native Stage"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"/configuration/transforms/musicbrainz#examples",children:"Musicbrainz Stage"})}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}function u(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
-1
assets/js/094000d3.d5b07987.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["9325"],{77994:function(e,n,s){s.r(n),s.d(n,{frontMatter:()=>t,default:()=>h,toc:()=>c,metadata:()=>i,assets:()=>l,contentTitle:()=>o});var i=JSON.parse('{"id":"configuration/transforms/transforms","title":"Enhancing Scrobbles","description":"Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler\'s lifecycle.","source":"@site/docs/configuration/transforms/transforms.mdx","sourceDirName":"configuration/transforms","slug":"/configuration/transforms/","permalink":"/multi-scrobbler/configuration/transforms/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/transforms/transforms.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"Enhancing Scrobbles","toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Kitchen Sink","permalink":"/multi-scrobbler/configuration/kitchensink"},"next":{"title":"Musicbrainz Stage","permalink":"/multi-scrobbler/configuration/transforms/musicbrainz"}}'),a=s(85893),r=s(50065);let t={sidebar_position:4,title:"Enhancing Scrobbles",toc_max_heading_level:5},o=void 0,l={},c=[{value:"Journey of a Scrobble",id:"journey-of-a-scrobble",level:2},{value:"Lifecyle Hooks",id:"lifecyle-hooks",level:2},{value:"TLDR",id:"tldr",level:5},{value:"Hook",id:"hook",level:3},{value:"Modification Stage",id:"stage",level:2},{value:"Configuring Stages",id:"configuring-stages",level:3},{value:"Overriding Configuration",id:"overriding-configuration",level:4},{value:"Rules for Play Data",id:"stage-rules",level:3},{value:"Stage Flow Control",id:"flow-control",level:2},{value:"Conditionally Run",id:"conditional-modification",level:3},{value:"Logging",id:"logging",level:2},{value:"Examples",id:"examples",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components},{Details:s}=n;return s||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(n.p,{children:["Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in ",(0,a.jsx)(n.strong,{children:"title, artists, and album"})," at many different times in multi-scrobbler's lifecycle."]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Why Would I Do This?"}),(0,a.jsx)(n.p,{children:'You may need to "clean up" data from a Source or before sending to a scrobble Client due to any number of reasons:'}),(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["ID3 tags in your music collection are dirty or have repeating garbage IE ",(0,a.jsx)(n.code,{children:"[YourMusicSource.com] My Artist - My Title"})]}),"\n",(0,a.jsxs)(n.li,{children:["A Source's service often incorrectly adds data to some field IE ",(0,a.jsx)(n.code,{children:"My Artist - My Title (Album Version)"})," when the title should just be ",(0,a.jsx)(n.code,{children:"My Title"})]}),"\n",(0,a.jsx)(n.li,{children:"An Artist you listen to often is spelled different between a Source and a Client which causes duplicate scrobbles"}),"\n"]}),(0,a.jsx)(n.p,{children:"In any scenario where a repeating pattern can be found in the data it would be nice to be able to fix it before the data gets downstream or to help prevent duplicate scrobbling. Multi-scrobbler can help you do this."})]}),"\n",(0,a.jsx)(n.h2,{id:"journey-of-a-scrobble",children:"Journey of a Scrobble"}),"\n",(0,a.jsx)(n.p,{children:"First, let's recap the lifecycle of a scrobble in multi-scrobbler:"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Sources"})," are the beginning of the journey for a ",(0,a.jsx)(n.strong,{children:"Play"})," (song you've listened to long enough to be scrobblable)"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["A Source finds a new valid ",(0,a.jsx)(n.strong,{children:"Play"})]}),"\n",(0,a.jsxs)(n.li,{children:["The Source ",(0,a.jsx)(n.strong,{children:"compares"})," this new Play to all the other Plays it has already seen, if the Play is unique (title/artist/album/listened datetime) then..."]}),"\n",(0,a.jsxs)(n.li,{children:["The Source ",(0,a.jsx)(n.strong,{children:"discovers"})," the Play, adds it to Plays it has seen already, and broadcasts the Play should be scrobbled to all Clients"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Scrobble ",(0,a.jsx)(n.strong,{children:"Clients"})," listen for discovered Plays from Sources, then..."]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["A Client receives a ",(0,a.jsx)(n.strong,{children:"Play"})," from a Source"]}),"\n",(0,a.jsxs)(n.li,{children:["The Client ",(0,a.jsx)(n.strong,{children:"compares"})," this Play to all the other scrobbles it has already seen, if the Play is unique (title/artist/album/listened datetime) then..."]}),"\n",(0,a.jsxs)(n.li,{children:["The Client ",(0,a.jsx)(n.strong,{children:"scrobbles"})," the Play downstream to the scrobble service and adds it as a Scrobble it has seen already"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"lifecyle-hooks",children:"Lifecyle Hooks"}),"\n",(0,a.jsx)(n.p,{children:"You'll notice there is a pattern above that looks like this:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Before"})," data is compared"]}),"\n",(0,a.jsxs)(n.li,{children:["Data is ",(0,a.jsx)(n.strong,{children:"compared"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"After"})," data is compared"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"These points, during both Source and Client processes, are when you can hook into the scrobble lifecycle and modify it."}),"\n",(0,a.jsx)(n.h5,{id:"tldr",children:"TLDR"}),"\n",(0,a.jsxs)(n.p,{children:["In more concrete terms this is the structure of hooks within a configuration (can be used in any ",(0,a.jsx)(n.strong,{children:"Source"})," or ",(0,a.jsx)(n.strong,{children:"Client"}),"):"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json" {10-14}',children:'[\n {\n "name": "myLastFm",\n "enable": true,\n "configureAs": "source",\n "data": {\n // ...\n },\n "options": {\n "playTransform": {\n "preCompare": [/* ... */],\n "compare": [/* ... */],\n "postCompare": [/* ... */]\n }\n }\n }\n]\n'})}),"\n",(0,a.jsx)(n.h3,{id:"hook",children:"Hook"}),"\n",(0,a.jsxs)(n.p,{children:["For ",(0,a.jsx)(n.strong,{children:"Sources"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"preCompare"})," - modify Play data immediately when received"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"compare"})," - temporarily modify Play data when it is being compared to see if Play was already discovered"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"postCompare"})," - modify Play data before sending to scrobble ",(0,a.jsx)(n.strong,{children:"Clients"})]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["For ",(0,a.jsx)(n.strong,{children:"Clients"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"preCompare"})," - modify Play data immediately when received"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"compare"})," - temporarily modify Play data when it is being compared to see if it was already scrobbled"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"postCompare"})," - modify Play data before scrobbling it to downstream service and adding to already seen scrobbles"]}),"\n"]}),"\n",(0,a.jsxs)(n.admonition,{type:"tip",children:[(0,a.jsxs)(n.p,{children:["Keep in mind that modifying Scrobble/Play data earlier in the lifecycle will affect that data at all times later in the lifecycle (except when using the ",(0,a.jsx)(n.strong,{children:"compare"})," hook)."]}),(0,a.jsxs)(n.p,{children:["For example, to modify the track so it's the same anywhere it is processed in multi-scrobbler you only need to modify it in the ",(0,a.jsx)(n.strong,{children:"Source's"})," ",(0,a.jsx)(n.code,{children:"preCompare"})," hook because all later processes will receive the data with the modified track."]})]}),"\n",(0,a.jsx)(n.admonition,{title:"TLDR",type:"tip",children:(0,a.jsx)(n.p,{children:(0,a.jsxs)(n.strong,{children:["To modify a scrobble coming from one of your Sources use the ",(0,a.jsx)(n.code,{children:"preCompare"})," hook."]})})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsxs)("summary",{children:["Using ",(0,a.jsx)(n.code,{children:"compare"})," hook"]}),(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"compare"})," ",(0,a.jsx)(n.a,{href:"#hook",children:"hook"})," is slightly different than ",(0,a.jsx)(n.code,{children:"preCompare"})," and ",(0,a.jsx)(n.code,{children:"postCompare"}),". It consists of an object where you define which side(s) of the comparison should be modified. It also ",(0,a.jsx)(n.strong,{children:"does not modify downstream data!"})," Instead, the modifications are made only for use in the comparison."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json"',children:'[\n {\n "name": "myLastFm",\n // ...\n "options": {\n "playTransform": {\n "compare": [\n {\n "candidate": {/* ... */}, // modify the "new" Play being compared\n "existing": {/* ... */}, // modify all "existing" Play/Scrobbles the new Play is being compared against\n }\n ],\n }\n }\n }\n]\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"stage",children:"Modification Stage"}),"\n",(0,a.jsxs)(n.p,{children:["Each ",(0,a.jsx)(n.a,{href:"#hook",children:(0,a.jsx)(n.strong,{children:"hook"})})," is made up of one or more ",(0,a.jsx)(n.strong,{children:"Stages"}),". A Stage is a self-contained, unique way of enhancing or modifying the Play data. Some examples of a Stage:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.a,{href:"/configuration/transforms/user",children:"User"})," Stage allows a user to define search-and-replace terms for Artist/Title/Album"]}),"\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.a,{href:"/configuration/transforms/native",children:"Native"})," Stage uses MS's built-in heuristics to extract Artists from a single Artist string"]}),"\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," Stage tries to match Play data with the Musicbrainz database and to standardize the Artist/Title/Album data"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"Each Stage in a Hook receives Play data from the previous Stage."}),"\n",(0,a.jsxs)(n.p,{children:["Within a hook, each Stage minimally consists of a ",(0,a.jsx)(n.code,{children:"type"})," to identify what Stage it is along with any other data specific to that stage:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "type": "native"\n // optional, stage specific data here...\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"configuring-stages",children:"Configuring Stages"}),"\n",(0,a.jsxs)(n.p,{children:["Stages may be globally configured using ",(0,a.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"})," ",(0,a.jsx)(n.code,{children:"config.json"})," file in the top-level ",(0,a.jsx)(n.code,{children:"transformers"})," block."]}),"\n",(0,a.jsx)(n.p,{children:"Each Stage consists of:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"type"})," the type of Stage"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"name"})," a unique name for the Stage, to be (potentially) used with hooks"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"defaults"})," - An object defining default configuration for this stage, when used in a Hook."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"data"})," - An object containing any data required to initially configure the stage itself (Example: API URL, username, password, etc...)"]}),"\n"]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsxs)(n.p,{children:["Your ",(0,a.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "native",\n "name": "MyNativeTransformer",\n "defaults": {\n // default delimiters when this Stage is used in a hook\n "delimiters": [\n "\u2022"\n ],\n // default delimiters when this Stage is used in a hook\n "artistsParseFrom": ["artists"]\n }\n }\n ]\n}\n'})}),(0,a.jsxs)(n.p,{children:["In a ",(0,a.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,a.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "native"\n // when "name" is not defined, uses first found "native" transformer\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,a.jsx)(n.p,{children:"Multiple stages of the same type may be configured, allowing you to define several sets of default behavior."}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsxs)(n.p,{children:["Your ",(0,a.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "native",\n "name": "DotTransformer",\n "defaults": {\n "delimiters": [\n "\u2022"\n ],\n "artistsParseFrom": ["artists"]\n }\n },\n {\n "type": "native",\n "name": "TitleOnly",\n "defaults": {\n // extracts and uses *only* artists found in title string\n "artistsParseFrom": ["title"]\n }\n }\n ]\n}\n'})}),(0,a.jsxs)(n.p,{children:["In a ",(0,a.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,a.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "native"\n "name": "DotTransformer"\n }\n ]\n }\n }\n }\n]\n'})}),(0,a.jsxs)(n.p,{children:["In a ",(0,a.jsx)(n.a,{href:"/configuration/sources/vlc",children:"VLC"})," ",(0,a.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="vlc.json"',children:'[\n { \n "name": "MyVLC",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "native"\n "name": "TitleOnly"\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,a.jsx)(n.h4,{id:"overriding-configuration",children:"Overriding Configuration"}),"\n",(0,a.jsx)(n.p,{children:"The default configuration you set for your Stage may be overridden in any usage of the Stage within a Hook."}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsxs)(n.p,{children:["Your ",(0,a.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "native",\n "name": "MyNativeTransformer",\n "defaults": {\n // default delimiters when this Stage is used in a hook\n "delimiters": [\n "\u2022"\n ],\n // default delimiters when this Stage is used in a hook\n "artistsParseFrom": ["artists"]\n }\n }\n ]\n}\n'})}),(0,a.jsxs)(n.p,{children:["In a ",(0,a.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,a.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "native"\n "name": "MyNativeTransformer",\n // overrides property from "defaults"\n "artistsParseFrom": ["artists", "title"]\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,a.jsx)(n.h3,{id:"stage-rules",children:"Rules for Play Data"}),"\n",(0,a.jsxs)(n.p,{children:["Each ",(0,a.jsx)(n.a,{href:"#stage",children:"Stage"})," may specify whether it should apply the resulting transformation to different parts of the Play data by specifying ",(0,a.jsx)(n.code,{children:"title"}),", ",(0,a.jsx)(n.code,{children:"artists"})," and/or ",(0,a.jsx)(n.code,{children:"album"})," in the Stage object."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "type": "native",\n // ...\n "title": false, // will not apply any changes to Play title\n "artists": {\n "when": {/* ... */}, // will only apply changes to Play artists if "when" is satisfied\n /* ... */\n },\n "albumArtists": true, // will always apply changes to Play album artists\n "album": true, // will always apply changes to Play album\n "duration": true, // will always apply changes to Play duration (length of track)\n "meta": true, // will always apply changes to Play meta (MBIDs, spotify links, etc...)\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:"The actual value of each property may be different for each Stage. Check the docs for the Stage you want to use to see its usage of each."}),"\n",(0,a.jsxs)(n.p,{children:["Generically, though, each property may be some value ",(0,a.jsx)(n.strong,{children:"or"})," an object combining a ",(0,a.jsxs)(n.a,{href:"#conditional-modification",children:[(0,a.jsx)(n.code,{children:"when"})," condition"]})," and that value."]}),"\n",(0,a.jsx)(n.p,{children:"If none of the properties are specified in the stage then it's assumed all transformed data should be used."}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["Specifying these Rules is ",(0,a.jsx)(n.strong,{children:"not"})," the same as ",(0,a.jsx)(n.a,{href:"#configuring-stages",children:"configuring the Stage"}),". Rules only determine if the ",(0,a.jsx)(n.em,{children:"result"})," of the transformation should be used (replace) the existing Play Data."]})}),"\n",(0,a.jsx)(n.h2,{id:"flow-control",children:"Stage Flow Control"}),"\n",(0,a.jsxs)(n.p,{children:["Stages may be optionally configured to ",(0,a.jsx)(n.strong,{children:"continue"})," to the next Stage or ",(0,a.jsx)(n.strong,{children:"stop"})," (end early) all subsequent Stages, based on the outcome of the currently running Stage."]}),"\n",(0,a.jsxs)(n.p,{children:["These three properties can be added to the ",(0,a.jsx)(n.a,{href:"#modification-stage",children:"Modification Stage"})," data, alongside ",(0,a.jsx)(n.a,{href:"#rules-for-play-data",children:"Rules"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"onSuccess"})," (default ",(0,a.jsx)(n.code,{children:"continue"}),") - If the Stage successfully finishes processing"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"onFailure"})," (default ",(0,a.jsx)(n.code,{children:"stop"}),") - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation result"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"onSkip"})," (default ",(0,a.jsx)(n.code,{children:"continue"}),") - If the Stage does not process the Play data due to stage-level ",(0,a.jsx)(n.a,{href:"#conditional-modification",children:(0,a.jsx)(n.code,{children:"when"})})," or other stage-specific skip conditions"]}),"\n"]}),"\n",(0,a.jsxs)(n.admonition,{type:"tip",children:[(0,a.jsx)(n.p,{children:"The default behaviors for Flow Control are the same as you would intuitively think Stages should run IE the next Stage you have defined runs if the current Stage does not fail."}),(0,a.jsx)(n.p,{children:"Specifying Flow Control is only necessary if the above assumptions are not true for your scenario."}),(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Default Flow Control Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:' // ...\n "options": {\n "playTransform": {\n "preCompare": [\n {\n // if this stage is successful, native is run\n // if this stage fails, native does not run\n "type": "musicbrainz",\n "name": "MyMB"\n },\n {\n "type": "native",\n "name": "MyNative"\n }\n ]\n }\n }\n'})})]})]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Customized Flow Control Example"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:' // ...\n "options": {\n "playTransform": {\n "preCompare": [\n {\n // if musicbrainz is successful then do NOT run native,\n // only run native if musicbrainz fails to find a match (onFailure)\n "type": "musicbrainz",\n "name": "MyMB"\n "onSuccess": "stop",\n "onFailure": "continue"\n },\n {\n "type": "native",\n "name": "MyNative"\n }\n ]\n }\n }\n'})})]}),"\n",(0,a.jsx)(n.h3,{id:"conditional-modification",children:"Conditionally Run"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.a,{href:"#stage",children:"Stages"})," within a ",(0,a.jsx)(n.a,{href:"#hook",children:"Hook"}),", and ",(0,a.jsx)(n.a,{href:"#stage-rules",children:"Rules"})," within each Stage, support a ",(0,a.jsx)(n.code,{children:"when"})," object for testing ",(0,a.jsx)(n.strong,{children:"if they should be run."})]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"when"})," object may have propertes for rule. Each property may be a string or regular expression. The value of the property is used to match the ",(0,a.jsx)(n.strong,{children:"pre-transformation"})," values from Play data."]}),"\n",(0,a.jsxs)(n.p,{children:["All parts of an individual ",(0,a.jsx)(n.code,{children:"when"}),' clause must test true to "pass" but if ',(0,a.jsx)(n.strong,{children:"any"})," ",(0,a.jsx)(n.code,{children:"when"})," clauses pass the Stage/Rule is processed."]}),"\n",(0,a.jsxs)(n.p,{children:["If the ",(0,a.jsx)(n.code,{children:"when"})," test does not pass then the Stage is ",(0,a.jsx)(n.a,{href:"#flow-control",children:(0,a.jsxs)(n.strong,{children:["skipped (",(0,a.jsx)(n.code,{children:"onSkip"}),")"]})}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "when":\n {\n "artist": "Elephant Gym", // Play must have an artist matching "Elephant Gym" (AND)\n "album": "Dreams" // Play object must have an album matching "Dreams" (AND)\n }\n}\n'})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "when": [\n {\n "artist": "Elephant Gym", // Play must have an artist matching "Elephant Gym" (AND)\n "album": "Dreams" // Play object must have an album matching "Dreams" (AND)\n },\n // OR\n {\n "title": "/(Remastered)$/", // Play title must match regular expression (AND)\n "album": "Various Artists" // Play album must match "Various Artists" (AND)\n }\n ]\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:"More succinctly:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["All parts (",(0,a.jsx)(n.code,{children:"artist"})," ",(0,a.jsx)(n.code,{children:"album"})," ",(0,a.jsx)(n.code,{children:"albumArtist"})," ",(0,a.jsx)(n.code,{children:"duration"})," ",(0,a.jsx)(n.code,{children:"meta"})," ",(0,a.jsx)(n.code,{children:"title"}),") of a ",(0,a.jsx)(n.code,{children:"when"})," are ",(0,a.jsx)(n.code,{children:"AND"})," conditions"]}),"\n",(0,a.jsxs)(n.li,{children:["All part-objects in the ",(0,a.jsx)(n.code,{children:"when"})," array are ",(0,a.jsx)(n.code,{children:"OR"})," conditions"]}),"\n"]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsxs)("summary",{children:["Example of Stage with ",(0,a.jsx)(n.code,{children:"when"})," condition"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n // IF the artist is Elephant Gym \n // THEN Run native stage\n "playTransform": {\n "preCompare": [\n {\n "type": "native",\n "when": [\n {\n "artist": "/Elephant Gym/"\n }\n ]\n }\n ],\n }\n}\n'})})]}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example of individual rule with when condition"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n // Always run native Stage\n //\n // IF artist matches "Elephant Gym"\n // THEN use result of native stage for "artists" of Play data\n "playTransform": {\n "preCompare": {\n "type": "native",\n "artists":\n {\n "when": [\n {\n "artist": "/Elephant Gym/"\n }\n ]\n },\n }\n }\n}\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,a.jsxs)(n.p,{children:["MS can log a diff of Stage transformations if/when they occur. In the ",(0,a.jsx)(n.code,{children:"playTransform"})," object of a Source/Client config use ",(0,a.jsx)(n.code,{children:"log"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:'"log": true'})," => Output original play + final transformed output of last Stage in the array","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["This can also be enabled by using ",(0,a.jsx)(n.a,{href:"/configuration/#debug-mode",children:(0,a.jsx)(n.code,{children:"DEBUG_MODE=true"})})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:'"log": "all"'})," => Output original play + final transformed output of ",(0,a.jsx)(n.strong,{children:"each"})," Stage in the array"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json5",children:'{\n "name": "myThing",\n "data": {/*...*/},\n "options": {\n "playTransform": {\n "preCompare": {/*...*/},\n "log": true\n }\n }\n}\n'})}),"\n",(0,a.jsxs)(s,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(n.p,{children:"The output shows the diff between the previous stage (or original Play) and the current stage. In docker logs this is highlighted with diff syntax:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-diff",children:'[2025-12-17 08:53:10.467 -0500] DEBUG : [App] [Sources] [Lastfm - mylfm] [Play Transform] [preCompare] [VLDJJo] Transform Diff\n- Original\n+ musicbrainz-MyMB\n\n Title : Demons Theme Part II (original 12" mix)\n Artists : LTJ Bukem\n Album Artists: (None)\n- Album : Producer 05: Rarities (Original 12" Version)\n+ Album : Producer 05: Rarities (original 12" version)\n Meta : \n * brainz-album: 36759a8a-d3df-47da-a236-60f84fdc0cab\n+ * brainz-artist: 28c1b7b7-355a-48b1-b2c4-75b8eb8080ef\n+ * brainz-track: a0d51240-7ef1-4676-882e-be9f354075cb\n+ * brainz-releaseGroup: e0cce74f-abcc-343b-9390-1673e4d57ce7\n'})})]}),"\n",(0,a.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.strong,{children:"Examples"})," sections in specific Stage docs (also in the sidebar):"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"/configuration/transforms/user#examples",children:"User Stage"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"/configuration/transforms/native#examples",children:"Native Stage"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"/configuration/transforms/musicbrainz#examples",children:"Musicbrainz Stage"})}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}}}]);
-1
assets/js/0ce74438.27f78bba.js
··· 1 - (self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3385"],{66210:function(e,t,i){"use strict";i.d(t,{Z:()=>f}),i(67294);var s=i(646),r=JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"sourceDefaults":{"$ref":"#/definitions/SourceDefaults"},"clientDefaults":{"$ref":"#/definitions/ClientDefaults"},"sources":{"type":"array","items":{"$ref":"#/definitions/SourceAIOConfig"}},"clients":{"type":"array","items":{"$ref":"#/definitions/ClientAIOConfig"}},"webhooks":{"type":"array","items":{"$ref":"#/definitions/WebhookConfig"}},"port":{"type":"number","description":"Set the port the multi-scrobbler UI will be served from","default":9078,"examples":[9078]},"baseUrl":{"type":"string","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.","default":"http://localhost","examples":["http://localhost","http://192.168.0.101","https://ms.myDomain.tld"]},"logging":{"$ref":"#/definitions/LogOptions"},"disableWeb":{"type":"boolean","description":"Disable web server from running/listening on port.\\n\\nThis will also make any ingress sources (Plex, Jellyfin, Tautulli, etc...) unusable"},"debugMode":{"type":"boolean","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","default":false,"examples":[false]},"cache":{"$ref":"#/definitions/CacheConfigOptions"},"transformers":{"type":"array","items":{"$ref":"#/definitions/TransformerCommonConfig"}}},"definitions":{"SourceDefaults":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"SourceDefaults"},"LogLevel":{"type":"string","enum":["silent","fatal","error","warn","info","log","verbose","debug"],"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.","title":"LogLevel"},"FileLogOptions":{"type":"object","properties":{"timestamp":{"type":"string","enum":["unix","iso","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","default":"auto"},"size":{"type":["number","string"],"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.","default":"10MB"},"frequency":{"anyOf":[{"type":"string","enum":["daily"]},{"type":"string","enum":["hourly"]},{"type":"number"}],"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.","default":"daily"},"path":{"anyOf":[{"type":"string"},{"$comment":"() => string"}],"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","default":"./logs/app.log"},"level":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false}],"description":"Specify the minimum log level to output to rotating files. If `false` no log files will be created."}},"title":"FileLogOptions"},"ScrobbleThresholds":{"type":"object","properties":{"duration":{"type":["number","null"],"description":"The number of seconds a track has been listened to before it should be considered scrobbled.\\n\\nSet to null to disable.","default":240,"examples":[240]},"percent":{"type":["number","null"],"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.","default":50,"examples":[50]}},"title":"ScrobbleThresholds"},"PlayTransformOptions":{"type":"object","properties":{"log":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["all"]}]},"preCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"},"compare":{"type":"object","properties":{"candidate":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"},"existing":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"}}},"postCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"}},"title":"PlayTransformOptions"},"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm)>":{"anyOf":[{"$ref":"#/definitions/PlayTransformPartsArray%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"}],"description":"Represents the weakly-defined user config. May be an array of parts or one parts object","title":"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm)>"},"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>":{"type":"array","items":{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},"title":"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>"},"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>":{"anyOf":[{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeMetadata"},"name":{"type":"string"},"score":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeUser"},"name":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string","enum":["native"]},"name":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"name":{"type":"string"}}},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{},"artists":{},"albumArtists":{},"album":{},"duration":{},"meta":{},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"}},"required":["type"]}],"title":"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>"},"WhenConditionsConfig":{"$ref":"#/definitions/WhenConditions%3Cstring%3E","title":"WhenConditionsConfig"},"WhenConditions<string>":{"type":"array","items":{"$ref":"#/definitions/WhenParts%3Cstring%3E"},"title":"WhenConditions<string>"},"WhenParts<string>":{"$ref":"#/definitions/PlayTransformPartsAtomic%3Cstring%3E","title":"WhenParts<string>"},"PlayTransformPartsAtomic<string>":{"type":"object","properties":{"title":{"type":"string"},"artists":{"type":"string"},"albumArtists":{"type":"string"},"album":{"type":"string"},"duration":{"type":"string"},"meta":{"type":"string"}},"title":"PlayTransformPartsAtomic<string>"},"Whennable":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"}},"title":"Whennable"},"FlowControlTerm":{"type":"string","enum":["continue","stop"],"title":"FlowControlTerm"},"StageTypeMetadata":{"type":"string","enum":["spotify","musicbrainz","native"],"title":"StageTypeMetadata"},"SearchAndReplaceTerm":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ConditionalSearchAndReplaceTerm"}],"title":"SearchAndReplaceTerm"},"ConditionalSearchAndReplaceTerm":{"$ref":"#/definitions/ConditionalSearchAndReplaceRegExp","title":"ConditionalSearchAndReplaceTerm"},"ConditionalSearchAndReplaceRegExp":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\\n\\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\\n\\nThis can be a literal string like `\'replace with this`, an empty string to remove the search value (`\'\'`), or a special regex value\\n\\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["replace","search"],"title":"ConditionalSearchAndReplaceRegExp"},"SearchAndReplaceRegExp":{"type":"object","properties":{"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\\n\\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\\n\\nThis can be a literal string like `\'replace with this`, an empty string to remove the search value (`\'\'`), or a special regex value\\n\\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["search","replace"],"title":"SearchAndReplaceRegExp"},"ExternalMetadataTerm":{"anyOf":[{"type":"boolean"},{"not":{}},{"$ref":"#/definitions/Whennable"}],"title":"ExternalMetadataTerm"},"StageTypeUser":{"type":"string","enum":["user"],"title":"StageTypeUser"},"ClientDefaults":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"ClientDefaults"},"MatchLoggingOptions":{"type":"object","properties":{"onNoMatch":{"type":"boolean","description":"Log to DEBUG when a new track does NOT match an existing scrobble","default":false,"examples":[false]},"onMatch":{"type":"boolean","description":"Log to DEBUG when a new track DOES match an existing scrobble","default":false,"examples":[false]},"confidenceBreakdown":{"type":"boolean","description":"Include confidence breakdowns in track match logging, if applicable","default":false,"examples":[false]}},"description":"Scrobble matching (between new source track and existing client scrobbles) logging options. Used for debugging.","title":"MatchLoggingOptions"},"SourceAIOConfig":{"anyOf":[{"$ref":"#/definitions/SpotifySourceAIOConfig"},{"$ref":"#/definitions/PlexSourceAIOConfig"},{"$ref":"#/definitions/PlexApiSourceAIOConfig"},{"$ref":"#/definitions/TautulliSourceAIOConfig"},{"$ref":"#/definitions/DeezerSourceAIOConfig"},{"$ref":"#/definitions/DeezerInternalAIOConfig"},{"$ref":"#/definitions/ListenbrainzEndpointSourceAIOConfig"},{"$ref":"#/definitions/LastFMEndpointSourceAIOConfig"},{"$ref":"#/definitions/SubsonicSourceAIOConfig"},{"$ref":"#/definitions/JellySourceAIOConfig"},{"$ref":"#/definitions/JellyApiSourceAIOConfig"},{"$ref":"#/definitions/LastFmSouceAIOConfig"},{"$ref":"#/definitions/YTMusicSourceAIOConfig"},{"$ref":"#/definitions/MPRISSourceAIOConfig"},{"$ref":"#/definitions/MopidySourceAIOConfig"},{"$ref":"#/definitions/ListenBrainzSourceAIOConfig"},{"$ref":"#/definitions/JRiverSourceAIOConfig"},{"$ref":"#/definitions/KodiSourceAIOConfig"},{"$ref":"#/definitions/WebScrobblerSourceAIOConfig"},{"$ref":"#/definitions/ChromecastSourceAIOConfig"},{"$ref":"#/definitions/MalojaSourceAIOConfig"},{"$ref":"#/definitions/MusikcubeSourceAIOConfig"},{"$ref":"#/definitions/MusicCastSourceAIOConfig"},{"$ref":"#/definitions/MPDSourceAIOConfig"},{"$ref":"#/definitions/VLCSourceAIOConfig"},{"$ref":"#/definitions/IcecastSourceAIOConfig"},{"$ref":"#/definitions/AzuracastSourceAIOConfig"},{"$ref":"#/definitions/KoitoSourceAIOConfig"},{"$ref":"#/definitions/TealSourceAIOConfig"},{"$ref":"#/definitions/RockskySourceAIOConfig"}],"title":"SourceAIOConfig"},"SpotifySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SpotifySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["spotify"]}},"required":["data","type"],"title":"SpotifySourceAIOConfig"},"SpotifySourceData":{"type":"object","properties":{"interval":{"type":"number","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","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"spotify client id","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"clientSecret":{"type":"string","description":"spotify client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"spotify redirect URI -- required only if not the default shown here. URI must end in \\"callback\\"","default":"http://localhost:9078/callback","examples":["http://localhost:9078/callback"]}},"required":["clientId","clientSecret"],"title":"SpotifySourceData"},"CommonSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonSourceOptions"},"PlexSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["plex"]}},"required":["data","type"],"title":"PlexSourceAIOConfig"},"PlexSourceData":{"type":"object","properties":{"user":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"libraries":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"servers":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"PlexSourceData"},"PlexApiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/PlexApiOptions"},"type":{"type":"string","enum":["plex"]}},"required":["data","options","type"],"title":"PlexApiSourceAIOConfig"},"PlexApiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"token":{"type":"string"},"url":{"type":"string","description":"http(s)://HOST:PORT of the Plex server to connect to"},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\\n\\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"}},"required":["url"],"title":"PlexApiData"},"PlexApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"ignoreInvalidCert":{"type":"boolean","description":"Ignore invalid cert errors when connecting to Plex\\n\\nUseful for Plex servers using \\"Required\\" Secure Connections with self-signed certificates\\n\\nDo not enable unless you know you need this.","default":false}},"title":"PlexApiOptions"},"TautulliSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["tautulli"]}},"required":["data","type"],"title":"TautulliSourceAIOConfig"},"DeezerSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["deezer"]}},"required":["data","type"],"title":"DeezerSourceAIOConfig"},"DeezerData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"deezer client id","examples":["a89cba1569901a0671d5a9875fed4be1"]},"clientSecret":{"type":"string","description":"deezer client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"deezer redirect URI -- required only if not the default shown here. URI must end in \\"callback\\"","default":"http://localhost:9078/deezer/callback","examples":["http://localhost:9078/deezer/callback"]}},"required":["clientId","clientSecret"],"title":"DeezerData"},"DeezerInternalAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerInternalData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/DeezerInternalSourceOptions"},"type":{"type":"string","enum":["deezer"]}},"required":["data","type"],"title":"DeezerInternalAIOConfig"},"DeezerInternalData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"arl":{"type":"string","description":"ARL retrieved from Deezer response header"},"userAgent":{"type":"string","description":"User agent","default":"Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0"}},"required":["arl"],"title":"DeezerInternalData"},"DeezerInternalSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"fuzzyDiscoveryIgnore":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["aggressive"]}]}},"title":"DeezerInternalSourceOptions"},"ListenbrainzEndpointSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenbrainzEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["endpointlz"]}},"required":["type"],"title":"ListenbrainzEndpointSourceAIOConfig"},"ListenbrainzEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\\n\\nIf you are using multiple Listenbrainz endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\\n\\nExample:\\n\\n* slug: \'usera\' => API URL: http://localhost:9078/api/listenbrainz/usera\\n* slug: \'originb\' => API URL: http://localhost:9078/api/listenbrainz/originb\\n\\nIf no slug is found from an extension\'s incoming webhook event the first Listenbrainz source without a slug will be used"},"token":{"type":["string","null"],"description":"If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source\\n\\nSee: https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#add-the-user-token-to-your-requests"}},"title":"ListenbrainzEndpointData"},"LastFMEndpointSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFMEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["endpointlfm"]}},"required":["type"],"title":"LastFMEndpointSourceAIOConfig"},"LastFMEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\\n\\nIf you are using multiple Last.fm endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\\n\\nExample:\\n\\n* slug: \'usera\' => API URL: http://localhost:9078/api/lastfm/usera\\n* slug: \'originb\' => API URL: http://localhost:9078/api/lastfm/originb\\n\\nIf no slug is found from an extension\'s incoming webhook event the first Last.fm source without a slug will be used"}},"title":"LastFMEndpointData"},"SubsonicSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SubsonicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["subsonic"]}},"required":["data","type"],"title":"SubsonicSourceAIOConfig"},"SubsonicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL of the subsonic media server to query","examples":["http://airsonic.local"]},"user":{"type":"string","description":"Username to login to the server with","examples":[["MyUser"]]},"password":{"type":"string","description":"Password for the user to login to the server with","examples":["MyPassword"]},"ignoreTlsErrors":{"type":"boolean","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.","default":false},"legacyAuthentication":{"type":"boolean","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","default":false},"usersAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\\n\\nIf undefined or an empty string/list MS will scrobble activity from all users"}},"required":["url","user","password"],"title":"SubsonicData"},"JellySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["jellyfin"]}},"required":["data","type"],"title":"JellySourceAIOConfig"},"JellyData":{"type":"object","properties":{"users":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"servers":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"JellyData"},"JellyApiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/JellyApiOptions"},"type":{"type":"string","enum":["jellyfin"]}},"required":["data","options","type"],"title":"JellyApiSourceAIOConfig"},"JellyApiData":{"type":"object","properties":{"url":{"type":"string","description":"HOST:PORT of the Jellyfin server to connect to"},"user":{"type":"string","description":"The username of the user to authenticate for or track scrobbles for"},"password":{"type":"string","description":"Password of the username to authenticate for\\n\\nRequired if `apiKey` is not provided."},"apiKey":{"type":"string","description":"API Key to authenticate with.\\n\\nRequired if `password` is not provided."},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\\n\\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"},"additionalAllowedLibraryTypes":{"type":"array","items":{},"description":"Allow MS to scrobble audio media in libraries classified other than \'music\'\\n\\n`librariesAllow` will achieve the same result as this but this is more convenient if you do not want to explicitly list every library name or are only using `librariesBlock`"},"allowUnknown":{"type":"boolean","description":"Force media with a type of \\"Unknown\\" to be counted as Audio","default":false},"frontendUrlOverride":{"type":"string","description":"HOST:PORT of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from)\\nIf unspecified it will use the normal server HOST and PORT from the `url`\\nNecessary if you are using a reverse proxy or other network configuration that prevents the frontend from accessing the server directly\\n\\nENV: JELLYFIN_FRONTEND_URL_OVERRIDE"}},"required":["url","user"],"title":"JellyApiData"},"JellyApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"JellyApiOptions"},"LastFmSouceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFmSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `lastfm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["lastfm"]}},"required":["data","type"],"title":"LastFmSouceAIOConfig"},"LastFmSourceData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]},"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"}},"required":["apiKey","secret"],"title":"LastFmSourceData"},"YTMusicSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/YTMusicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"type":"object","properties":{"logAuth":{"type":"boolean","description":"When true MS will log to DEBUG all of the credentials data it receives from YTM"},"logDiff":{"type":"boolean","description":"Always log history diff\\n\\nBy default MS will log to `WARN` if history diff is inconsistent but does not log if diff is expected (on new tracks found)\\nSet this to `true` to ALWAYS log diff on new tracks. Expected diffs will log to `DEBUG` and inconsistent diffs will continue to log to `WARN`","default":false},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}}},"type":{"type":"string","enum":["ytmusic"]}},"required":["type"],"title":"YTMusicSourceAIOConfig"},"YTMusicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"cookie":{"type":"string","description":"The cookie retrieved from the Request Headers of music.youtube.com after logging in.\\n\\nSee https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers for how to retrieve this value.","examples":["VISITOR_INFO1_LIVE=jMp2xA1Xz2_PbVc; __Secure-3PAPISID=3AxsXpy0M/AkISpjek; ..."]},"clientId":{"type":"string","description":"Google Cloud Console project OAuth Client ID\\n\\nGenerated from a custom OAuth Client, see docs"},"clientSecret":{"type":"string","description":"Google Cloud Console project OAuth Client Secret\\n\\nGenerated from a custom OAuth Client, see docs"},"redirectUri":{"type":"string","description":"Google Cloud Console project OAuth Client Authorized redirect URI\\n\\nGenerated from a custom OAuth Client, see docs. multi-scrobbler will generate a default based on BASE_URL.\\nOnly specify this if the default does not work for you."},"innertubeOptions":{"$ref":"#/definitions/InnertubeOptions","description":"Additional options for authorization and tailoring YTM client"}},"title":"YTMusicData"},"InnertubeOptions":{"type":"object","properties":{"po_token":{"type":"string","description":"Proof of Origin token\\n\\nMay be required if YTM starts returning 403"},"visitor_data":{"type":"string","description":"Visitor ID value found in VISITOR_INFO1_LIVE or visitorData cookie\\n\\nMay be required if YTM starts returning 403"},"account_index":{"type":"number","description":"If account login results in being able to choose multiple account, use a zero-based index to choose which one to monitor","examples":[0,1]},"location":{"type":"string"},"lang":{"type":"string"},"generate_session_locally":{"type":"boolean"},"device_category":{"type":"string"},"client_type":{"type":"string"},"timezone":{"type":"string"}},"title":"InnertubeOptions"},"MPRISSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPRISData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["mpris"]}},"required":["data","type"],"title":"MPRISSourceAIOConfig"},"MPRISData":{"type":"object","properties":{"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any players that START WITH these values, case-insensitive","examples":[["spotify","vlc"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"MPRISData"},"MopidySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MopidyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["mopidy"]}},"required":["data","type"],"title":"MopidySourceAIOConfig"},"MopidyData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"ws://localhost:6680/mopidy/ws/"},"uriBlacklist":{"type":"array","items":{"type":"string"},"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."},"uriWhitelist":{"type":"array","items":{"type":"string"},"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."},"albumBlacklist":{"type":"array","items":{"type":"string"},"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"]],"default":["Soundcloud"]}},"title":"MopidyData"},"ListenBrainzSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenBrainzSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `listenbrainz.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["listenbrainz"]}},"required":["data","type"],"title":"ListenBrainzSourceAIOConfig"},"ListenBrainzSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzSourceData"},"JRiverSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JRiverData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["jriver"]}},"required":["data","type"],"title":"JRiverSourceAIOConfig"},"JRiverData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"http://localhost:52199/MCWS/v1/"},"username":{"type":"string","description":"If you have enabled authentication, the username you set"},"password":{"type":"string","description":"If you have enabled authentication, the password you set"}},"required":["url"],"title":"JRiverData"},"KodiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KodiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["kodi"]}},"required":["data","type"],"title":"KodiSourceAIOConfig"},"KodiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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"],"default":"http://localhost:8080/jsonrpc"},"username":{"type":"string","description":"The username set for Remote Control via Web Sever"},"password":{"type":"string","description":"The password set for Remote Control via Web Sever"}},"required":["url","username","password"],"title":"KodiData"},"WebScrobblerSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/WebScrobblerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["webscrobbler"]}},"required":["type"],"title":"WebScrobblerSourceAIOConfig"},"WebScrobblerData":{"type":"object","properties":{"slug":{"type":["string","null"],"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"},"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Block scrobbling from specific WebScrobbler Connectors","examples":[["youtube"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only allow scrobbling from specific WebScrobbler Connectors","examples":[["mixcloud","soundcloud","bandcamp"]]}},"title":"WebScrobblerData"},"ChromecastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ChromecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["chromecast"]}},"required":["data","type"],"title":"ChromecastSourceAIOConfig"},"ChromecastData":{"type":"object","properties":{"blacklistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"whitelistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"blacklistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any application that START WITH these values, case-insensitive","examples":[["spotify","pandora"]]},"whitelistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"useAvahi":{"type":"boolean","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.","default":false},"useAutoDiscovery":{"type":"boolean","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"},"devices":{"type":"array","items":{"$ref":"#/definitions/ChromecastDeviceInfo"},"description":"A list of Google Cast devices to monitor\\n\\nIf this is used then `useAutoDiscovery` is set to FALSE, if not explicitly set"},"allowUnknownMedia":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"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","default":false},"forceMediaRecognitionOn":{"type":"array","items":{"type":"string"},"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"}},"title":"ChromecastData"},"ChromecastDeviceInfo":{"type":"object","properties":{"name":{"type":"string","description":"A friendly name to identify this device","examples":["MySmartTV"]},"address":{"type":"string","description":"The IP address of the device","examples":["192.168.0.115"]}},"required":["name","address"],"title":"ChromecastDeviceInfo"},"MalojaSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MalojaSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `maloja.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["maloja"]}},"required":["data","type"],"title":"MalojaSourceAIOConfig"},"MalojaSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaSourceData"},"MusikcubeSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusikcubeData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["musikcube"]}},"required":["data","type"],"title":"MusikcubeSourceAIOConfig"},"MusikcubeData":{"type":"object","properties":{"url":{"type":"string","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"],"default":"ws://localhost:7905"},"password":{"type":"string","description":"Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation\\n\\n* musikcube -> settings -> server setup -> password"},"device_id":{"type":"string"}},"required":["password"],"title":"MusikcubeData"},"MusicCastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusicCastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["musiccast"]}},"required":["data","type"],"title":"MusicCastSourceAIOConfig"},"MusicCastData":{"type":"object","properties":{"url":{"type":"string","description":"The host or URL of the YamahaExtendedControl endpoint to use","examples":[["192.168.0.101","http://192.168.0.101/YamahaExtendedControl"]]}},"required":["url"],"title":"MusicCastData"},"MPDSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPDData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/MPDSourceOptions"},"type":{"type":"string","enum":["mpd"]}},"required":["data","options","type"],"title":"MPDSourceAIOConfig"},"MPDData":{"type":"object","properties":{"url":{"type":"string","description":"URL:PORT of the MPD server to connect to\\n\\nTo use this you must have TCP connections enabled for your MPD server https://mpd.readthedocs.io/en/stable/user.html#client-connections","examples":["localhost:6600"],"default":"localhost:6600"},"path":{"type":"string","description":"If using socket specify the path instead of url.\\n\\ntrailing `~` is replaced by your home directory"},"password":{"type":"string","description":"Password for the server, if set https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords"}},"title":"MPDData"},"MPDSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"MPDSourceOptions"},"VLCSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/VLCData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/VLCSourceOptions"},"type":{"type":"string","enum":["vlc"]}},"required":["data","type"],"title":"VLCSourceAIOConfig"},"VLCData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL:PORT of the VLC server to connect to\\n\\nTo use this you must have the Web (http) interface module enabled and a password set https://foxxmd.github.io/multi-scrobbler/docs/configuration#vlc","examples":["localhost:8080"],"default":"localhost:8080"},"password":{"type":"string","description":"Password for the server"}},"required":["password"],"title":"VLCData"},"VLCSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"filenamePatterns":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"A list of regular expressions to use to extract metadata (title, album, artist) from a filename\\n\\nUsed when VLC reports only the filename for the current audio track"},"logFilenamePatterns":{"type":"boolean","description":"Log to DEBUG when a filename-only track is matched or not matched by filenamePatterns","default":false},"dumpVlcMetadata":{"type":"boolean","description":"Dump all the metadata VLC reports for an audio track to DEBUG.\\n\\nUse this if reporting an issue with VLC not correctly capturing metadata for a track.","default":false}},"title":"VLCSourceOptions"},"IcecastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/IcecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/IcecastSourceOptions"},"type":{"type":"string","enum":["icecast"]}},"required":["data","type"],"title":"IcecastSourceAIOConfig"},"IcecastData":{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/definitions/IcecastSource"}},"icestatsEndpoint":{"type":"string"},"statsEndpoint":{"type":"string"},"nextsongsEndpoint":{"type":"string"},"sevenhtmlEndpoint":{"type":"string"},"icyMetaInt":{"type":"number"},"url":{"type":"string","description":"The Icecast stream URL"}},"required":["url"],"title":"IcecastData"},"IcecastSource":{"type":"string","enum":["icy","ogg","icestats","stats","sevenhtml","nextsongs"],"title":"IcecastSource"},"IcecastSourceOptions":{"type":"object","properties":{"systemScrobble":{"type":"boolean","description":"For Sources that support manual listening, should MS default to scrobbling when no user interaction has occurred?\\n\\nIf not specified MS will use a Source\'s specific behavior, see Source\'s documentation."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"IcecastSourceOptions"},"AzuracastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/AzuracastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["azuracast"]}},"required":["data","type"],"title":"AzuracastSourceAIOConfig"},"AzuracastData":{"type":"object","properties":{"url":{"type":"string","description":"Base URL of the Azuracast instance\\n\\nThis does NOT include the station. If a station is included it will be ignored. Use `station` field to specify station, if necessary","examples":["https://radio.mydomain.tld","http://localhost:80"]},"station":{"type":"string","description":"The specific station to monitor\\n\\nScrobbling will only occur if any of the monitor conditions are met AND the station is ONLINE.\\n\\nTo monitor multiple stations create a Source for each station.","examples":["my-station-1"]},"monitorWhenListeners":{"type":["boolean","number"],"description":"Only activate scrobble monitoring if station\\n\\n* `true` => has any current listeners\\n* `number` => has EQUAL TO or MORE THAN X number of listeners"},"monitorWhenLive":{"type":"boolean","description":"Only activate scrobble monitoring if station has a live DJ/Streamer","default":true},"apiKey":{"type":"string","description":"API Key used to access data about private streams\\n\\nhttps://www.azuracast.com/docs/developers/apis/#api-authentication"}},"required":["url","station"],"title":"AzuracastData"},"KoitoSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KoitoSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `koito.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["koito"]}},"required":["data","type"],"title":"KoitoSourceAIOConfig"},"KoitoSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoSourceData"},"TealSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/TealSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/TealSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"Should always be `souce` when using Tealfm as a Source","default":"source","examples":["source"]},"type":{"type":"string","enum":["tealfm"]}},"required":["data","type"],"title":"TealSourceAIOConfig"},"TealSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\\n\\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\\n\\n* For **App Password** Auth - your email\\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\\n\\nThis is created under https://bsky.app/settings/app-passwords\\n\\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"},"serviceAllow":{"type":"array","items":{"type":"string"}},"serviceDeny":{"type":"array","items":{"type":"string"}}},"required":["identifier"],"title":"TealSourceData"},"TealSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealSourceOptions"},"RockskySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/RockskySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/RockskySourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `rocksky.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["rocksky"]}},"required":["data","type"],"title":"RockskySourceAIOConfig"},"RockskySourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\\n\\n* alice.bsky.social\\n* foxxmd.com\\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockskySourceData"},"RockskySourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockskySourceOptions"},"ClientAIOConfig":{"anyOf":[{"$ref":"#/definitions/MalojaClientAIOConfig"},{"$ref":"#/definitions/LastfmClientAIOConfig"},{"$ref":"#/definitions/ListenBrainzClientAIOConfig"},{"$ref":"#/definitions/KoitoClientAIOConfig"},{"$ref":"#/definitions/TealClientAIOConfig"},{"$ref":"#/definitions/RockSkyClientAIOConfig"}],"title":"ClientAIOConfig"},"MalojaClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/MalojaClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Maloja as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["maloja"]}},"required":["data","name","type"],"title":"MalojaClientAIOConfig"},"MalojaClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaClientData"},"CommonClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonClientOptions"},"LastfmClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LastfmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LastfmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using LastFM as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["lastfm"]}},"required":["data","name","type"],"title":"LastfmClientAIOConfig"},"LastfmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]}},"required":["apiKey","secret"],"title":"LastfmData"},"LastfmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\\n\\n* `true` (default) => Report Now Playing from any eligible Source. \\n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\\n* `false` => Do not report Now Playing\\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LastfmClientOptions"},"ListenBrainzClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/ListenBrainzClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Listenbrainz as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["listenbrainz"]}},"required":["data","name","type"],"title":"ListenBrainzClientAIOConfig"},"ListenBrainzClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzClientData"},"KoitoClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/KoitoClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Koito as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["koito"]}},"required":["data","name","type"],"title":"KoitoClientAIOConfig"},"KoitoClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoClientData"},"TealClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/TealClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/TealClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Tealfm as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["tealfm"]}},"required":["data","name","type"],"title":"TealClientAIOConfig"},"TealClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\\n\\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\\n\\n* For **App Password** Auth - your email\\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\\n\\nThis is created under https://bsky.app/settings/app-passwords\\n\\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"}},"required":["identifier"],"title":"TealClientData"},"TealClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealClientOptions"},"RockSkyClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/RockSkyClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/RockSkyClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using RockSky as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["rocksky"]}},"required":["data","name","type"],"title":"RockSkyClientAIOConfig"},"RockSkyClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\\n\\n* alice.bsky.social\\n* foxxmd.com\\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockSkyClientData"},"RockSkyClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\\n\\n* `true` (default) => Report Now Playing from any eligible Source. \\n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\\n* `false` => Do not report Now Playing\\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockSkyClientOptions"},"WebhookConfig":{"anyOf":[{"$ref":"#/definitions/GotifyConfig"},{"$ref":"#/definitions/NtfyConfig"},{"$ref":"#/definitions/AppriseConfig"}],"title":"WebhookConfig"},"GotifyConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\\n\\n* gotify\\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"url":{"type":"string","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"]},"token":{"type":"string","description":"The token created for this Application in Gotify","examples":["AQZI58fA.rfSZbm"]},"priorities":{"$ref":"#/definitions/PrioritiesConfig","description":"Priority of messages\\n\\n* Info -> 5\\n* Warn -> 7\\n* Error -> 10"}},"required":["token","type","url"],"title":"GotifyConfig"},"PrioritiesConfig":{"type":"object","properties":{"info":{"type":"number","examples":[5]},"warn":{"type":"number","examples":[7]},"error":{"type":"number","examples":[10]}},"required":["info","warn","error"],"title":"PrioritiesConfig"},"NtfyConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\\n\\n* gotify\\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"url":{"type":"string","description":"The URL of the Ntfy server","examples":["http://192.168.0.100:8078"]},"topic":{"type":"string","description":"The topic mutli-scrobbler should POST to"},"username":{"type":"string","description":"Required if topic is protected"},"password":{"type":"string","description":"Required if topic is protected"},"token":{"type":"string","description":"Use instead of username/password, required if topic is protected"},"priorities":{"$ref":"#/definitions/PrioritiesConfig","description":"Priority of messages\\n\\n* Info -> 3\\n* Warn -> 4\\n* Error -> 5"}},"required":["topic","type","url"],"title":"NtfyConfig"},"AppriseConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\\n\\n* gotify\\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"host":{"type":"string","description":"The URL of the apprise-api server","examples":["http://192.168.0.100:8078"]},"urls":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"},"keys":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"},"tags":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Optional [tag(s)](https://github.com/caronc/apprise-api?tab=readme-ov-file#tagging) to send in the notification payload"}},"required":["host","type"],"title":"AppriseConfig"},"LogOptions":{"type":"object","properties":{"level":{"$ref":"#/definitions/LogLevel","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.","default":"info"},"file":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false},{"$ref":"#/definitions/FileLogOptions"}],"description":"Specify the minimum log level to output to rotating files or file output options. If `false` no log files will be created."},"console":{"$ref":"#/definitions/LogLevel","description":"Specify the minimum log level streamed to the console (or docker container)"}},"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```","title":"LogOptions"},"CacheConfigOptions":{"type":"object","properties":{"metadata":{"$ref":"#/definitions/CacheMetadataConfig"},"scrobble":{"$ref":"#/definitions/CacheScrobbleConfig"},"auth":{"$ref":"#/definitions/CacheAuthConfig"},"regex":{"type":"number","description":"Number of regex functions to cache (LRU)","default":200}},"title":"CacheConfigOptions"},"CacheMetadataConfig":{"$ref":"#/definitions/CacheConfig%3CCacheMetadataProvider%3E","title":"CacheMetadataConfig"},"CacheConfig<CacheMetadataProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheMetadataProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheMetadataProvider>"},"CacheMetadataProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheMetadataProvider"},"CacheProvider":{"type":["string","boolean"],"enum":["memory","valkey","file",false],"title":"CacheProvider"},"CacheScrobbleConfig":{"$ref":"#/definitions/CacheConfig%3CCacheScrobbleProvider%3E","title":"CacheScrobbleConfig"},"CacheConfig<CacheScrobbleProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheScrobbleProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheScrobbleProvider>"},"CacheScrobbleProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheScrobbleProvider"},"CacheAuthConfig":{"$ref":"#/definitions/CacheConfig%3CCacheAuthProvider%3E","title":"CacheAuthConfig"},"CacheConfig<CacheAuthProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheAuthProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheAuthProvider>"},"CacheAuthProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheAuthProvider"},"TransformerCommonConfig":{"type":"object","properties":{"defaults":{"type":"object"},"data":{"type":"object"},"type":{"type":"string"},"name":{"type":"string"},"options":{"$ref":"#/definitions/TransformOptions"}},"required":["type"],"title":"TransformerCommonConfig"},"TransformOptions":{"type":"object","properties":{"failOnFetch":{"type":"boolean"},"throwOnFailure":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string","enum":["artists","title","albumArtists","album","duration","meta"]}}]},"ttl":{"type":"string"}},"title":"TransformOptions"}}}'),n=JSON.parse('{"sourceDefaults":{"maxPollRetries":0,"maxRequestRetries":1,"retryMultiplier":1.5},"clientDefaults":{"maxRequestRetries":1,"retryMultiplier":1.5},"baseUrl":"http://localhost","sources":[{"type":"spotify","clients":["myConfig"],"name":"mySpotifySource","data":{"clientId":"a89cba1569901a0671d5a9875fed4be1","clientSecret":"ec42e09d5ae0ee0f0816ca151008412a","redirectUri":"http://localhost:9078/callback"}}],"clients":[{"type":"maloja","name":"myConfig","data":{"url":"http://localhost:42010","apiKey":"myMalojaKey"}}],"webhooks":[{"name":"FirstGotifyServer","type":"gotify","url":"http://localhost:8070","token":"MyGotifyToken","priorities":{"info":5,"warn":7,"error":10}},{"type":"ntfy","name":"MyNtfyFriendlyNameForLogs","url":"http://localhost:9991","topic":"MyMultiScrobblerTopic","username":"Optional","password":"Optional","priorities":{"info":3,"warn":4,"error":5}}]}'),o=i(27722),a=i.n(o),l=i(1184),c=i.n(l),p=i(35283),d=i(85893);function u(){let{colorMode:e}=(0,p.I)();return(0,d.jsx)("div",{style:{display:"flex",flexDirection:"column",overflowY:"hidden",overflowX:"hidden"},children:(0,d.jsxs)("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between"},children:[(0,d.jsx)("div",{style:{width:"50%"},children:(0,d.jsx)(a(),{schema:r,showExamples:!0})}),(0,d.jsx)("div",{style:{boxSizing:"border-box",width:"50%"},children:(0,d.jsx)(c(),{value:JSON.stringify(n,null," "),theme:"dark"===e?"vs-dark":"vs",schema:r,height:"70vh"})})]})})}function f(){return(0,d.jsx)(s.default,{fallback:(0,d.jsx)("div",{children:"Loading..."}),children:()=>(0,d.jsx)(u,{})})}},46259:function(e,t,i){"use strict";i.r(t),i.d(t,{default:()=>l}),i(67294);var s=i(31026),r=i(646),n=i(77084),o=i(85893);function a(){return(0,o.jsx)(n.default,{fallback:({error:e,tryAgain:t})=>(0,o.jsxs)("div",{children:[(0,o.jsxs)("p",{children:["Playground component crashed because of error: ",e.message,"."]}),(0,o.jsx)("button",{onClick:t,children:"Try Again!"})]}),children:(0,o.jsx)(r.default,{fallback:(0,o.jsx)("div",{children:"Loading..."}),children:()=>{let e=i(66210).Z;return(0,o.jsx)(e,{})}})})}function l(){return(0,o.jsx)(s.Z,{title:"Playground",description:"Playground of docusaurus-json-schema-plugin",children:(0,o.jsx)(a,{})})}},68347:function(e,t,i){var s={"./simpleWorker.js":"18352","./simpleWorker":"18352"};function r(e){return Promise.resolve().then(function(){if(!i.o(s,e)){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i(s[e])})}r.keys=()=>Object.keys(s),r.id=68347,e.exports=r},37738:function(e,t,i){var s={"./textModelSync/textModelSync.protocol":["23145","5671"],"./treeSitterParserService":["28922"],"./markerDecorations":["36357"],"./languageService.js":["49079"],"./languageService":["49079"],"./markerDecorationsService":["86036"],"./markerDecorationsService.js":["86036"],"./modelService.js":["51200"],"./resolverService":["88216"],"./semanticTokensProviderStyling":["33789"],"./languageFeatureDebounce":["88191"],"./editorSimpleWorker":["87267"],"./textModelSync/textModelSync.impl.js":["49290"],"./modelService":["51200"],"./semanticTokensDto.js":["14704"],"./textModelSync/textModelSync.impl":["49290"],"./model":["73733"],"./treeViewsDnd":["80642"],"./languagesRegistry":["4765"],"./model.js":["73733"],"./findSectionHeaders.js":["72846"],"./editorBaseApi":["20927"],"./treeSitterParserService.js":["28922"],"./resolverService.js":["88216"],"./semanticTokensProviderStyling.js":["33789"],"./getIconClasses.js":["22016"],"./languageFeatures":["71922"],"./semanticTokensDto":["14704"],"./semanticTokensStylingService":["57404"],"./editorBaseApi.js":["20927"],"./textResourceConfiguration":["71765"],"./treeViewsDndService":["58345"],"./semanticTokensStyling":["73343"],"./textResourceConfiguration.js":["71765"],"./treeViewsDnd.js":["80642"],"./editorWorker.js":["85215"],"./unicodeTextModelHighlighter":["31446"],"./unicodeTextModelHighlighter.js":["31446"],"./editorSimpleWorker.js":["87267"],"./languagesAssociations.js":["73536"],"./languageFeatures.js":["71922"],"./treeViewsDndService.js":["58345"],"./languageFeatureDebounce.js":["88191"],"./languageFeaturesService.js":["60662"],"./editorWorker":["85215"],"./textModelSync/textModelSync.protocol.js":["23145","7469"],"./findSectionHeaders":["72846"],"./languageFeaturesService":["60662"],"./semanticTokensStyling.js":["73343"],"./languagesAssociations":["73536"],"./editorWorkerHost":["98008"],"./editorWorkerHost.js":["98008"],"./getIconClasses":["22016"],"./languagesRegistry.js":["4765"],"./semanticTokensStylingService.js":["57404"],"./markerDecorations.js":["36357"]};function r(e){if(!i.o(s,e))return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=s[e],r=t[0];return Promise.all(t.slice(1).map(i.e)).then(function(){return i(r)})}r.keys=()=>Object.keys(s),r.id=37738,e.exports=r},83596:function(e){function t(e){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=83596,e.exports=t}}]);
+1
assets/js/0ce74438.c335c326.js
··· 1 + (self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3385"],{66210:function(e,t,i){"use strict";i.d(t,{Z:()=>f}),i(67294);var s=i(646),r=JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"sourceDefaults":{"$ref":"#/definitions/SourceDefaults"},"clientDefaults":{"$ref":"#/definitions/ClientDefaults"},"sources":{"type":"array","items":{"$ref":"#/definitions/SourceAIOConfig"}},"clients":{"type":"array","items":{"$ref":"#/definitions/ClientAIOConfig"}},"webhooks":{"type":"array","items":{"$ref":"#/definitions/WebhookConfig"}},"port":{"type":"number","description":"Set the port the multi-scrobbler UI will be served from","default":9078,"examples":[9078]},"baseUrl":{"type":"string","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.","default":"http://localhost","examples":["http://localhost","http://192.168.0.101","https://ms.myDomain.tld"]},"logging":{"$ref":"#/definitions/LogOptions"},"disableWeb":{"type":"boolean","description":"Disable web server from running/listening on port.\\n\\nThis will also make any ingress sources (Plex, Jellyfin, Tautulli, etc...) unusable"},"debugMode":{"type":"boolean","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","default":false,"examples":[false]},"cache":{"$ref":"#/definitions/CacheConfigOptions"},"transformers":{"type":"array","items":{"$ref":"#/definitions/TransformerCommonConfig"}}},"definitions":{"SourceDefaults":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"SourceDefaults"},"LogLevel":{"type":"string","enum":["silent","fatal","error","warn","info","log","verbose","debug"],"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.","title":"LogLevel"},"FileLogOptions":{"type":"object","properties":{"timestamp":{"type":"string","enum":["unix","iso","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","default":"auto"},"size":{"type":["number","string"],"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.","default":"10MB"},"frequency":{"anyOf":[{"type":"string","enum":["daily"]},{"type":"string","enum":["hourly"]},{"type":"number"}],"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.","default":"daily"},"path":{"anyOf":[{"type":"string"},{"$comment":"() => string"}],"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","default":"./logs/app.log"},"level":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false}],"description":"Specify the minimum log level to output to rotating files. If `false` no log files will be created."}},"title":"FileLogOptions"},"ScrobbleThresholds":{"type":"object","properties":{"duration":{"type":["number","null"],"description":"The number of seconds a track has been listened to before it should be considered scrobbled.\\n\\nSet to null to disable.","default":240,"examples":[240]},"percent":{"type":["number","null"],"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.","default":50,"examples":[50]}},"title":"ScrobbleThresholds"},"PlayTransformOptions":{"type":"object","properties":{"log":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["all"]}]},"preCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"},"compare":{"type":"object","properties":{"candidate":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"},"existing":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"}}},"postCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"}},"title":"PlayTransformOptions"},"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm)>":{"anyOf":[{"$ref":"#/definitions/PlayTransformPartsArray%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"}],"description":"Represents the weakly-defined user config. May be an array of parts or one parts object","title":"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm)>"},"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>":{"type":"array","items":{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},"title":"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>"},"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>":{"anyOf":[{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeMetadata"},"name":{"type":"string"},"stageHash":{"type":"string"},"score":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeUser"},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string","enum":["native"]},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"name":{"type":"string"}}},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{},"artists":{},"albumArtists":{},"album":{},"duration":{},"meta":{},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]}],"title":"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>"},"WhenConditionsConfig":{"$ref":"#/definitions/WhenConditions%3Cstring%3E","title":"WhenConditionsConfig"},"WhenConditions<string>":{"type":"array","items":{"$ref":"#/definitions/WhenParts%3Cstring%3E"},"title":"WhenConditions<string>"},"WhenParts<string>":{"$ref":"#/definitions/PlayTransformPartsAtomic%3Cstring%3E","title":"WhenParts<string>"},"PlayTransformPartsAtomic<string>":{"type":"object","properties":{"title":{"type":"string"},"artists":{"type":"string"},"albumArtists":{"type":"string"},"album":{"type":"string"},"duration":{"type":"string"},"meta":{"type":"string"}},"title":"PlayTransformPartsAtomic<string>"},"Whennable":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"}},"title":"Whennable"},"FlowControlTerm":{"type":"string","enum":["continue","stop"],"title":"FlowControlTerm"},"StageTypeMetadata":{"type":"string","enum":["spotify","musicbrainz","native"],"title":"StageTypeMetadata"},"SearchAndReplaceTerm":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ConditionalSearchAndReplaceTerm"}],"title":"SearchAndReplaceTerm"},"ConditionalSearchAndReplaceTerm":{"$ref":"#/definitions/ConditionalSearchAndReplaceRegExp","title":"ConditionalSearchAndReplaceTerm"},"ConditionalSearchAndReplaceRegExp":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\\n\\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\\n\\nThis can be a literal string like `\'replace with this`, an empty string to remove the search value (`\'\'`), or a special regex value\\n\\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["replace","search"],"title":"ConditionalSearchAndReplaceRegExp"},"SearchAndReplaceRegExp":{"type":"object","properties":{"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\\n\\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\\n\\nThis can be a literal string like `\'replace with this`, an empty string to remove the search value (`\'\'`), or a special regex value\\n\\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["search","replace"],"title":"SearchAndReplaceRegExp"},"ExternalMetadataTerm":{"anyOf":[{"type":"boolean"},{"not":{}},{"$ref":"#/definitions/Whennable"}],"title":"ExternalMetadataTerm"},"StageTypeUser":{"type":"string","enum":["user"],"title":"StageTypeUser"},"ClientDefaults":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"ClientDefaults"},"MatchLoggingOptions":{"type":"object","properties":{"onNoMatch":{"type":"boolean","description":"Log to DEBUG when a new track does NOT match an existing scrobble","default":false,"examples":[false]},"onMatch":{"type":"boolean","description":"Log to DEBUG when a new track DOES match an existing scrobble","default":false,"examples":[false]},"confidenceBreakdown":{"type":"boolean","description":"Include confidence breakdowns in track match logging, if applicable","default":false,"examples":[false]}},"description":"Scrobble matching (between new source track and existing client scrobbles) logging options. Used for debugging.","title":"MatchLoggingOptions"},"SourceAIOConfig":{"anyOf":[{"$ref":"#/definitions/SpotifySourceAIOConfig"},{"$ref":"#/definitions/PlexApiSourceAIOConfig"},{"$ref":"#/definitions/DeezerSourceAIOConfig"},{"$ref":"#/definitions/DeezerInternalAIOConfig"},{"$ref":"#/definitions/ListenbrainzEndpointSourceAIOConfig"},{"$ref":"#/definitions/LastFMEndpointSourceAIOConfig"},{"$ref":"#/definitions/SubsonicSourceAIOConfig"},{"$ref":"#/definitions/JellyApiSourceAIOConfig"},{"$ref":"#/definitions/LastFmSouceAIOConfig"},{"$ref":"#/definitions/LibrefmSouceAIOConfig"},{"$ref":"#/definitions/YTMusicSourceAIOConfig"},{"$ref":"#/definitions/MPRISSourceAIOConfig"},{"$ref":"#/definitions/MopidySourceAIOConfig"},{"$ref":"#/definitions/ListenBrainzSourceAIOConfig"},{"$ref":"#/definitions/JRiverSourceAIOConfig"},{"$ref":"#/definitions/KodiSourceAIOConfig"},{"$ref":"#/definitions/WebScrobblerSourceAIOConfig"},{"$ref":"#/definitions/ChromecastSourceAIOConfig"},{"$ref":"#/definitions/MalojaSourceAIOConfig"},{"$ref":"#/definitions/MusikcubeSourceAIOConfig"},{"$ref":"#/definitions/MusicCastSourceAIOConfig"},{"$ref":"#/definitions/MPDSourceAIOConfig"},{"$ref":"#/definitions/VLCSourceAIOConfig"},{"$ref":"#/definitions/IcecastSourceAIOConfig"},{"$ref":"#/definitions/AzuracastSourceAIOConfig"},{"$ref":"#/definitions/KoitoSourceAIOConfig"},{"$ref":"#/definitions/TealSourceAIOConfig"},{"$ref":"#/definitions/RockskySourceAIOConfig"}],"title":"SourceAIOConfig"},"SpotifySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SpotifySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["spotify"]}},"required":["data","type"],"title":"SpotifySourceAIOConfig"},"SpotifySourceData":{"type":"object","properties":{"interval":{"type":"number","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","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"spotify client id","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"clientSecret":{"type":"string","description":"spotify client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"spotify redirect URI -- required only if not the default shown here. URI must end in \\"callback\\"","default":"http://localhost:9078/callback","examples":["http://localhost:9078/callback"]}},"required":["clientId","clientSecret"],"title":"SpotifySourceData"},"CommonSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonSourceOptions"},"PlexApiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/PlexApiOptions"},"type":{"type":"string","enum":["plex"]}},"required":["data","type"],"title":"PlexApiSourceAIOConfig"},"PlexApiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"token":{"type":"string"},"url":{"type":"string","description":"http(s)://HOST:PORT of the Plex server to connect to"},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\\n\\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"}},"required":["url"],"title":"PlexApiData"},"PlexApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"ignoreInvalidCert":{"type":"boolean","description":"Ignore invalid cert errors when connecting to Plex\\n\\nUseful for Plex servers using \\"Required\\" Secure Connections with self-signed certificates\\n\\nDo not enable unless you know you need this.","default":false}},"title":"PlexApiOptions"},"DeezerSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["deezer"]}},"required":["data","type"],"title":"DeezerSourceAIOConfig"},"DeezerData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"deezer client id","examples":["a89cba1569901a0671d5a9875fed4be1"]},"clientSecret":{"type":"string","description":"deezer client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"deezer redirect URI -- required only if not the default shown here. URI must end in \\"callback\\"","default":"http://localhost:9078/deezer/callback","examples":["http://localhost:9078/deezer/callback"]}},"required":["clientId","clientSecret"],"title":"DeezerData"},"DeezerInternalAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerInternalData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/DeezerInternalSourceOptions"},"type":{"type":"string","enum":["deezer"]}},"required":["data","type"],"title":"DeezerInternalAIOConfig"},"DeezerInternalData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"arl":{"type":"string","description":"ARL retrieved from Deezer response header"},"userAgent":{"type":"string","description":"User agent","default":"Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0"}},"required":["arl"],"title":"DeezerInternalData"},"DeezerInternalSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"fuzzyDiscoveryIgnore":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["aggressive"]}]}},"title":"DeezerInternalSourceOptions"},"ListenbrainzEndpointSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenbrainzEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["endpointlz"]}},"required":["type"],"title":"ListenbrainzEndpointSourceAIOConfig"},"ListenbrainzEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\\n\\nIf you are using multiple Listenbrainz endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\\n\\nExample:\\n\\n* slug: \'usera\' => API URL: http://localhost:9078/api/listenbrainz/usera\\n* slug: \'originb\' => API URL: http://localhost:9078/api/listenbrainz/originb\\n\\nIf no slug is found from an extension\'s incoming webhook event the first Listenbrainz source without a slug will be used"},"token":{"type":["string","null"],"description":"If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source\\n\\nSee: https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#add-the-user-token-to-your-requests"}},"title":"ListenbrainzEndpointData"},"LastFMEndpointSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFMEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["endpointlfm"]}},"required":["type"],"title":"LastFMEndpointSourceAIOConfig"},"LastFMEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\\n\\nIf you are using multiple Last.fm endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\\n\\nExample:\\n\\n* slug: \'usera\' => API URL: http://localhost:9078/api/lastfm/usera\\n* slug: \'originb\' => API URL: http://localhost:9078/api/lastfm/originb\\n\\nIf no slug is found from an extension\'s incoming webhook event the first Last.fm source without a slug will be used"}},"title":"LastFMEndpointData"},"SubsonicSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SubsonicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["subsonic"]}},"required":["data","type"],"title":"SubsonicSourceAIOConfig"},"SubsonicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL of the subsonic media server to query","examples":["http://airsonic.local"]},"user":{"type":"string","description":"Username to login to the server with","examples":[["MyUser"]]},"password":{"type":"string","description":"Password for the user to login to the server with","examples":["MyPassword"]},"ignoreTlsErrors":{"type":"boolean","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.","default":false},"legacyAuthentication":{"type":"boolean","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","default":false},"usersAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\\n\\nIf undefined or an empty string/list MS will scrobble activity from all users"}},"required":["url","user","password"],"title":"SubsonicData"},"JellyApiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/JellyApiOptions"},"type":{"type":"string","enum":["jellyfin"]}},"required":["data","options","type"],"title":"JellyApiSourceAIOConfig"},"JellyApiData":{"type":"object","properties":{"url":{"type":"string","description":"HOST:PORT of the Jellyfin server to connect to"},"user":{"type":"string","description":"The username of the user to authenticate for or track scrobbles for"},"password":{"type":"string","description":"Password of the username to authenticate for\\n\\nRequired if `apiKey` is not provided."},"apiKey":{"type":"string","description":"API Key to authenticate with.\\n\\nRequired if `password` is not provided."},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\\n\\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"},"additionalAllowedLibraryTypes":{"type":"array","items":{},"description":"Allow MS to scrobble audio media in libraries classified other than \'music\'\\n\\n`librariesAllow` will achieve the same result as this but this is more convenient if you do not want to explicitly list every library name or are only using `librariesBlock`"},"allowUnknown":{"type":"boolean","description":"Force media with a type of \\"Unknown\\" to be counted as Audio","default":false},"frontendUrlOverride":{"type":"string","description":"HOST:PORT of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from)\\nIf unspecified it will use the normal server HOST and PORT from the `url`\\nNecessary if you are using a reverse proxy or other network configuration that prevents the frontend from accessing the server directly\\n\\nENV: JELLYFIN_FRONTEND_URL_OVERRIDE"}},"required":["url","user"],"title":"JellyApiData"},"JellyApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"JellyApiOptions"},"LastFmSouceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFmSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `lastfm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["lastfm"]}},"required":["data","type"],"title":"LastFmSouceAIOConfig"},"LastFmSourceData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm/Libre.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm/Libre.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]},"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"}},"required":["apiKey","secret"],"title":"LastFmSourceData"},"LibrefmSouceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LibrefmData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `librefm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["librefm"]}},"required":["data","type"],"title":"LibrefmSouceAIOConfig"},"LibrefmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"Optional Secret for Libre.fm account\\n\\nThis can be anything, or it will be generated by multi-scrobbler","examples":["anyValue"]},"secret":{"type":"string","description":"Optional Secret for Libre.fm account\\n\\nThis can be anything, or it will be generated by multi-scrobbler","examples":["anyValue"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"path":{"type":"string"},"urlBase":{"type":"string","description":"(Optional) The host and path prefix for your Libre.fm instance","default":"https://libre.fm/2.0/"},"redirectUri":{"type":"string","description":"Optional URI to use for callback. Specify this if callback should be different than the default. MUST have \\"librefm/callback\\" in the URL somewhere.","default":"http://localhost:9078/librefm/callback","examples":["http://localhost:9078/librefm/callback"]}},"title":"LibrefmData"},"YTMusicSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/YTMusicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"type":"object","properties":{"logAuth":{"type":"boolean","description":"When true MS will log to DEBUG all of the credentials data it receives from YTM"},"logDiff":{"type":"boolean","description":"Always log history diff\\n\\nBy default MS will log to `WARN` if history diff is inconsistent but does not log if diff is expected (on new tracks found)\\nSet this to `true` to ALWAYS log diff on new tracks. Expected diffs will log to `DEBUG` and inconsistent diffs will continue to log to `WARN`","default":false},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}}},"type":{"type":"string","enum":["ytmusic"]}},"required":["type"],"title":"YTMusicSourceAIOConfig"},"YTMusicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"cookie":{"type":"string","description":"The cookie retrieved from the Request Headers of music.youtube.com after logging in.\\n\\nSee https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers for how to retrieve this value.","examples":["VISITOR_INFO1_LIVE=jMp2xA1Xz2_PbVc; __Secure-3PAPISID=3AxsXpy0M/AkISpjek; ..."]},"clientId":{"type":"string","description":"Google Cloud Console project OAuth Client ID\\n\\nGenerated from a custom OAuth Client, see docs"},"clientSecret":{"type":"string","description":"Google Cloud Console project OAuth Client Secret\\n\\nGenerated from a custom OAuth Client, see docs"},"redirectUri":{"type":"string","description":"Google Cloud Console project OAuth Client Authorized redirect URI\\n\\nGenerated from a custom OAuth Client, see docs. multi-scrobbler will generate a default based on BASE_URL.\\nOnly specify this if the default does not work for you."},"innertubeOptions":{"$ref":"#/definitions/InnertubeOptions","description":"Additional options for authorization and tailoring YTM client"}},"title":"YTMusicData"},"InnertubeOptions":{"type":"object","properties":{"po_token":{"type":"string","description":"Proof of Origin token\\n\\nMay be required if YTM starts returning 403"},"visitor_data":{"type":"string","description":"Visitor ID value found in VISITOR_INFO1_LIVE or visitorData cookie\\n\\nMay be required if YTM starts returning 403"},"account_index":{"type":"number","description":"If account login results in being able to choose multiple account, use a zero-based index to choose which one to monitor","examples":[0,1]},"location":{"type":"string"},"lang":{"type":"string"},"generate_session_locally":{"type":"boolean"},"device_category":{"type":"string"},"client_type":{"type":"string"},"timezone":{"type":"string"}},"title":"InnertubeOptions"},"MPRISSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPRISData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["mpris"]}},"required":["data","type"],"title":"MPRISSourceAIOConfig"},"MPRISData":{"type":"object","properties":{"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any players that START WITH these values, case-insensitive","examples":[["spotify","vlc"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"MPRISData"},"MopidySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MopidyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["mopidy"]}},"required":["data","type"],"title":"MopidySourceAIOConfig"},"MopidyData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"ws://localhost:6680/mopidy/ws/"},"uriBlacklist":{"type":"array","items":{"type":"string"},"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."},"uriWhitelist":{"type":"array","items":{"type":"string"},"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."},"albumBlacklist":{"type":"array","items":{"type":"string"},"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"]],"default":["Soundcloud"]}},"title":"MopidyData"},"ListenBrainzSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenBrainzSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `listenbrainz.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["listenbrainz"]}},"required":["data","type"],"title":"ListenBrainzSourceAIOConfig"},"ListenBrainzSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzSourceData"},"JRiverSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JRiverData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["jriver"]}},"required":["data","type"],"title":"JRiverSourceAIOConfig"},"JRiverData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"http://localhost:52199/MCWS/v1/"},"username":{"type":"string","description":"If you have enabled authentication, the username you set"},"password":{"type":"string","description":"If you have enabled authentication, the password you set"}},"required":["url"],"title":"JRiverData"},"KodiSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KodiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["kodi"]}},"required":["data","type"],"title":"KodiSourceAIOConfig"},"KodiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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"],"default":"http://localhost:8080/jsonrpc"},"username":{"type":"string","description":"The username set for Remote Control via Web Sever"},"password":{"type":"string","description":"The password set for Remote Control via Web Sever"}},"required":["url","username","password"],"title":"KodiData"},"WebScrobblerSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/WebScrobblerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["webscrobbler"]}},"required":["type"],"title":"WebScrobblerSourceAIOConfig"},"WebScrobblerData":{"type":"object","properties":{"slug":{"type":["string","null"],"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"},"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Block scrobbling from specific WebScrobbler Connectors","examples":[["youtube"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only allow scrobbling from specific WebScrobbler Connectors","examples":[["mixcloud","soundcloud","bandcamp"]]}},"title":"WebScrobblerData"},"ChromecastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ChromecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["chromecast"]}},"required":["data","type"],"title":"ChromecastSourceAIOConfig"},"ChromecastData":{"type":"object","properties":{"blacklistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"whitelistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"blacklistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any application that START WITH these values, case-insensitive","examples":[["spotify","pandora"]]},"whitelistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"useAvahi":{"type":"boolean","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.","default":false},"useAutoDiscovery":{"type":"boolean","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"},"devices":{"type":"array","items":{"$ref":"#/definitions/ChromecastDeviceInfo"},"description":"A list of Google Cast devices to monitor\\n\\nIf this is used then `useAutoDiscovery` is set to FALSE, if not explicitly set"},"allowUnknownMedia":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"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","default":false},"forceMediaRecognitionOn":{"type":"array","items":{"type":"string"},"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"}},"title":"ChromecastData"},"ChromecastDeviceInfo":{"type":"object","properties":{"name":{"type":"string","description":"A friendly name to identify this device","examples":["MySmartTV"]},"address":{"type":"string","description":"The IP address of the device","examples":["192.168.0.115"]}},"required":["name","address"],"title":"ChromecastDeviceInfo"},"MalojaSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MalojaSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `maloja.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["maloja"]}},"required":["data","type"],"title":"MalojaSourceAIOConfig"},"MalojaSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaSourceData"},"MusikcubeSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusikcubeData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["musikcube"]}},"required":["data","type"],"title":"MusikcubeSourceAIOConfig"},"MusikcubeData":{"type":"object","properties":{"url":{"type":"string","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"],"default":"ws://localhost:7905"},"password":{"type":"string","description":"Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation\\n\\n* musikcube -> settings -> server setup -> password"},"device_id":{"type":"string"}},"required":["password"],"title":"MusikcubeData"},"MusicCastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusicCastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["musiccast"]}},"required":["data","type"],"title":"MusicCastSourceAIOConfig"},"MusicCastData":{"type":"object","properties":{"url":{"type":"string","description":"The host or URL of the YamahaExtendedControl endpoint to use","examples":[["192.168.0.101","http://192.168.0.101/YamahaExtendedControl"]]}},"required":["url"],"title":"MusicCastData"},"MPDSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPDData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/MPDSourceOptions"},"type":{"type":"string","enum":["mpd"]}},"required":["data","options","type"],"title":"MPDSourceAIOConfig"},"MPDData":{"type":"object","properties":{"url":{"type":"string","description":"URL:PORT of the MPD server to connect to\\n\\nTo use this you must have TCP connections enabled for your MPD server https://mpd.readthedocs.io/en/stable/user.html#client-connections","examples":["localhost:6600"],"default":"localhost:6600"},"path":{"type":"string","description":"If using socket specify the path instead of url.\\n\\ntrailing `~` is replaced by your home directory"},"password":{"type":"string","description":"Password for the server, if set https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords"}},"title":"MPDData"},"MPDSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"MPDSourceOptions"},"VLCSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/VLCData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/VLCSourceOptions"},"type":{"type":"string","enum":["vlc"]}},"required":["data","type"],"title":"VLCSourceAIOConfig"},"VLCData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL:PORT of the VLC server to connect to\\n\\nTo use this you must have the Web (http) interface module enabled and a password set https://foxxmd.github.io/multi-scrobbler/docs/configuration#vlc","examples":["localhost:8080"],"default":"localhost:8080"},"password":{"type":"string","description":"Password for the server"}},"required":["password"],"title":"VLCData"},"VLCSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"filenamePatterns":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"A list of regular expressions to use to extract metadata (title, album, artist) from a filename\\n\\nUsed when VLC reports only the filename for the current audio track"},"logFilenamePatterns":{"type":"boolean","description":"Log to DEBUG when a filename-only track is matched or not matched by filenamePatterns","default":false},"dumpVlcMetadata":{"type":"boolean","description":"Dump all the metadata VLC reports for an audio track to DEBUG.\\n\\nUse this if reporting an issue with VLC not correctly capturing metadata for a track.","default":false}},"title":"VLCSourceOptions"},"IcecastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/IcecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/IcecastSourceOptions"},"type":{"type":"string","enum":["icecast"]}},"required":["data","type"],"title":"IcecastSourceAIOConfig"},"IcecastData":{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/definitions/IcecastSource"}},"icestatsEndpoint":{"type":"string"},"statsEndpoint":{"type":"string"},"nextsongsEndpoint":{"type":"string"},"sevenhtmlEndpoint":{"type":"string"},"icyMetaInt":{"type":"number"},"url":{"type":"string","description":"The Icecast stream URL"}},"required":["url"],"title":"IcecastData"},"IcecastSource":{"type":"string","enum":["icy","ogg","icestats","stats","sevenhtml","nextsongs"],"title":"IcecastSource"},"IcecastSourceOptions":{"type":"object","properties":{"systemScrobble":{"type":"boolean","description":"For Sources that support manual listening, should MS default to scrobbling when no user interaction has occurred?\\n\\nIf not specified MS will use a Source\'s specific behavior, see Source\'s documentation."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"IcecastSourceOptions"},"AzuracastSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/AzuracastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"type":{"type":"string","enum":["azuracast"]}},"required":["data","type"],"title":"AzuracastSourceAIOConfig"},"AzuracastData":{"type":"object","properties":{"url":{"type":"string","description":"Base URL of the Azuracast instance\\n\\nThis does NOT include the station. If a station is included it will be ignored. Use `station` field to specify station, if necessary","examples":["https://radio.mydomain.tld","http://localhost:80"]},"station":{"type":"string","description":"The specific station to monitor\\n\\nScrobbling will only occur if any of the monitor conditions are met AND the station is ONLINE.\\n\\nTo monitor multiple stations create a Source for each station.","examples":["my-station-1"]},"monitorWhenListeners":{"type":["boolean","number"],"description":"Only activate scrobble monitoring if station\\n\\n* `true` => has any current listeners\\n* `number` => has EQUAL TO or MORE THAN X number of listeners"},"monitorWhenLive":{"type":"boolean","description":"Only activate scrobble monitoring if station has a live DJ/Streamer","default":true},"apiKey":{"type":"string","description":"API Key used to access data about private streams\\n\\nhttps://www.azuracast.com/docs/developers/apis/#api-authentication"}},"required":["url","station"],"title":"AzuracastData"},"KoitoSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KoitoSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `koito.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["koito"]}},"required":["data","type"],"title":"KoitoSourceAIOConfig"},"KoitoSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoSourceData"},"TealSourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/TealSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/TealSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"Should always be `souce` when using Tealfm as a Source","default":"source","examples":["source"]},"type":{"type":"string","enum":["tealfm"]}},"required":["data","type"],"title":"TealSourceAIOConfig"},"TealSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\\n\\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\\n\\n* For **App Password** Auth - your email\\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\\n\\nThis is created under https://bsky.app/settings/app-passwords\\n\\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"},"serviceAllow":{"type":"array","items":{"type":"string"}},"serviceDeny":{"type":"array","items":{"type":"string"}}},"required":["identifier"],"title":"TealSourceData"},"TealSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealSourceOptions"},"RockskySourceAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/RockskySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/RockskySourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `rocksky.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]},"type":{"type":"string","enum":["rocksky"]}},"required":["data","type"],"title":"RockskySourceAIOConfig"},"RockskySourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\\n\\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\\n* If the player has an existing session w/ track then MS attempts to scrobble it\\n\\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\\n\\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\\n\\n* The current Player session is ended and the Player is removed from MS\\n* MS attempts to scrobble, if the Player has an existing session w/ track\\n\\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\\n\\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\\n\\n* alice.bsky.social\\n* foxxmd.com\\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockskySourceData"},"RockskySourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\\n\\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockskySourceOptions"},"ClientAIOConfig":{"anyOf":[{"$ref":"#/definitions/MalojaClientAIOConfig"},{"$ref":"#/definitions/LastfmClientAIOConfig"},{"$ref":"#/definitions/LibrefmClientAIOConfig"},{"$ref":"#/definitions/ListenBrainzClientAIOConfig"},{"$ref":"#/definitions/KoitoClientAIOConfig"},{"$ref":"#/definitions/TealClientAIOConfig"},{"$ref":"#/definitions/RockSkyClientAIOConfig"}],"title":"ClientAIOConfig"},"MalojaClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/MalojaClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Maloja as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["maloja"]}},"required":["data","name","type"],"title":"MalojaClientAIOConfig"},"MalojaClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaClientData"},"CommonClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonClientOptions"},"LastfmClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LastfmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LastfmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using LastFM as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["lastfm"]}},"required":["data","name","type"],"title":"LastfmClientAIOConfig"},"LastfmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm/Libre.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm/Libre.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]}},"required":["apiKey","secret"],"title":"LastfmData"},"LastfmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\\n\\n* `true` (default) => Report Now Playing from any eligible Source. \\n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\\n* `false` => Do not report Now Playing\\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LastfmClientOptions"},"LibrefmClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LibrefmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LibrefmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Librefm as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["librefm"]}},"required":["data","name","type"],"title":"LibrefmClientAIOConfig"},"LibrefmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\\n\\n* `true` (default) => Report Now Playing from any eligible Source. \\n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\\n* `false` => Do not report Now Playing\\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LibrefmClientOptions"},"ListenBrainzClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/ListenBrainzClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Listenbrainz as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["listenbrainz"]}},"required":["data","name","type"],"title":"ListenBrainzClientAIOConfig"},"ListenBrainzClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzClientData"},"KoitoClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/KoitoClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Koito as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["koito"]}},"required":["data","name","type"],"title":"KoitoClientAIOConfig"},"KoitoClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoClientData"},"TealClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/TealClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/TealClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Tealfm as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["tealfm"]}},"required":["data","name","type"],"title":"TealClientAIOConfig"},"TealClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\\n\\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\\n\\n* For **App Password** Auth - your email\\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\\n\\nThis is created under https://bsky.app/settings/app-passwords\\n\\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"}},"required":["identifier"],"title":"TealClientData"},"TealClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealClientOptions"},"RockSkyClientAIOConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/RockSkyClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/RockSkyClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using RockSky as a client","default":"client","examples":["client"]},"type":{"type":"string","enum":["rocksky"]}},"required":["data","name","type"],"title":"RockSkyClientAIOConfig"},"RockSkyClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\\n\\n* alice.bsky.social\\n* foxxmd.com\\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockSkyClientData"},"RockSkyClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\\n\\n* `true` (default) => Report Now Playing from any eligible Source. \\n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\\n* `false` => Do not report Now Playing\\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\\n\\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\\n\\nThis setting should only be changed in specific scenarios where MS is handling multiple \\"relaying\\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\\n\\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockSkyClientOptions"},"WebhookConfig":{"anyOf":[{"$ref":"#/definitions/GotifyConfig"},{"$ref":"#/definitions/NtfyConfig"},{"$ref":"#/definitions/AppriseConfig"}],"title":"WebhookConfig"},"GotifyConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\\n\\n* gotify\\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"url":{"type":"string","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"]},"token":{"type":"string","description":"The token created for this Application in Gotify","examples":["AQZI58fA.rfSZbm"]},"priorities":{"$ref":"#/definitions/PrioritiesConfig","description":"Priority of messages\\n\\n* Info -> 5\\n* Warn -> 7\\n* Error -> 10"}},"required":["token","type","url"],"title":"GotifyConfig"},"PrioritiesConfig":{"type":"object","properties":{"info":{"type":"number","examples":[5]},"warn":{"type":"number","examples":[7]},"error":{"type":"number","examples":[10]}},"required":["info","warn","error"],"title":"PrioritiesConfig"},"NtfyConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\\n\\n* gotify\\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"url":{"type":"string","description":"The URL of the Ntfy server","examples":["http://192.168.0.100:8078"]},"topic":{"type":"string","description":"The topic mutli-scrobbler should POST to"},"username":{"type":"string","description":"Required if topic is protected"},"password":{"type":"string","description":"Required if topic is protected"},"token":{"type":"string","description":"Use instead of username/password, required if topic is protected"},"priorities":{"$ref":"#/definitions/PrioritiesConfig","description":"Priority of messages\\n\\n* Info -> 3\\n* Warn -> 4\\n* Error -> 5"}},"required":["topic","type","url"],"title":"NtfyConfig"},"AppriseConfig":{"type":"object","properties":{"type":{"type":"string","enum":["gotify","ntfy","apprise"],"description":"Webhook type. Valid values are:\\n\\n* gotify\\n* ntfy","examples":["gotify"]},"name":{"type":"string","description":"A friendly name used to identify webhook config in logs"},"host":{"type":"string","description":"The URL of the apprise-api server","examples":["http://192.168.0.100:8078"]},"urls":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"},"keys":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"},"tags":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Optional [tag(s)](https://github.com/caronc/apprise-api?tab=readme-ov-file#tagging) to send in the notification payload"}},"required":["host","type"],"title":"AppriseConfig"},"LogOptions":{"type":"object","properties":{"level":{"$ref":"#/definitions/LogLevel","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.","default":"info"},"file":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false},{"$ref":"#/definitions/FileLogOptions"}],"description":"Specify the minimum log level to output to rotating files or file output options. If `false` no log files will be created."},"console":{"$ref":"#/definitions/LogLevel","description":"Specify the minimum log level streamed to the console (or docker container)"}},"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```","title":"LogOptions"},"CacheConfigOptions":{"type":"object","properties":{"metadata":{"$ref":"#/definitions/CacheMetadataConfig"},"scrobble":{"$ref":"#/definitions/CacheScrobbleConfig"},"auth":{"$ref":"#/definitions/CacheAuthConfig"},"regex":{"type":"number","description":"Number of regex functions to cache (LRU)","default":200}},"title":"CacheConfigOptions"},"CacheMetadataConfig":{"$ref":"#/definitions/CacheConfig%3CCacheMetadataProvider%3E","title":"CacheMetadataConfig"},"CacheConfig<CacheMetadataProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheMetadataProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheMetadataProvider>"},"CacheMetadataProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheMetadataProvider"},"CacheProvider":{"type":["string","boolean"],"enum":["memory","valkey","file",false],"title":"CacheProvider"},"CacheScrobbleConfig":{"$ref":"#/definitions/CacheConfig%3CCacheScrobbleProvider%3E","title":"CacheScrobbleConfig"},"CacheConfig<CacheScrobbleProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheScrobbleProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheScrobbleProvider>"},"CacheScrobbleProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheScrobbleProvider"},"CacheAuthConfig":{"$ref":"#/definitions/CacheConfig%3CCacheAuthProvider%3E","title":"CacheAuthConfig"},"CacheConfig<CacheAuthProvider>":{"type":"object","properties":{"provider":{"$ref":"#/definitions/CacheAuthProvider"},"connection":{"type":"string"}},"required":["provider"],"title":"CacheConfig<CacheAuthProvider>"},"CacheAuthProvider":{"$ref":"#/definitions/CacheProvider","title":"CacheAuthProvider"},"TransformerCommonConfig":{"type":"object","properties":{"defaults":{"type":"object"},"data":{"type":"object"},"type":{"type":"string"},"name":{"type":"string"},"options":{"$ref":"#/definitions/TransformOptions"}},"required":["type"],"title":"TransformerCommonConfig"},"TransformOptions":{"type":"object","properties":{"failOnFetch":{"type":"boolean"},"throwOnFailure":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string","enum":["artists","title","albumArtists","album","duration","meta"]}}]},"ttl":{"type":"string"}},"title":"TransformOptions"}}}'),n=JSON.parse('{"sourceDefaults":{"maxPollRetries":0,"maxRequestRetries":1,"retryMultiplier":1.5},"clientDefaults":{"maxRequestRetries":1,"retryMultiplier":1.5},"baseUrl":"http://localhost","sources":[{"type":"spotify","clients":["myConfig"],"name":"mySpotifySource","data":{"clientId":"a89cba1569901a0671d5a9875fed4be1","clientSecret":"ec42e09d5ae0ee0f0816ca151008412a","redirectUri":"http://localhost:9078/callback"}}],"clients":[{"type":"maloja","name":"myConfig","data":{"url":"http://localhost:42010","apiKey":"myMalojaKey"}}],"webhooks":[{"name":"FirstGotifyServer","type":"gotify","url":"http://localhost:8070","token":"MyGotifyToken","priorities":{"info":5,"warn":7,"error":10}},{"type":"ntfy","name":"MyNtfyFriendlyNameForLogs","url":"http://localhost:9991","topic":"MyMultiScrobblerTopic","username":"Optional","password":"Optional","priorities":{"info":3,"warn":4,"error":5}}]}'),o=i(27722),a=i.n(o),l=i(1184),c=i.n(l),p=i(35283),d=i(85893);function u(){let{colorMode:e}=(0,p.I)();return(0,d.jsx)("div",{style:{display:"flex",flexDirection:"column",overflowY:"hidden",overflowX:"hidden"},children:(0,d.jsxs)("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between"},children:[(0,d.jsx)("div",{style:{width:"50%"},children:(0,d.jsx)(a(),{schema:r,showExamples:!0})}),(0,d.jsx)("div",{style:{boxSizing:"border-box",width:"50%"},children:(0,d.jsx)(c(),{value:JSON.stringify(n,null," "),theme:"dark"===e?"vs-dark":"vs",schema:r,height:"70vh"})})]})})}function f(){return(0,d.jsx)(s.default,{fallback:(0,d.jsx)("div",{children:"Loading..."}),children:()=>(0,d.jsx)(u,{})})}},46259:function(e,t,i){"use strict";i.r(t),i.d(t,{default:()=>l}),i(67294);var s=i(31026),r=i(646),n=i(77084),o=i(85893);function a(){return(0,o.jsx)(n.default,{fallback:({error:e,tryAgain:t})=>(0,o.jsxs)("div",{children:[(0,o.jsxs)("p",{children:["Playground component crashed because of error: ",e.message,"."]}),(0,o.jsx)("button",{onClick:t,children:"Try Again!"})]}),children:(0,o.jsx)(r.default,{fallback:(0,o.jsx)("div",{children:"Loading..."}),children:()=>{let e=i(66210).Z;return(0,o.jsx)(e,{})}})})}function l(){return(0,o.jsx)(s.Z,{title:"Playground",description:"Playground of docusaurus-json-schema-plugin",children:(0,o.jsx)(a,{})})}},68347:function(e,t,i){var s={"./simpleWorker.js":"18352","./simpleWorker":"18352"};function r(e){return Promise.resolve().then(function(){if(!i.o(s,e)){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i(s[e])})}r.keys=()=>Object.keys(s),r.id=68347,e.exports=r},37738:function(e,t,i){var s={"./textModelSync/textModelSync.protocol":["23145","5671"],"./treeSitterParserService":["28922"],"./markerDecorations":["36357"],"./languageService.js":["49079"],"./languageService":["49079"],"./markerDecorationsService":["86036"],"./markerDecorationsService.js":["86036"],"./modelService.js":["51200"],"./resolverService":["88216"],"./semanticTokensProviderStyling":["33789"],"./languageFeatureDebounce":["88191"],"./editorSimpleWorker":["87267"],"./textModelSync/textModelSync.impl.js":["49290"],"./modelService":["51200"],"./semanticTokensDto.js":["14704"],"./textModelSync/textModelSync.impl":["49290"],"./model":["73733"],"./treeViewsDnd":["80642"],"./languagesRegistry":["4765"],"./model.js":["73733"],"./findSectionHeaders.js":["72846"],"./editorBaseApi":["20927"],"./treeSitterParserService.js":["28922"],"./resolverService.js":["88216"],"./semanticTokensProviderStyling.js":["33789"],"./getIconClasses.js":["22016"],"./languageFeatures":["71922"],"./semanticTokensDto":["14704"],"./semanticTokensStylingService":["57404"],"./editorBaseApi.js":["20927"],"./textResourceConfiguration":["71765"],"./treeViewsDndService":["58345"],"./semanticTokensStyling":["73343"],"./textResourceConfiguration.js":["71765"],"./treeViewsDnd.js":["80642"],"./editorWorker.js":["85215"],"./unicodeTextModelHighlighter":["31446"],"./unicodeTextModelHighlighter.js":["31446"],"./editorSimpleWorker.js":["87267"],"./languagesAssociations.js":["73536"],"./languageFeatures.js":["71922"],"./treeViewsDndService.js":["58345"],"./languageFeatureDebounce.js":["88191"],"./languageFeaturesService.js":["60662"],"./editorWorker":["85215"],"./textModelSync/textModelSync.protocol.js":["23145","7469"],"./findSectionHeaders":["72846"],"./languageFeaturesService":["60662"],"./semanticTokensStyling.js":["73343"],"./languagesAssociations":["73536"],"./editorWorkerHost":["98008"],"./editorWorkerHost.js":["98008"],"./getIconClasses":["22016"],"./languagesRegistry.js":["4765"],"./semanticTokensStylingService.js":["57404"],"./markerDecorations.js":["36357"]};function r(e){if(!i.o(s,e))return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=s[e],r=t[0];return Promise.all(t.slice(1).map(i.e)).then(function(){return i(r)})}r.keys=()=>Object.keys(s),r.id=37738,e.exports=r},83596:function(e){function t(e){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=83596,e.exports=t}}]);
+1
assets/js/17896441.59cf19a7.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["7048"],{68087:function(e,n,r){r.d(n,{ZP:()=>a,d$:()=>i});var s=r(85893),t=r(50065),c=r(703),l=r(73752);r(75752);let i=[];function o(e){let n={p:"p",...(0,t.a)(),...e.components},{AIOExample:r,AIOType:i,EnvType:o,FileExample:a,FileType:p,SchemaLink:u}=n;return r||d("AIOExample",!0),i||d("AIOType",!0),o||d("EnvType",!0),a||d("FileExample",!0),p||d("FileType",!0),u||d("SchemaLink",!0),(0,s.jsxs)(c.default,{groupId:"configType",queryString:!0,children:[(0,s.jsx)(l.default,{value:"env",label:"ENV",children:(0,s.jsx)(o,{children:e.children})}),(0,s.jsx)(l.default,{value:"file",label:"File",children:(0,s.jsxs)(p,{children:[(0,s.jsx)(a,{title:`CONFIG/${e.name}.json`,client:e.client??!1,data:e.fileContent}),(0,s.jsxs)(n.p,{children:["or ",(0,s.jsx)(u,{lower:!0,objectName:e.config})]})]})}),(0,s.jsx)(l.default,{value:"aio",label:"AIO",children:(0,s.jsxs)(i,{children:[(0,s.jsx)(r,{data:e.fileContent,client:e.client??!1,name:e.name}),(0,s.jsxs)(n.p,{children:["or ",(0,s.jsx)(u,{lower:!0,objectName:e.config})]})]})})]})}function a(e={}){let{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}function d(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},49437:function(e,n,r){r.d(n,{Z:()=>p}),r(67294);var s=r(75752),t=r.n(s),c=r(57682),l=r(77084);r(8267);var i=r(11142),o=r.n(i),a=r(85893);let d=e=>{let n,{data:r,name:s,client:l=!1}=e;try{n=o().parse(r)}catch(e){return console.error(e),(0,a.jsxs)(c.Z,{type:"danger",title:"Unexpected Error",children:[(0,a.jsx)("p",{children:"Example component crashed because of error!"}),(0,a.jsx)(t(),{children:e.message})]})}n=(n=n.filter(e=>void 0===e.configureAs||e.configureAs===(l?"client":"source"))).map(e=>({...e,type:s}));let i={[l?"clients":"sources"]:n};return(0,a.jsx)(t(),{title:"CONFIG_DIR/config.json",language:"json5",children:JSON.stringify(i,null,2)})},p=e=>(0,a.jsx)(l.default,{fallback:({error:e})=>(0,a.jsx)("div",{children:(0,a.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,a.jsx)(d,{...e})})},94728:function(e,n,r){r.d(n,{Z:()=>p}),r(67294);var s=r(75752),t=r.n(s),c=r(57682),l=r(77084);r(8267);var i=r(11142),o=r.n(i),a=r(85893);let d=e=>{let n,{data:r,client:s=!1,...l}=e;try{n=o().parse(r)}catch(e){return console.error(e),(0,a.jsxs)(c.Z,{type:"danger",title:"Unexpected Error",children:[(0,a.jsx)("p",{children:"Example component crashed because of error!"}),(0,a.jsx)(t(),{children:e.message})]})}return n=n.filter(e=>void 0===e.configureAs||e.configureAs===(s?"client":"source")),(0,a.jsx)(t(),{...l,language:"json5",children:JSON.stringify(n,null,2)})},p=e=>(0,a.jsx)(l.default,{fallback:({error:e})=>(0,a.jsx)("div",{children:(0,a.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,a.jsx)(d,{...e})})},13727:function(e,n,r){r.d(n,{Z:()=>c});var s=r(67294),t=r(85893);let c=e=>{let{children:n,lower:r,client:c=!1}=e,l=n;void 0===l&&(l=(0,t.jsxs)(s.Fragment,{children:[r?"explore":"Explore"," the schema with an example and live editor/validator"]}));let i=`https://json-schema.app/view/%23/%23%2Fdefinitions%2F${e.objectName}`;return(0,t.jsx)("a",{target:"_blank",href:`${i}?url=${c?"https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fclient.json":"https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json"}`,children:l})}},29540:function(e,n,r){r.d(n,{Z:()=>g}),r(67294);var s=r(13580),t=r(13727),c=r(81996),l=r(21863),i=r(89886),o=r(15904),a=r(17200),d=r(85893),p=r(49437),u=r(94728),h=r(50065);function x(e){let n={a:"a",p:"p",strong:"strong",...(0,h.a)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:(0,d.jsxs)(n.a,{href:"/configuration?configType=env#configuration-types",children:[(0,d.jsx)(n.strong,{children:"ENV"})," Config Type"]})}),"\n",e.children]})}function j(e){let n={a:"a",p:"p",strong:"strong",...(0,h.a)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:(0,d.jsxs)(n.a,{href:"/configuration?configType=file#configuration-types",children:[(0,d.jsx)(n.strong,{children:"File"})," Config Type"]})}),"\n",e.children]})}function m(e){let n={a:"a",p:"p",strong:"strong",...(0,h.a)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:(0,d.jsxs)(n.a,{href:"/configuration?configType=aio#configuration-types",children:[(0,d.jsx)(n.strong,{children:"AIO"})," Config Type"]})}),"\n",e.children]})}var f=r(68087);let g={...s.Z,SchemaLink:t.Z,AIOExample:p.Z,FileExample:u.Z,EnvType:function(e={}){let{wrapper:n}={...(0,h.a)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(x,{...e})}):x(e)},FileType:function(e={}){let{wrapper:n}={...(0,h.a)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(j,{...e})}):j(e)},AIOType:function(e={}){let{wrapper:n}={...(0,h.a)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(m,{...e})}):m(e)},Config:f.ZP,DetailsAdmo:e=>{let n,r="";switch(e.type){case"warning":r="alert--warning",n=(0,d.jsx)(l.Z,{});break;case"danger":r="alert--danger",n=(0,d.jsx)(i.Z,{});break;case"note":r="alert--secondary",n=(0,d.jsx)(a.Z,{});break;case"tip":r="alert--success",n=(0,d.jsx)(o.Z,{})}let s=void 0===n?null:(0,d.jsx)("span",{className:"admoIcon",children:n}),t=(0,d.jsxs)("summary",{children:[s,e.summary]});return(0,d.jsx)(c.default,{className:r,summary:t,children:e.children})}}}}]);
-1
assets/js/17896441.6caa3cbd.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["7048"],{68087:function(e,n,r){r.d(n,{ZP:()=>a,d$:()=>i});var t=r(85893),s=r(50065),o=r(703),c=r(73752);r(75752);let i=[];function l(e){let n={p:"p",...(0,s.a)(),...e.components},{AIOExample:r,AIOType:i,EnvType:l,FileExample:a,FileType:d,SchemaLink:h}=n;return r||p("AIOExample",!0),i||p("AIOType",!0),l||p("EnvType",!0),a||p("FileExample",!0),d||p("FileType",!0),h||p("SchemaLink",!0),(0,t.jsxs)(o.default,{groupId:"configType",queryString:!0,children:[(0,t.jsx)(c.default,{value:"env",label:"ENV",children:(0,t.jsx)(l,{children:e.children})}),(0,t.jsx)(c.default,{value:"file",label:"File",children:(0,t.jsxs)(d,{children:[(0,t.jsx)(a,{title:`CONFIG/${e.name}.json`,client:e.client??!1,data:e.fileContent}),(0,t.jsxs)(n.p,{children:["or ",(0,t.jsx)(h,{lower:!0,objectName:e.config})]})]})}),(0,t.jsx)(c.default,{value:"aio",label:"AIO",children:(0,t.jsxs)(i,{children:[(0,t.jsx)(r,{data:e.fileContent,client:e.client??!1,name:e.name}),(0,t.jsxs)(n.p,{children:["or ",(0,t.jsx)(h,{lower:!0,objectName:e.config})]})]})})]})}function a(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}function p(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},49437:function(e,n,r){r.d(n,{Z:()=>d}),r(67294);var t=r(75752),s=r.n(t),o=r(29097),c=r(77084);r(8267);var i=r(11142),l=r.n(i),a=r(85893);let p=e=>{let n,{data:r,name:t,client:c=!1}=e;try{n=l().parse(r)}catch(e){return console.error(e),(0,a.jsxs)(o.Z,{type:"danger",title:"Unexpected Error",children:[(0,a.jsx)("p",{children:"Example component crashed because of error!"}),(0,a.jsx)(s(),{children:e.message})]})}n=(n=n.filter(e=>void 0===e.configureAs||e.configureAs===(c?"client":"source"))).map(e=>({...e,type:t}));let i={[c?"clients":"sources"]:n};return(0,a.jsx)(s(),{title:"CONFIG_DIR/config.json",language:"json5",children:JSON.stringify(i,null,2)})},d=e=>(0,a.jsx)(c.default,{fallback:({error:e})=>(0,a.jsx)("div",{children:(0,a.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,a.jsx)(p,{...e})})},94728:function(e,n,r){r.d(n,{Z:()=>d}),r(67294);var t=r(75752),s=r.n(t),o=r(29097),c=r(77084);r(8267);var i=r(11142),l=r.n(i),a=r(85893);let p=e=>{let n,{data:r,client:t=!1,...c}=e;try{n=l().parse(r)}catch(e){return console.error(e),(0,a.jsxs)(o.Z,{type:"danger",title:"Unexpected Error",children:[(0,a.jsx)("p",{children:"Example component crashed because of error!"}),(0,a.jsx)(s(),{children:e.message})]})}return n=n.filter(e=>void 0===e.configureAs||e.configureAs===(t?"client":"source")),(0,a.jsx)(s(),{...c,language:"json5",children:JSON.stringify(n,null,2)})},d=e=>(0,a.jsx)(c.default,{fallback:({error:e})=>(0,a.jsx)("div",{children:(0,a.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,a.jsx)(p,{...e})})},13727:function(e,n,r){r.d(n,{Z:()=>o});var t=r(67294),s=r(85893);let o=e=>{let{children:n,lower:r,client:o=!1}=e,c=n;void 0===c&&(c=(0,s.jsxs)(t.Fragment,{children:[r?"explore":"Explore"," the schema with an example and live editor/validator"]}));let i=`https://json-schema.app/view/%23/%23%2Fdefinitions%2F${e.objectName}`;return(0,s.jsx)("a",{target:"_blank",href:`${i}?url=${o?"https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fclient.json":"https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json"}`,children:c})}},5780:function(e,n,r){r.d(n,{Z:()=>u}),r(67294);var t=r(13580),s=r(13727),o=r(49437),c=r(94728),i=r(85893),l=r(50065);function a(e){let n={a:"a",p:"p",strong:"strong",...(0,l.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.a,{href:"/configuration?configType=env#configuration-types",children:[(0,i.jsx)(n.strong,{children:"ENV"})," Config Type"]})}),"\n",e.children]})}function p(e){let n={a:"a",p:"p",strong:"strong",...(0,l.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.a,{href:"/configuration?configType=file#configuration-types",children:[(0,i.jsx)(n.strong,{children:"File"})," Config Type"]})}),"\n",e.children]})}function d(e){let n={a:"a",p:"p",strong:"strong",...(0,l.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.a,{href:"/configuration?configType=aio#configuration-types",children:[(0,i.jsx)(n.strong,{children:"AIO"})," Config Type"]})}),"\n",e.children]})}var h=r(68087);let u={...t.Z,SchemaLink:s.Z,AIOExample:o.Z,FileExample:c.Z,EnvType:function(e={}){let{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)},FileType:function(e={}){let{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)},AIOType:function(e={}){let{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)},Config:h.ZP}}}]);
+1 -1
assets/js/1fb61236.74186b4f.js assets/js/1fb61236.997f1459.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3174"],{20941:function(e,s,l){l.r(s),l.d(s,{frontMatter:()=>o,default:()=>h,toc:()=>c,metadata:()=>r,assets:()=>d,contentTitle:()=>t});var r=JSON.parse('{"id":"configuration/sources/plex","title":"Plex","description":"Find your Plex Token and make note of the URL and Port used to connect to your Plex instance.","source":"@site/docs/configuration/sources/plex.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/plex","permalink":"/multi-scrobbler/configuration/sources/plex","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/plex.mdx","tags":[],"version":"current","frontMatter":{"title":"Plex","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Musikcube","permalink":"/multi-scrobbler/configuration/sources/musikcube"},"next":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/sources/rocksky-source"}}'),i=l(85893),n=l(50065);l(703),l(73752),l(75752);let o={title:"Plex",toc_min_heading_level:2,toc_max_heading_level:5},t=void 0,d={},c=[{value:"Defaults",id:"defaults",level:6},{value:"Only A Specific User",id:"only-a-specific-user",level:6},{value:"A Specific User + Defaults",id:"a-specific-user--defaults",level:6},{value:"Configuration",id:"configuration",level:4}];function a(e){let s={a:"a",code:"code",h4:"h4",h6:"h6",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components},{Config:l,Details:r}=s;return l||x("Config",!0),r||x("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(s.p,{children:["Find your ",(0,i.jsx)(s.a,{href:"https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/",children:(0,i.jsx)(s.strong,{children:"Plex Token"})})," and make note of the ",(0,i.jsx)(s.strong,{children:"URL"})," and ",(0,i.jsx)(s.strong,{children:"Port"})," used to connect to your Plex instance."]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Allowed Users and Defaults"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Multi-scrobbler will automatically scrobble for these users by default:"})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"The User authenticated with the Plex Token"}),"\n",(0,i.jsxs)(s.li,{children:["and the ",(0,i.jsx)(s.strong,{children:"Local User"})]}),"\n"]}),(0,i.jsxs)(s.p,{children:["The Local User (",(0,i.jsx)(s.code,{children:"PLEX_LOCAL_USER"}),") is how Plex identifies anyone directly accessing the Plex UI from a local IP (who does not need to login)."]}),(0,i.jsxs)(s.p,{children:["To allow MS to scrobble for other users use ",(0,i.jsx)(s.code,{children:"usersAllow"})," or ",(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW"})," (env) from the below configuration docs. However, because you are overriding the default settings you must also explicitly list the authenticated user and the Local User if you want them to also be able to scrobble."]}),(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsx)(s.h6,{id:"defaults",children:"Defaults"}),(0,i.jsxs)(s.p,{children:["If ",(0,i.jsx)(s.code,{children:"usersallow"})," and ",(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW"})," are not defined then the Plex Token authenticated User and Local User will be scrobbled for."]}),(0,i.jsx)(s.h6,{id:"only-a-specific-user",children:"Only A Specific User"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:'"usersallow": ["SomeUser"]'})," or"]}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW: SomeUser"})}),"\n"]}),(0,i.jsxs)(s.p,{children:["Only the Plex user ",(0,i.jsx)(s.code,{children:"SomeUser"})," will be scrobbled for. The Plex Token authenticated user and the Local User will not be scrobbled for."]}),(0,i.jsx)(s.h6,{id:"a-specific-user--defaults",children:"A Specific User + Defaults"}),(0,i.jsxs)(s.p,{children:["(Assuming the plex authenticated user is ",(0,i.jsx)(s.code,{children:"FoxxMD"}),")"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:'"usersallow": ["FoxxMD", "PLEX_LOCAL_USER", "SomeUser"]'})," or"]}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW: FoxxMD,PLEX_LOCAL_USER,SomeUser"})}),"\n"]}),(0,i.jsx)(s.p,{children:"The Plex user SomeUser, the Plex Token authenticated user (FoxxMD) and the Local User will be scrobbled for."})]})]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Allowed Libraries and Defaults"}),(0,i.jsxs)(s.p,{children:["By default multi-scrobbler will only scrobble media found in Plex libraries that are labelled as ",(0,i.jsx)(s.strong,{children:"Music."})]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"librariesAllow"})," or ",(0,i.jsx)(s.code,{children:"PLEX_LIBRARIES_ALLOW"})," will override this"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h4,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(l,{config:"PlexApiSourceConfig",fileContent:'[\n {\n "name": "MyPlexApi",\n "enable": true,\n "clients": [],\n "data": {\n "token": "1234",\n "url": "http://192.168.0.120:32400",\n "usersAllow": ["FoxxMD","SomeOtherUser"],\n "usersBlock": ["AnotherUser"],\n "devicesAllow": ["firefox"],\n "devicesBlock": ["google-home"],\n "librariesAllow": ["GoodMusic"],\n "librariesBlock": ["BadMusic"]\n },\n "options": {\n "logPayload": true,\n "logFilterFailure": "debug",\n "ignoreInvalidCert": "false"\n }\n }\n]\n',name:"plex",children:(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Environmental Variable"}),(0,i.jsx)(s.th,{children:"Required?"}),(0,i.jsx)(s.th,{children:"Default"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_URL"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"Yes"})}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["The URL of the Plex server IE ",(0,i.jsx)(s.code,{children:"http://localhost:32400"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_TOKEN"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"Yes"})}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["The ",(0,i.jsx)(s.strong,{children:"Plex Token"})," to use with the API"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of usernames (from Plex) to scrobble for"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_USERS_BLOCK"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of usernames (from Plex) to disallow scrobble for"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_DEVICES_ALLOW"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of devices to scrobble from"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_DEVICES_BLOCK"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of devices to disallow scrobbles from"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_LIBRARIES_ALLOW"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of libraries to allow scrobbles from"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_LIBRARIES_BLOCK"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of libraries to disallow scrobbles from"})]})]})]})})]})}function h(e={}){let{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}function x(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3174"],{20941:function(e,s,l){l.r(s),l.d(s,{frontMatter:()=>o,default:()=>h,toc:()=>c,metadata:()=>r,assets:()=>d,contentTitle:()=>t});var r=JSON.parse('{"id":"configuration/sources/plex","title":"Plex","description":"Find your Plex Token and make note of the URL and Port used to connect to your Plex instance.","source":"@site/docs/configuration/sources/plex.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/plex","permalink":"/multi-scrobbler/configuration/sources/plex","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/plex.mdx","tags":[],"version":"current","frontMatter":{"title":"Plex","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Musikcube","permalink":"/multi-scrobbler/configuration/sources/musikcube"},"next":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/sources/rocksky-source"}}'),i=l(85893),n=l(50065);l(703),l(73752),l(75752);let o={title:"Plex",toc_min_heading_level:2,toc_max_heading_level:5},t=void 0,d={},c=[{value:"Defaults",id:"defaults",level:6},{value:"Only A Specific User",id:"only-a-specific-user",level:6},{value:"A Specific User + Defaults",id:"a-specific-user--defaults",level:6},{value:"Configuration",id:"configuration",level:4}];function a(e){let s={a:"a",code:"code",h4:"h4",h6:"h6",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components},{Config:l,Details:r}=s;return l||x("Config",!0),r||x("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(s.p,{children:["Find your ",(0,i.jsx)(s.a,{href:"https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/",children:(0,i.jsx)(s.strong,{children:"Plex Token"})})," and make note of the ",(0,i.jsx)(s.strong,{children:"URL"})," and ",(0,i.jsx)(s.strong,{children:"Port"})," used to connect to your Plex instance."]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Allowed Users and Defaults"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Multi-scrobbler will automatically scrobble for these users by default:"})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"The User authenticated with the Plex Token"}),"\n",(0,i.jsxs)(s.li,{children:["and the ",(0,i.jsx)(s.strong,{children:"Local User"})]}),"\n"]}),(0,i.jsxs)(s.p,{children:["The Local User (",(0,i.jsx)(s.code,{children:"PLEX_LOCAL_USER"}),") is how Plex identifies anyone directly accessing the Plex UI from a local IP (who does not need to login)."]}),(0,i.jsxs)(s.p,{children:["To allow MS to scrobble for other users use ",(0,i.jsx)(s.code,{children:"usersAllow"})," or ",(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW"})," (env) from the below configuration docs. However, because you are overriding the default settings you must also explicitly list the authenticated user and the Local User if you want them to also be able to scrobble."]}),(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsx)(s.h6,{id:"defaults",children:"Defaults"}),(0,i.jsxs)(s.p,{children:["If ",(0,i.jsx)(s.code,{children:"usersallow"})," and ",(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW"})," are not defined then the Plex Token authenticated User and Local User will be scrobbled for."]}),(0,i.jsx)(s.h6,{id:"only-a-specific-user",children:"Only A Specific User"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:'"usersallow": ["SomeUser"]'})," or"]}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW: SomeUser"})}),"\n"]}),(0,i.jsxs)(s.p,{children:["Only the Plex user ",(0,i.jsx)(s.code,{children:"SomeUser"})," will be scrobbled for. The Plex Token authenticated user and the Local User will not be scrobbled for."]}),(0,i.jsx)(s.h6,{id:"a-specific-user--defaults",children:"A Specific User + Defaults"}),(0,i.jsxs)(s.p,{children:["(Assuming the plex authenticated user is ",(0,i.jsx)(s.code,{children:"FoxxMD"}),")"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:'"usersallow": ["FoxxMD", "PLEX_LOCAL_USER", "SomeUser"]'})," or"]}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW: FoxxMD,PLEX_LOCAL_USER,SomeUser"})}),"\n"]}),(0,i.jsx)(s.p,{children:"The Plex user SomeUser, the Plex Token authenticated user (FoxxMD) and the Local User will be scrobbled for."})]})]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Allowed Libraries and Defaults"}),(0,i.jsxs)(s.p,{children:["By default multi-scrobbler will only scrobble media found in Plex libraries that are labelled as ",(0,i.jsx)(s.strong,{children:"Music."})]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"librariesAllow"})," or ",(0,i.jsx)(s.code,{children:"PLEX_LIBRARIES_ALLOW"})," will override this"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h4,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(l,{config:"PlexApiSourceConfig",fileContent:'[\n {\n "name": "MyPlexApi",\n "enable": true,\n "clients": [],\n "data": {\n "token": "1234",\n "url": "http://192.168.0.120:32400",\n "usersAllow": ["FoxxMD","SomeOtherUser"],\n "usersBlock": ["AnotherUser"],\n "devicesAllow": ["firefox"],\n "devicesBlock": ["google-home"],\n "librariesAllow": ["GoodMusic"],\n "librariesBlock": ["BadMusic"]\n },\n "options": {\n "logPayload": true,\n "logFilterFailure": "debug",\n "ignoreInvalidCert": false\n }\n }\n]\n',name:"plex",children:(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Environmental Variable"}),(0,i.jsx)(s.th,{children:"Required?"}),(0,i.jsx)(s.th,{children:"Default"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_URL"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"Yes"})}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["The URL of the Plex server IE ",(0,i.jsx)(s.code,{children:"http://localhost:32400"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_TOKEN"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"Yes"})}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["The ",(0,i.jsx)(s.strong,{children:"Plex Token"})," to use with the API"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_USERS_ALLOW"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of usernames (from Plex) to scrobble for"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_USERS_BLOCK"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of usernames (from Plex) to disallow scrobble for"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_DEVICES_ALLOW"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of devices to scrobble from"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_DEVICES_BLOCK"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of devices to disallow scrobbles from"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_LIBRARIES_ALLOW"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of libraries to allow scrobbles from"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"PLEX_LIBRARIES_BLOCK"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"Comma-separated list of libraries to disallow scrobbles from"})]})]})]})})]})}function h(e={}){let{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}function x(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
-12
assets/js/24a5b6e6.23a4c551.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["1165"],{76574:function(e,t,s){s.d(t,{ZP:()=>c,d$:()=>l});var n=s(85893),r=s(50065),i=s(75752),o=s.n(i);let l=[];function a(e){let t={a:"a",code:"code",p:"p",strong:"strong",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["This ",(0,n.jsx)(t.strong,{children:"Source"})," supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to ",(0,n.jsx)(t.strong,{children:"Should Scrobble"})," found in each Source's status card."]}),"\n",(0,n.jsxs)(t.p,{children:["Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source's ",(0,n.jsx)(t.code,{children:"options"})," in ",(0,n.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,n.jsx)(o(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 - "data": { 3 - // ... 4 - }, 5 - "options": { 6 - // highlight-start 7 - // set to true to always scrobble automatically 8 - // set to false to never scrobble automatically 9 - "systemScrobble": true 10 - // highlight-end 11 - } 12 - }}`})]})}function c(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},79501:function(e,t,s){s.r(t),s.d(t,{frontMatter:()=>u,default:()=>g,toc:()=>j,metadata:()=>n,assets:()=>b,contentTitle:()=>x});var n=JSON.parse('{"id":"configuration/sources/azuracast","title":"Azuracast","description":"Azuracast may not correctly report track length or position. If this is the case you should reduce the \\"listened to\\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly.","source":"@site/docs/configuration/sources/azuracast.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/azuracast","permalink":"/multi-scrobbler/configuration/sources/azuracast","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/azuracast.mdx","tags":[],"version":"current","frontMatter":{"title":"Azuracast","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/sources/"},"next":{"title":"Deezer","permalink":"/multi-scrobbler/configuration/sources/deezer"}}'),r=s(85893),i=s(50065),o=s(703),l=s(73752),a=s(75752),c=s.n(a);let d='[\n {\n "type": "azuracast",\n "enable": true,\n "name": "azura",\n "data": {\n "url": "ws://192.168.0.101",\n "station": "my-station-name",\n "monitorWhenLive": true,\n "monitorWhenListeners": 1\n }\n }\n]\n';var h=s(76574);let u={title:"Azuracast",toc_min_heading_level:2,toc_max_heading_level:5},x=void 0,b={},j=[{value:"URL",id:"url",level:4},{value:"Scrobble Behavior",id:"scrobble-behavior",level:4},...h.d$,{value:"Configuration",id:"configuration",level:2}];function f(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components},{AIOExample:s,SchemaLink:n}=t;return s||m("AIOExample",!0),n||m("SchemaLink",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.admonition,{title:"Scrobbling Threshold",type:"tip",children:(0,r.jsxs)(t.p,{children:['Azuracast may not correctly report track length or position. If this is the case you should reduce the "listened to" ',(0,r.jsx)(t.strong,{children:"duration"})," using ",(0,r.jsx)(t.a,{href:"/configuration/sources#scrobble-thresholds",children:"Scrobble Thresholds"})," so that multi-scrobbler scrobbles correctly."]})}),"\n",(0,r.jsxs)(t.p,{children:["The Azuracast server should have ",(0,r.jsx)(t.strong,{children:"Use High-Performance Now Playing Updates"})," enabled in ",(0,r.jsx)(t.em,{children:"Administration -> System Settings"})]}),"\n",(0,r.jsx)(t.h4,{id:"url",children:"URL"}),"\n",(0,r.jsx)(t.p,{children:"The URL used by MS to connect to Azuracast has the syntax:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"[ws|wss]://HOST:[PORT]\n"})}),"\n",(0,r.jsxs)(t.p,{children:["MS will automatically add the path required for websockets, ",(0,r.jsx)(t.a,{href:"https://www.azuracast.com/docs/developers/now-playing-data/#websockets",children:(0,r.jsx)(t.code,{children:"/api/live/nowplaying/websocket"})}),", to your URL if none is provided. If you use a reverse proxy with a path-based URL or otherwise need a custom path to access the websockets path correctly then explicitly provide it. Examples:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"URL From Config => MS Uses\n\n'ws://192.168.0.101' => ws://192.168.0.101/api/live/nowplaying/websocket\n'ws://azura.mydomain.com' => ws://azura.mydomain.com.com/api/live/nowplaying/websocket\n'wss://mydomain.com/custom/azura/ws' => wss://mydomain.com/custom/azura/ws\n"})}),"\n",(0,r.jsx)(t.h4,{id:"scrobble-behavior",children:"Scrobble Behavior"}),"\n",(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsx)(h.ZP,{filename:"azuracast"})}),"\n",(0,r.jsxs)(t.p,{children:["Multi-scrobbler will set the default ",(0,r.jsx)(t.strong,{children:"scrobbling behavior"})," based on if either of these settings is configured:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["live status (",(0,r.jsx)(t.code,{children:"AZURA_LIVE"})," or ",(0,r.jsx)(t.code,{children:"monitorWhenLive"}),") or"]}),"\n",(0,r.jsxs)(t.li,{children:["listener count (",(0,r.jsx)(t.code,{children:"AZURA_LISTENERS_NUM"})," or ",(0,r.jsx)(t.code,{children:"monitorWhenListeners"}),")"]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"If either is configured then MS will automatically scrobble based on when these conditions are met."}),"\n",(0,r.jsxs)(t.p,{children:["If neither is configured automatic scrobble defaults to ",(0,r.jsx)(t.strong,{children:"off"})," and you should either manually initiate it or explicitly set the default behavior."]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(o.default,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(l.default,{value:"env",label:"ENV",children:(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Required?"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Default"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"AZ_URL"})}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Yes"}),(0,r.jsx)(t.td,{style:{textAlign:"left"}}),(0,r.jsxs)(t.td,{children:["Azuracast URL ",(0,r.jsx)(t.em,{children:"without station name"})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"AZ_STATION"})}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Yes"}),(0,r.jsx)(t.td,{style:{textAlign:"left"}}),(0,r.jsx)(t.td,{children:"The station name shown on the public page"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"AZURA_LIVE"})}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Yes"}),(0,r.jsx)(t.td,{children:"Only scrobble when station status is ONLINE"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"AZURA_LISTENERS_NUM"})}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"true"})}),(0,r.jsxs)(t.td,{children:["Only scrobble if station has any listeners (",(0,r.jsx)(t.code,{children:"true"}),") or listeners are equal-to/greater-than ",(0,r.jsx)(t.code,{children:"X"})]})]})]})]})}),(0,r.jsxs)(l.default,{value:"file",label:"File",children:[(0,r.jsx)(c(),{title:"CONFIG_DIR/azuracast.json",language:"json5",children:d}),(0,r.jsxs)(t.p,{children:["or ",(0,r.jsx)(n,{lower:!0,objectName:"AzuracastSourceConfig"})]})]}),(0,r.jsxs)(l.default,{value:"aio",label:"AIO",children:[(0,r.jsx)(s,{data:d,name:"azuracast"}),(0,r.jsxs)(t.p,{children:["or ",(0,r.jsx)(n,{lower:!0,objectName:"AzuracastSourceConfig"})]})]})]})]})}function g(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(f,{...e})}):f(e)}function m(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+12
assets/js/24a5b6e6.cbb99879.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["1165"],{26687:function(e,t,s){s.d(t,{d$:()=>c,ZP:()=>h});var n=s(85893),r=s(50065),i=s(75752),o=s.n(i);function l(e){let t={a:"a",code:"code",p:"p",strong:"strong",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["This ",(0,n.jsx)(t.strong,{children:"Source"})," supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to ",(0,n.jsx)(t.strong,{children:"Should Scrobble"})," found in each Source's status card."]}),"\n",(0,n.jsxs)(t.p,{children:["Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source's ",(0,n.jsx)(t.code,{children:"options"})," in ",(0,n.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,n.jsx)(o(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 + "data": { 3 + // ... 4 + }, 5 + "options": { 6 + // highlight-start 7 + // set to true to always scrobble automatically 8 + // set to false to never scrobble automatically 9 + "systemScrobble": true 10 + // highlight-end 11 + } 12 + }}`})]})}function a(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}let c=[];function d(e){let{DetailsAdmo:t}={...(0,r.a)(),...e.components};return t||function(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("DetailsAdmo",!0),(0,n.jsx)(t,{type:"note",summary:"Should Scrobble Behavior",children:(0,n.jsx)(a,{...e})})}function h(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},79501:function(e,t,s){s.r(t),s.d(t,{frontMatter:()=>u,default:()=>b,toc:()=>f,metadata:()=>n,assets:()=>j,contentTitle:()=>x});var n=JSON.parse('{"id":"configuration/sources/azuracast","title":"Azuracast","description":"Azuracast may not correctly report track length or position. If this is the case you should reduce the \\"listened to\\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly.","source":"@site/docs/configuration/sources/azuracast.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/azuracast","permalink":"/multi-scrobbler/configuration/sources/azuracast","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/azuracast.mdx","tags":[],"version":"current","frontMatter":{"title":"Azuracast","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/sources/"},"next":{"title":"Deezer","permalink":"/multi-scrobbler/configuration/sources/deezer"}}'),r=s(85893),i=s(50065),o=s(703),l=s(73752),a=s(75752),c=s.n(a);let d='[\n {\n "type": "azuracast",\n "enable": true,\n "name": "azura",\n "data": {\n "url": "ws://192.168.0.101",\n "station": "my-station-name",\n "monitorWhenLive": true,\n "monitorWhenListeners": 1\n }\n }\n]\n';var h=s(26687);let u={title:"Azuracast",toc_min_heading_level:2,toc_max_heading_level:5},x=void 0,j={},f=[{value:"URL",id:"url",level:4},...h.d$,{value:"Configuration",id:"configuration",level:2}];function g(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components},{AIOExample:s,SchemaLink:n}=t;return s||p("AIOExample",!0),n||p("SchemaLink",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.admonition,{title:"Scrobbling Threshold",type:"tip",children:(0,r.jsxs)(t.p,{children:['Azuracast may not correctly report track length or position. If this is the case you should reduce the "listened to" ',(0,r.jsx)(t.strong,{children:"duration"})," using ",(0,r.jsx)(t.a,{href:"/configuration/sources#scrobble-thresholds",children:"Scrobble Thresholds"})," so that multi-scrobbler scrobbles correctly."]})}),"\n",(0,r.jsxs)(t.p,{children:["The Azuracast server should have ",(0,r.jsx)(t.strong,{children:"Use High-Performance Now Playing Updates"})," enabled in ",(0,r.jsx)(t.em,{children:"Administration -> System Settings"})]}),"\n",(0,r.jsx)(t.h4,{id:"url",children:"URL"}),"\n",(0,r.jsx)(t.p,{children:"The URL used by MS to connect to Azuracast has the syntax:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"[ws|wss]://HOST:[PORT]\n"})}),"\n",(0,r.jsxs)(t.p,{children:["MS will automatically add the path required for websockets, ",(0,r.jsx)(t.a,{href:"https://www.azuracast.com/docs/developers/now-playing-data/#websockets",children:(0,r.jsx)(t.code,{children:"/api/live/nowplaying/websocket"})}),", to your URL if none is provided. If you use a reverse proxy with a path-based URL or otherwise need a custom path to access the websockets path correctly then explicitly provide it. Examples:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"URL From Config => MS Uses\n\n'ws://192.168.0.101' => ws://192.168.0.101/api/live/nowplaying/websocket\n'ws://azura.mydomain.com' => ws://azura.mydomain.com.com/api/live/nowplaying/websocket\n'wss://mydomain.com/custom/azura/ws' => wss://mydomain.com/custom/azura/ws\n"})}),"\n",(0,r.jsx)(h.ZP,{filename:"azuracast"}),"\n",(0,r.jsxs)(t.p,{children:["Multi-scrobbler will set the default ",(0,r.jsx)(t.strong,{children:"scrobbling behavior"})," based on if either of these settings is configured:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["live status (",(0,r.jsx)(t.code,{children:"AZURA_LIVE"})," or ",(0,r.jsx)(t.code,{children:"monitorWhenLive"}),") or"]}),"\n",(0,r.jsxs)(t.li,{children:["listener count (",(0,r.jsx)(t.code,{children:"AZURA_LISTENERS_NUM"})," or ",(0,r.jsx)(t.code,{children:"monitorWhenListeners"}),")"]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"If either is configured then MS will automatically scrobble based on when these conditions are met."}),"\n",(0,r.jsxs)(t.p,{children:["If neither is configured automatic scrobble defaults to ",(0,r.jsx)(t.strong,{children:"off"})," and you should either manually initiate it or explicitly set the default behavior."]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(o.default,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(l.default,{value:"env",label:"ENV",children:(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Required?"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Default"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"AZ_URL"})}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Yes"}),(0,r.jsx)(t.td,{style:{textAlign:"left"}}),(0,r.jsxs)(t.td,{children:["Azuracast URL ",(0,r.jsx)(t.em,{children:"without station name"})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"AZ_STATION"})}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Yes"}),(0,r.jsx)(t.td,{style:{textAlign:"left"}}),(0,r.jsx)(t.td,{children:"The station name shown on the public page"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"AZURA_LIVE"})}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Yes"}),(0,r.jsx)(t.td,{children:"Only scrobble when station status is ONLINE"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"AZURA_LISTENERS_NUM"})}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:(0,r.jsx)(t.code,{children:"true"})}),(0,r.jsxs)(t.td,{children:["Only scrobble if station has any listeners (",(0,r.jsx)(t.code,{children:"true"}),") or listeners are equal-to/greater-than ",(0,r.jsx)(t.code,{children:"X"})]})]})]})]})}),(0,r.jsxs)(l.default,{value:"file",label:"File",children:[(0,r.jsx)(c(),{title:"CONFIG_DIR/azuracast.json",language:"json5",children:d}),(0,r.jsxs)(t.p,{children:["or ",(0,r.jsx)(n,{lower:!0,objectName:"AzuracastSourceConfig"})]})]}),(0,r.jsxs)(l.default,{value:"aio",label:"AIO",children:[(0,r.jsx)(s,{data:d,name:"azuracast"}),(0,r.jsxs)(t.p,{children:["or ",(0,r.jsx)(n,{lower:!0,objectName:"AzuracastSourceConfig"})]})]})]})]})}function b(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(g,{...e})}):g(e)}function p(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+1
assets/js/294f31e2.059edf67.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["7544"],{42536:function(e,s,n){n.r(s),n.d(s,{frontMatter:()=>o,default:()=>u,toc:()=>d,metadata:()=>i,assets:()=>a,contentTitle:()=>c});var i=JSON.parse('{"id":"configuration/sources/subsonic","title":"Subsonic","description":"This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome)","source":"@site/docs/configuration/sources/subsonic.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/subsonic","permalink":"/multi-scrobbler/configuration/sources/subsonic","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/subsonic.mdx","tags":[],"version":"current","frontMatter":{"title":"Subsonic","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Spotify","permalink":"/multi-scrobbler/configuration/sources/spotify"},"next":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/sources/tealfm-source"}}'),r=n(85893),t=n(50065);n(703),n(73752),n(75752);let o={title:"Subsonic",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,a={},d=[{value:"Configuration",id:"configuration",level:2}];function l(e){let s={a:"a",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components},{Config:n,DetailsAdmo:i}=s;return n||h("Config",!0),i||h("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(s.p,{children:["This Source can be used for any application that implements the ",(0,r.jsx)(s.a,{href:"http://www.subsonic.org/pages/api.jsp",children:"Subsonic API"})," and supports the ",(0,r.jsx)(s.a,{href:"http://www.subsonic.org/pages/api.jsp#getNowPlaying",children:(0,r.jsx)(s.code,{children:"getNowPlaying"})})," endpoint (such as ",(0,r.jsx)(s.a,{href:"https://airsonic.github.io/",children:"Airsonic"})," and ",(0,r.jsx)(s.a,{href:"https://www.navidrome.org/",children:"Navidrome"}),")"]}),"\n",(0,r.jsx)(i,{type:"warning",summary:"Known Issues",children:(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Multiple artists are reported as one value and cannot be separated"}),"\n",(0,r.jsxs)(s.li,{children:["If using ",(0,r.jsx)(s.a,{href:"https://github.com/airsonic-advanced/airsonic-advanced",children:"Airsonic Advanced"})," the password used (under ",(0,r.jsx)(s.strong,{children:"Credentials"}),") must be ",(0,r.jsx)(s.strong,{children:"Decodable"})]}),"\n"]})}),"\n",(0,r.jsxs)(i,{type:"tip",summary:"Recommended Alternative Sources",children:[(0,r.jsxs)(s.p,{children:["If your serivce supports scrobbling to ",(0,r.jsx)(s.strong,{children:"Listenbrainz"})," (such as Navidrome), considering using a ",(0,r.jsxs)(s.a,{href:"/configuration/sources/listenbrainz-endpoint",children:[(0,r.jsx)(s.strong,{children:"Listenbrainz (Endpoint)"})," Source"]})," instead of this one."]}),(0,r.jsx)(s.p,{children:"Service-specific scrobble implementations tend to be more accurate and provide more information (multiple artists) compared to the Subsonic API."})]}),"\n",(0,r.jsxs)(s.p,{children:["Use the optional ",(0,r.jsx)(s.code,{children:"usersAllow"})," property with ",(0,r.jsx)(s.strong,{children:"File"})," or ",(0,r.jsx)(s.strong,{children:"AIO"})," configuration to restrict scrobbling to a list of defined users."]}),"\n",(0,r.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n,{config:"SubsonicSourceConfig",fileContent:'[\n {\n "name": "MySubsonic",\n "enable": true,\n "data": {\n "url": "http://localhost:4040/airsonic",\n "user": "yourUser",\n "password": "yourPassword",\n "usersAllow": ["yourUser"]\n }\n }\n]\n',name:"subsonic",children:(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Environmental Variable"}),(0,r.jsx)(s.th,{children:"Required?"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SUBSONIC_USER"})}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SUBSONIC_PASSWORD"})}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SUBSONIC_URL"})}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Base url of your subsonic-api server"})]})]})]})})]})}function u(e={}){let{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}function h(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
-1
assets/js/294f31e2.5cc2a685.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["7544"],{42536:function(e,n,s){s.r(n),s.d(n,{frontMatter:()=>o,default:()=>u,toc:()=>d,metadata:()=>i,assets:()=>a,contentTitle:()=>c});var i=JSON.parse('{"id":"configuration/sources/subsonic","title":"Subsonic","description":"This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome)","source":"@site/docs/configuration/sources/subsonic.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/subsonic","permalink":"/multi-scrobbler/configuration/sources/subsonic","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/subsonic.mdx","tags":[],"version":"current","frontMatter":{"title":"Subsonic","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Spotify","permalink":"/multi-scrobbler/configuration/sources/spotify"},"next":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/sources/tealfm-source"}}'),t=s(85893),r=s(50065);s(703),s(73752),s(75752);let o={title:"Subsonic",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,a={},d=[{value:"Configuration",id:"configuration",level:2}];function l(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components},{Config:s}=n;return s||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["This Source can be used for any application that implements the ",(0,t.jsx)(n.a,{href:"http://www.subsonic.org/pages/api.jsp",children:"Subsonic API"})," and supports the ",(0,t.jsx)(n.a,{href:"http://www.subsonic.org/pages/api.jsp#getNowPlaying",children:(0,t.jsx)(n.code,{children:"getNowPlaying"})})," endpoint (such as ",(0,t.jsx)(n.a,{href:"https://airsonic.github.io/",children:"Airsonic"})," and ",(0,t.jsx)(n.a,{href:"https://www.navidrome.org/",children:"Navidrome"}),")"]}),"\n",(0,t.jsx)(n.admonition,{title:"Known Issues",type:"warning",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Multiple artists are reported as one value and cannot be separated"}),"\n",(0,t.jsxs)(n.li,{children:["If using ",(0,t.jsx)(n.a,{href:"https://github.com/airsonic-advanced/airsonic-advanced",children:"Airsonic Advanced"})," the password used (under ",(0,t.jsx)(n.strong,{children:"Credentials"}),") must be ",(0,t.jsx)(n.strong,{children:"Decodable"})]}),"\n"]})}),"\n",(0,t.jsxs)(n.admonition,{type:"tip",children:[(0,t.jsxs)(n.p,{children:["If your serivce supports scrobbling to ",(0,t.jsx)(n.strong,{children:"Listenbrainz"})," (such as Navidrome), considering using a ",(0,t.jsxs)(n.a,{href:"/configuration/sources/listenbrainz-endpoint",children:[(0,t.jsx)(n.strong,{children:"Listenbrainz (Endpoint)"})," Source"]})," instead of this one."]}),(0,t.jsx)(n.p,{children:"Service-specific scrobble implementations tend to be more accurate and provide more information (multiple artists) compared to the Subsonic API."})]}),"\n",(0,t.jsxs)(n.p,{children:["Use the optional ",(0,t.jsx)(n.code,{children:"usersAllow"})," property with ",(0,t.jsx)(n.strong,{children:"File"})," or ",(0,t.jsx)(n.strong,{children:"AIO"})," configuration to restrict scrobbling to a list of defined users."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(s,{config:"SubsonicSourceConfig",fileContent:'[\n {\n "name": "MySubsonic",\n "enable": true,\n "data": {\n "url": "http://localhost:4040/airsonic",\n "user": "yourUser",\n "password": "yourPassword",\n "usersAllow": ["yourUser"]\n }\n }\n]\n',name:"subsonic",children:(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Environmental Variable"}),(0,t.jsx)(n.th,{children:"Required?"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_USER"})}),(0,t.jsx)(n.td,{children:"Yes"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_PASSWORD"})}),(0,t.jsx)(n.td,{children:"Yes"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_URL"})}),(0,t.jsx)(n.td,{children:"Yes"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Base url of your subsonic-api server"})]})]})]})})]})}function u(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]);
+13
assets/js/2a24ad03.1799cc3e.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3424"],{70003:function(e,t,i){i.d(t,{ZP:()=>d,d$:()=>c});var l=i(85893),s=i(50065),n=i(75752),r=i.n(n);let c=[];function o(e){let t={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(t.p,{children:["A ",(0,l.jsx)(t.strong,{children:"Source"})," that monitors active listening uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,l.jsxs)(t.li,{children:["or amount of time (",(0,l.jsx)(t.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["These default values are based on ",(0,l.jsx)(t.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,l.jsxs)(t.p,{children:["These values can be customized in the ",(0,l.jsx)(t.code,{children:"options"})," of Source's ",(0,l.jsx)(t.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,l.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 + "data": { 3 + // ... 4 + }, 5 + "options": { 6 + // highlight-start 7 + "scrobbleThresholds": { 8 + "duration": 40, // scrobbable if listened to for 40 seconds or more 9 + "percent": 20 // scrobbable if listened to for 20% or more of the track's length 10 + } 11 + // highlight-end 12 + } 13 + }`})]})}function d(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(o,{...e})}):o(e)}},91994:function(e,t,i){i.r(t),i.d(t,{frontMatter:()=>d,default:()=>u,toc:()=>x,metadata:()=>l,assets:()=>a,contentTitle:()=>h});var l=JSON.parse('{"id":"configuration/sources/sources","title":"Overview","description":"A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc...","source":"@site/docs/configuration/sources/sources.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/","permalink":"/multi-scrobbler/configuration/sources/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/sources.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/clients/tealfm"},"next":{"title":"Azuracast","permalink":"/multi-scrobbler/configuration/sources/azuracast"}}'),s=i(85893),n=i(50065),r=i(70003),c=i(703),o=i(73752);let d={sidebar_position:2,title:"Overview",toc_max_heading_level:4},h=void 0,a={},x=[{value:"Sources",id:"sources",level:2},{value:"Features",id:"features",level:2},{value:"Types of Sources",id:"types-of-sources",level:3},{value:"By Communication Method",id:"by-communication-method",level:4},{value:"By Data Source of Truth",id:"by-data-source-of-truth",level:4},{value:"Multi-Device/User",id:"multi-deviceuser",level:3},{value:"Limiting Scrobble Destination",id:"limiting-scrobble-destination",level:3},{value:"Scrobble Thresholds",id:"scrobble-thresholds",level:3},...r.d$,{value:"Should Scrobble Behavior",id:"should-scrobble-behavior",level:3}];function f(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["A ",(0,s.jsx)(t.strong,{children:"Source"})," is a data source that contains information about tracks you are playing like a music player or platform. Examples are ",(0,s.jsx)(t.strong,{children:"Spotify, Jellyfin, Plex, Youtube Music, Airsonic"}),", etc..."]}),"\n",(0,s.jsx)(t.h2,{id:"sources",children:"Sources"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Networking"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Scrobble SOT"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"#multi-deviceuser",children:"Multi Device/User"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"#limiting-scrobble-destination",children:"Scrobble Destination"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"#scrobble-thresholds",children:"Thresholds"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"#should-scrobble-behavior",children:"Should Scrobble"})})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/azuracast",children:"Azuracast"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/deezer",children:"Deezer"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/google-cast",children:"Google Cast (Chromecast)"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/icecast",children:"Icecast"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/jriver",children:"JRiver"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/kodi",children:"Kodi"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/koito-source",children:"Koito"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=ingress#by-communication-method",children:"Ingress"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/listenbrainz-source",children:"ListenBrainz"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"ListenBrainz (Endpoint)"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=ingress#by-communication-method",children:"Ingress"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/maloja",children:"Maloja"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/mopidy",children:"Mopidy"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/mpd",children:"MPD (Music Player Daemon)"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/musikcube",children:"Musikcube"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/plex",children:"Plex"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/spotify",children:"Spotify"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/subsonic",children:"Subsonic-compatible APIs"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/webscrobbler",children:"WebScrobbler"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Ingress"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/vlc",children:"VLC"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/yamaha-musiccast",children:"Yamaha MusicCast"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/youtube-music",children:"Youtube Music"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,s.jsx)(t.h3,{id:"types-of-sources",children:"Types of Sources"}),"\n",(0,s.jsx)(t.p,{children:"The Sources implemented in multi-scrobbler can be broken down into two categories."}),"\n",(0,s.jsx)(t.h4,{id:"by-communication-method",children:"By Communication Method"}),"\n",(0,s.jsx)(t.p,{children:"How does this Source get data from the service/application?"}),"\n",(0,s.jsxs)(c.default,{groupId:"sourceComm",queryString:!0,children:[(0,s.jsx)(o.default,{value:"active",label:"Active",children:(0,s.jsx)(t.p,{children:"The MS Source makes network requests to the service which returns a response with data MS can use to monitor listening activity or scrobbles."})}),(0,s.jsxs)(o.default,{value:"ingress",label:"Ingress",children:[(0,s.jsx)(t.p,{children:"The MS Source waits for the service/application to send data to multi-scrobbler."}),(0,s.jsx)(t.p,{children:"These types of Sources require that multi-scrobbler is accessible to the service, generally through an open port or reverse proxy."})]})]}),"\n",(0,s.jsx)(t.h4,{id:"by-data-source-of-truth",children:"By Data Source of Truth"}),"\n",(0,s.jsx)(t.p,{children:"How does MS determine if/when a song has been played and is scrobbable?"}),"\n",(0,s.jsxs)(c.default,{groupId:"sot",queryString:!0,children:[(0,s.jsxs)(o.default,{value:"activity",label:"Listening Activity",children:[(0,s.jsx)(t.p,{children:"These Sources expose some kind of real-time listening data for users, like:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"player state (paused, stopped, playing)"}),"\n",(0,s.jsx)(t.li,{children:"player position (1:50/2:40)"}),"\n",(0,s.jsx)(t.li,{children:"current listened duration (Track A playing for 1m:20s)"}),"\n"]}),(0,s.jsxs)(t.p,{children:["For theses Sources multi-scrobbler keeps track of the real-time state of your activity and scrobbles a track after it meets certain ",(0,s.jsx)(t.a,{href:"#scrobble-thresholds",children:"scrobble thresholds"}),"."]})]}),(0,s.jsxs)(o.default,{value:"history",label:"Listening History",children:[(0,s.jsx)(t.p,{children:'Some Sources expose their own version of "this track has been scrobbled."'}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:'Listenbrainz, Koito, and Last.fm are all scrobble services that have "definitive" histories of scrobbled tracks.'}),"\n"]}),(0,s.jsx)(t.p,{children:"For these Sources multi-scrobbler monitors the listening history data and scrobbles when it sees a new entry in the list."})]})]}),"\n",(0,s.jsx)(t.h3,{id:"multi-deviceuser",children:"Multi-Device/User"}),"\n",(0,s.jsx)(t.p,{children:"Some Sources report which User is playing a track and/or on what device the track is being played. These Sources can be filtered with configuration to only monitor activity for specific devices or users."}),"\n",(0,s.jsx)(t.h3,{id:"limiting-scrobble-destination",children:"Limiting Scrobble Destination"}),"\n",(0,s.jsxs)(t.p,{children:["To limit which Clients a Source will scrobble to use the ",(0,s.jsx)(t.code,{children:"clients"})," property in a Source's ",(0,s.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO configuration"})," to specify the ",(0,s.jsx)(t.strong,{children:"name"})," property of the Clients that it should scrobble to:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json5",metastring:'title="jellyfin.json"',children:'{\n "name": "MyJellyfin",\n "clients": ["myMaloja","koitoA","listenbrainzFoo"]\n "data": {\n // ...\n },\n}\n'})}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["If ",(0,s.jsx)(t.code,{children:"clients"})," is empty (",(0,s.jsx)(t.code,{children:'"clients": []'}),") or is omitted then the default is for the Source to scrobble to ",(0,s.jsx)(t.strong,{children:"all"})," configured Clients."]})}),"\n",(0,s.jsxs)(t.admonition,{type:"note",children:[(0,s.jsxs)(t.p,{children:["If a Client is configured using ",(0,s.jsx)(t.a,{href:"/configuration?configType=env#configuration-types",children:"ENV"})," then it is given a generated name. Check the multi-scrobbler Dashboard to find their name in a subheader under the Client type. Example:"]}),(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Client Name Subheader",src:i(79316).Z+"",width:"177",height:"101"})}),(0,s.jsxs)(t.p,{children:["Otherwise, use the ",(0,s.jsx)(t.code,{children:"name"})," property you gave the client in it's File/AIO config."]})]}),"\n",(0,s.jsx)(t.h3,{id:"scrobble-thresholds",children:"Scrobble Thresholds"}),"\n",(0,s.jsx)(r.ZP,{filename:"spotify"}),"\n",(0,s.jsxs)(t.p,{children:["These can also be configured ",(0,s.jsx)(t.strong,{children:"globally"})," for all Sources using ENVs:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"SOURCE_SCROBBLE_DURATION=40\nSOURCE_SCROBBLE_PERCENT=20\n"})}),"\n",(0,s.jsx)(t.h3,{id:"should-scrobble-behavior",children:"Should Scrobble Behavior"}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"This feature is currently available only for some Sources. Check each Source's documentation to see if it supported."})}),"\n",(0,s.jsxs)(t.p,{children:["For ",(0,s.jsx)(t.em,{children:"most"})," Sources multi-scrobbler can determine if a user is listening and scrobble automatically. For Sources which multi-scrobbler cannot do this or require additional configuration, a user can indicate to MS that it should or should not scrobble. This action can be taken on the Web Dashboard by clicking the link next to ",(0,s.jsx)(t.strong,{children:"Should Scrobble"})," found in each Source's status card."]}),"\n",(0,s.jsxs)(t.p,{children:["Additionally, for these Sources, the default behavior for Scrobbling can be explicitly set by adding the following value to a Source's ",(0,s.jsx)(t.code,{children:"options"})," in ",(0,s.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json5",metastring:'title="azuracast.json"',children:'{\n "data": {\n // ...\n },\n "options": {\n // set to true to always scrobble automatically\n // set to false to never scrobble automatically\n "systemScrobble": true\n }\n}\n'})})]})}function u(e={}){let{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(f,{...e})}):f(e)}},79316:function(e,t,i){i.d(t,{Z:()=>l});let l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAABlCAYAAAAChgL8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAPA0lEQVR4nO3ceVxV1d7H8c8+A8ggs8iQoqIiKAKiOODUY5qVkd6s6y2v5pBlmWmpWWmKtxK1wbQnLYfM7MnsajfMDFBURBEVFBAZxAlBUBAQDjKevZ8/VByyWyjI2bXerxd/wBnW2ofvWfu3195rSx7ePRUEQcU0Td0BQbhXIsSC6okQC6onQiyongixoHoixILqiRALqidCLKieCLGgeiLEguqJEAuqJ0IsqJ4IsaB6IsSC6okQC6onQiyongixoHq6e3mxi4tbQ/VDEO6aGIkF1RMhFlRPhFhQvXsIsVgkLZiGuwyxIjIsmIy7C7HIsGBCRDkhqN5dhFgR8RVMihiJBdUTU2yC6okQC6onQiyongixoHr1D7E4nhNMjBiJBdUTIW4k+g4hhC0P439fDKS51NS9uTu6dsMIWx7Gpy8GYmvC2/CXDLFk3Yo+j4Yw9pkQQgJbom/wBmx48NmR9Pd2oyQjA0ODlGB63Hs8zKghXtjfp0DVZqdxxtqTwBGjGOFhulG5p5Ud9aXv/zo75gWjSVnDU9O3kd8E9bVkG8is5bMY/oAeCYWC8DNsT7jQoG1oHHsxLMgKDLFExRtuOYzQ2HXgkZEhPNHPm7bOzdFVFHIi6QA/bvwP2zPKkAEwY9C89bw3AGLeH8esHRXQvA+vhk6iv1kBrnkv83GKsUH7fEe1Z9i5O4d/jm3Do0Pas+GLTGobv9V6M92v1z3SOD/KZxFb2L95Mj3rvqoSjv2G8Zi7jpqsXwh9I5TZ36VT06AtS9j26EFXc6hMPkxCxY1H9B6DCVv5PnOeCabrA7boq6vR2LjQdcAI5ixbzPxBzr/9DzGkEP7DAfbt+InIk3KD9hig2YMziYneQsyCfljU/dXI6UNHOC9rce8ViKe2wZttEPd1JG56Es3trNFIMucP7ybyUCYNP57p6ezXETPJSHJSBuXXh2FdG0bPnkA/Zw2XU7awcMlmYnIqkCxdCX72Zeb83YeHpk7gwNEwfr50h7dViohdtYTYBu/vf1eblUpy2RO0cvehq6NExkXTm54ywRBrcfR7hEmjBxPs7YKNUkbeqRS2b/iGDYcKr+3OJCzb9WfiuGH8T9dWOJrXUpKTRvSmDXwedRZ54Ewi5/bGDMB+MJ9EPkTp7khOBj9MwLUCuPWoMPaNqiVh2WRe+cmNGd/OZ4T1ARbOTiNocgg9Pay5khHBknc3cMztcV6fPIy+bS0pz07gu+Wr2JBSeufZRo0rXu0s0cjFZGZd4vqYaRH4GCM7mKEUxbJk3jfsKbn6auVKHntXL2VVp0953d+fR4Lt+SXc8Ov31fky69v5/M0mnaXPzWFjngLoeaDPcJ4fNZAgT0csqgpIjYtk9ZptHCmSAQnn4aFsnupN9tehLC4dzPRRPWhnVU1u8g5WfPwtMRckekz7nE9C7K/uBfpOZ1f0FGIXTWBmhAGlJpuMs0Ye69KaTm11cLFh91sNweRCbOH3Tz5d/DhtKOZ4/D7ia10I7NOfF95ti8WrM1mRXoNk15s3F0/lIbsrnD64l30Flvj0C+LpWZ441rzGgrxUIg61ZnB3d5opF0nceYxTGacpvLIHpVs/urlokPOPEZGUz6nsqrowSnovxr/uSVHOSdItfAn0DeHtN1pyuk17zNIzOKrvQpBnMJPny+SOW0p06R1irHXCraUGjBfJvXA9wlraB/hgr5Ep3BtFTMltr1MK2fLWOH7RS8jVlch/6N8i4TLkNVbOCsKhMp+khEMYHLwIGvocn/i04LUpX3K4/MZz7fo9T6hFBVmpqdDZD6+gEYTONTB+ajiFafuIatuLwb5OUJjOzoQcUnNrrn4uSgnn8ytRulrg6mqLhkIavpi5NyYWYgmLmtNs+/5ndCmbWR9fgoyWTuM/Ys3oBxg0sC2r0jORvLoRZCdRe/x7Zr4dTq4CZuEDGRtsRXY+1Kb/zMIPwf3rifgbkvhqyQriawF2sGd0K74e70HurvW8uyrrajlR9ymYkf71DN6MKkGx9Gf22jkM7+bPiaVTmbK1ENmsAy99/j5jWvnRu5OW6IN3OMzRW9HcXAKlnNK6aQkNTs4OSMjknsu7YwkjV1VgqKrHR2Xuy5gJPXCsyWL19HdYc6IKJBv6z/qAsCFDmDh0G4mbL9a1b2+RwcwXVrCvVEHj+gifrJ5Ij4696eseztcRa1lY7ciDvk6Qvp33F+3lRikvYyirQMEC6+aW9ejg/WNiIVYoOr6HDcdjMLdrSQe/bri7uNHNzxYJCSsrSyTAmJdDjlHBx2sYb07RsD0xk7T0ONasr6obJe7qiNWYS3Lq5asjUEUeZy/K4FRM5sniq+9bfZ4z543Q2hyLZr83zyUh3fJb3SY2CG07P7o7aDBmHeXQZWucW1gDcDIhjbLBfekU0AmruhArlCcf4uC1PYd8IZUjuTI92llj/wcmsSWNCU8SY3IhBr17MFNnjSOkiz3mEhgrism5fGsk5extLFjkwIwJgwgcPobuIwClmoJjO1m+ZB2ROXdbt8nIt4dMUVB+tf+8NaC3qC6l+IoC1jY42mnAIAMyBReLUXDGvbUL2jvskjU6c8z1oNRUU/kH5rE0zW2wkUDn9RRfbHzqV4/X2NpiI1E381JbffNnIiPL17bjd/Opw87OGgmZyyVlJnnVgWmFWHJk2LSXGdnZSMqmD1n6YxInLlzB9vF5bJnme9MTazgbvZZXotdj49YGH5/ODHhiBE/4DuWt6edInvELF3+zkUZmzOPMOSN0ccPTQw85VYCRrKPHKRnpglPfwfT7KpXom+tiyYkRiz5lhj8kLHuZqT+W/W4ziqGMMsDm4j4+Wb6H3Nu+FXLZOYoUaH6v26N1xdNDjySXcPbcbxzMNjHTmifWtqCVqxmSnMuenw5wPL+cGmzx929907dNwj7wSea+9y8WjfKg6nwWB3b8yNJ1B7gkS+gdHLDVALKMAkg6M/T3cyuVQpKOXcAoWeLr166u3xWHt7H5ZDWSQ19mvvMP+ro3QwKkZi3pM24ak/zMUEoT2Lq3CPnGoSZanfaOo37tqWQSixQkezecSo6zL+4wsXEJJBmc8PF0xqqmkvqU2IoMigKY6TG7qUGNozcBrTQoFRkcOXEfTrDchSYZibXtH2fxp/1uOckgF+1nSeguUjMNyG4dGPevN2h95BLN2nfD311zUy2pUFas0CbAB5+e81jrn0j6ZSs69vDHSaokbWccp4wgl+aRXaoQ6NCLGR/Z8FjsJuZuPHEfts5IZuxBcp8egXuv7nh9kUZqLVB7mvXvf4n3BxMJ9h/JkvUjqDRUgKUVFloJpSqXrR+uIapIAWQKC4uRcab7mLdYYLmG0PDbmqlMZt2agwTPDGL0kqUEJGZwQeNMl4D2OGvz2Zy2hx316HXt+VxyZWgb8AzLFvUi7t9LWXmwAseeQXTWgWH/AQ5fabhPqSE1yUissXSmo3dHOt/808EZK8qIXraYz6JPYnAO4NGhQbTOD2fe2mO3BL721A+8PmM1PyQWYdulNw8P6IRNwVH+vXQ+r31z+upzq5NZs2QLcTnVOHj5EuDbCsf7dc1BRjRbM2vQuAUztMuNKzNqzkbwxgtzWbgxjtTcMmRzcyjLJ2XPZuZPmc3C2KJrtbKRlO/X8X1yIbWOHegV5InTr/oukxfxES+8s4mdp4x4dO9Ff/8WVKbt5rM35/JxQnm9dv3GrHDCVsdx0mBFez9vAj1boJWcGfSQD+bKJXZuO8xlU6wlAMnDu2f9uqZcX+0s4+raqjH69CcgYRP8Cv8XOgDd7g94+r047jSlbOp0Hf7BV5+NxO34OsZO30q2qU0QXyNCLKieaR3YCcJdECEWVE+EWFA9EWJB9USIBdUTIRZUT4RYUD0RYkH1VBxiCefhC9i18knaXN8KjSP9XpzPdz98S/Ty4bRV8dYJf5xpXYp5j/R+TzLriebsWhTKLyfzOGuip0mFhvXnCrGjA9aXkomKTee4Kd4gQWgU9zHEV1fefvdQGov3PcAzf/PDtSaL7z9cznab4cye+CBd7Ks5vXcj734cyQklgDc3zMD5y5d57eeSa9draPEa/xFfBO3luZc2U7cOUuvJ5DVhjPW4emOEVZEhlEeFMXRhEv3nrWNS0Vo2WQ5mTLA7muw9fPjeD1Q98gLTQnxxUS5wYNNK3tuYpsqLdIQmqIm1bfoSXP0TMye8wqtbagiZs4hFg4tYOXUSIS99SZb3OGYPd0dTdYzIGAP+A4NuXEKpbcug/s5kRO+7tVQwnmHdq8/z1LIjVF2MYtaoCYxcdvTa5ZsaWvbthd3Ojxk75m1W5HXj7WULGK3dxrTRE3l2cRKuo6cw1ttE7wwi/K77HmKlKJ6NP6aRX1pM6tZojprpOR7+E8mXrlByZj9b4y/TtmNr9NSQHL2fws596H/tYlqdVzAPtsgkYnf+bWvUjFSUlnDJUINcXU5RUQnF5devQFaoTNjOhsP5lJScJXJbIhXWuWzbmESewUBOfBTR5+zp2N72t9fNCSbtvodYvlJ+de0kgCxjVKqprLyxHzcajUg6HRqgJj2WnRc6MijYEQ06Og/siX1yDLsL6rPfV6gov3JjmbwsIytVN7VpxGgEvV4nQqxSpj0JZTxN5K48fAb2oqW5F4P6WnMo6iBFonYVbmLaIUbmzK69nGwfxMA+QfQ2TyQi3jSXjQtNx8RDDHLufiJPtOPpCb0xj4shvvzGY1WVVUgOrfBpY4+FqAX+skw+xCgF7NqZib2LQsyOlJtur6RQGh/J1uIAZi+fwhAHkeK/KhWssZNwfPRtNo06x7TxX5EiTmIItzHpM3ZScxe8PL158ilvsiO+EmfhhDsy4RBLtBg4iRVT2pO//xvmbT7XCDfEFv4MVFBOCMJ/Z/oHdoLwOxq1nOhWUki34oLGbKJRJNq3INHOqam7IfxBjRvi4gImnklvzCYaxWoQIVYRUU4IqteoI3GifQtWN2YDjSTRvkVTd0Goh8YNsZ2T2C0LjU6UE4LqiRALqidCLKieCLGgeiLEguqJEAuqJ0IsqN49zRN3D/BrqH4Iwl0TI7GgeiLEguqJEAuqJ0IsqJ4IsaB6IsSC6okQC6onQiyongixoHoixILqiRALqidCLKieCLGgeiLEgur9P7w+WrWPSpyoAAAAAElFTkSuQmCC"}}]);
-13
assets/js/2a24ad03.3d498c1e.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3424"],{70003:function(e,t,i){i.d(t,{ZP:()=>d,d$:()=>c});var l=i(85893),s=i(50065),n=i(75752),r=i.n(n);let c=[];function o(e){let t={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(t.p,{children:["A ",(0,l.jsx)(t.strong,{children:"Source"})," that monitors active listening uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,l.jsxs)(t.li,{children:["or amount of time (",(0,l.jsx)(t.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["These default values are based on ",(0,l.jsx)(t.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,l.jsxs)(t.p,{children:["These values can be customized in the ",(0,l.jsx)(t.code,{children:"options"})," of Source's ",(0,l.jsx)(t.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,l.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 - "data": { 3 - // ... 4 - }, 5 - "options": { 6 - // highlight-start 7 - "scrobbleThresholds": { 8 - "duration": 40, // scrobbable if listened to for 40 seconds or more 9 - "percent": 20 // scrobbable if listened to for 20% or more of the track's length 10 - } 11 - // highlight-end 12 - } 13 - }`})]})}function d(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(o,{...e})}):o(e)}},91994:function(e,t,i){i.r(t),i.d(t,{frontMatter:()=>d,default:()=>u,toc:()=>x,metadata:()=>l,assets:()=>a,contentTitle:()=>h});var l=JSON.parse('{"id":"configuration/sources/sources","title":"Overview","description":"A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc...","source":"@site/docs/configuration/sources/sources.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/","permalink":"/multi-scrobbler/configuration/sources/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/sources.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/clients/tealfm"},"next":{"title":"Azuracast","permalink":"/multi-scrobbler/configuration/sources/azuracast"}}'),s=i(85893),n=i(50065),r=i(70003),c=i(703),o=i(73752);let d={sidebar_position:2,title:"Overview",toc_max_heading_level:4},h=void 0,a={},x=[{value:"Sources",id:"sources",level:2},{value:"Features",id:"features",level:2},{value:"Types of Sources",id:"types-of-sources",level:3},{value:"By Communication Method",id:"by-communication-method",level:4},{value:"By Data Source of Truth",id:"by-data-source-of-truth",level:4},{value:"Multi-Device/User",id:"multi-deviceuser",level:3},{value:"Limiting Scrobble Destination",id:"limiting-scrobble-destination",level:3},{value:"Scrobble Thresholds",id:"scrobble-thresholds",level:3},...r.d$,{value:"Should Scrobble Behavior",id:"should-scrobble-behavior",level:3}];function f(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["A ",(0,s.jsx)(t.strong,{children:"Source"})," is a data source that contains information about tracks you are playing like a music player or platform. Examples are ",(0,s.jsx)(t.strong,{children:"Spotify, Jellyfin, Plex, Youtube Music, Airsonic"}),", etc..."]}),"\n",(0,s.jsx)(t.h2,{id:"sources",children:"Sources"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Networking"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Scrobble SOT"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"#multi-deviceuser",children:"Multi Device/User"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"#limiting-scrobble-destination",children:"Scrobble Destination"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"#scrobble-thresholds",children:"Thresholds"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"#should-scrobble-behavior",children:"Should Scrobble"})})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/azuracast",children:"Azuracast"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/deezer",children:"Deezer"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/google-cast",children:"Google Cast (Chromecast)"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/icecast",children:"Icecast"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/jriver",children:"JRiver"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/kodi",children:"Kodi"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/koito-source",children:"Koito"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=ingress#by-communication-method",children:"Ingress"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/listenbrainz-source",children:"ListenBrainz"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"ListenBrainz (Endpoint)"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=ingress#by-communication-method",children:"Ingress"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/maloja",children:"Maloja"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/mopidy",children:"Mopidy"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/mpd",children:"MPD (Music Player Daemon)"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/musikcube",children:"Musikcube"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/plex",children:"Plex"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/spotify",children:"Spotify"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/subsonic",children:"Subsonic-compatible APIs"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/webscrobbler",children:"WebScrobbler"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Ingress"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/vlc",children:"VLC"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/yamaha-musiccast",children:"Yamaha MusicCast"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/sources/youtube-music",children:"Youtube Music"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,s.jsx)(t.h3,{id:"types-of-sources",children:"Types of Sources"}),"\n",(0,s.jsx)(t.p,{children:"The Sources implemented in multi-scrobbler can be broken down into two categories."}),"\n",(0,s.jsx)(t.h4,{id:"by-communication-method",children:"By Communication Method"}),"\n",(0,s.jsx)(t.p,{children:"How does this Source get data from the service/application?"}),"\n",(0,s.jsxs)(c.default,{groupId:"sourceComm",queryString:!0,children:[(0,s.jsx)(o.default,{value:"active",label:"Active",children:(0,s.jsx)(t.p,{children:"The MS Source makes network requests to the service which returns a response with data MS can use to monitor listening activity or scrobbles."})}),(0,s.jsxs)(o.default,{value:"ingress",label:"Ingress",children:[(0,s.jsx)(t.p,{children:"The MS Source waits for the service/application to send data to multi-scrobbler."}),(0,s.jsx)(t.p,{children:"These types of Sources require that multi-scrobbler is accessible to the service, generally through an open port or reverse proxy."})]})]}),"\n",(0,s.jsx)(t.h4,{id:"by-data-source-of-truth",children:"By Data Source of Truth"}),"\n",(0,s.jsx)(t.p,{children:"How does MS determine if/when a song has been played and is scrobbable?"}),"\n",(0,s.jsxs)(c.default,{groupId:"sot",queryString:!0,children:[(0,s.jsxs)(o.default,{value:"activity",label:"Listening Activity",children:[(0,s.jsx)(t.p,{children:"These Sources expose some kind of real-time listening data for users, like:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"player state (paused, stopped, playing)"}),"\n",(0,s.jsx)(t.li,{children:"player position (1:50/2:40)"}),"\n",(0,s.jsx)(t.li,{children:"current listened duration (Track A playing for 1m:20s)"}),"\n"]}),(0,s.jsxs)(t.p,{children:["For theses Sources multi-scrobbler keeps track of the real-time state of your activity and scrobbles a track after it meets certain ",(0,s.jsx)(t.a,{href:"#scrobble-thresholds",children:"scrobble thresholds"}),"."]})]}),(0,s.jsxs)(o.default,{value:"history",label:"Listening History",children:[(0,s.jsx)(t.p,{children:'Some Sources expose their own version of "this track has been scrobbled."'}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:'Listenbrainz, Koito, and Last.fm are all scrobble services that have "definitive" histories of scrobbled tracks.'}),"\n"]}),(0,s.jsx)(t.p,{children:"For these Sources multi-scrobbler monitors the listening history data and scrobbles when it sees a new entry in the list."})]})]}),"\n",(0,s.jsx)(t.h3,{id:"multi-deviceuser",children:"Multi-Device/User"}),"\n",(0,s.jsx)(t.p,{children:"Some Sources report which User is playing a track and/or on what device the track is being played. These Sources can be filtered with configuration to only monitor activity for specific devices or users."}),"\n",(0,s.jsx)(t.h3,{id:"limiting-scrobble-destination",children:"Limiting Scrobble Destination"}),"\n",(0,s.jsxs)(t.p,{children:["To limit which Clients a Source will scrobble to use the ",(0,s.jsx)(t.code,{children:"clients"})," property in a Source's ",(0,s.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO configuration"})," to specify the ",(0,s.jsx)(t.strong,{children:"name"})," property of the Clients that it should scrobble to:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json5",metastring:'title="jellyfin.json"',children:'{\n "name": "MyJellyfin",\n "clients": ["myMaloja","koitoA","listenbrainzFoo"]\n "data": {\n // ...\n },\n}\n'})}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["If ",(0,s.jsx)(t.code,{children:"clients"})," is empty (",(0,s.jsx)(t.code,{children:'"clients": []'}),") or is omitted then the default is for the Source to scrobble to ",(0,s.jsx)(t.strong,{children:"all"})," configured Clients."]})}),"\n",(0,s.jsxs)(t.admonition,{type:"note",children:[(0,s.jsxs)(t.p,{children:["If a Client is configured using ",(0,s.jsx)(t.a,{href:"/configuration?configType=env#configuration-types",children:"ENV"})," then it is given a generated name. Check the multi-scrobbler Dashboard to find their name in a subheader under the Client type. Example:"]}),(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Client Name Subheader",src:i(79316).Z+"",width:"177",height:"101"})}),(0,s.jsxs)(t.p,{children:["Otherwise, use the ",(0,s.jsx)(t.code,{children:"name"})," property you gave the client in it's File/AIO config."]})]}),"\n",(0,s.jsx)(t.h3,{id:"scrobble-thresholds",children:"Scrobble Thresholds"}),"\n",(0,s.jsx)(r.ZP,{filename:"spotify"}),"\n",(0,s.jsxs)(t.p,{children:["These can also be configured ",(0,s.jsx)(t.strong,{children:"globally"})," for all Sources using ENVs:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"SOURCE_SCROBBLE_DURATION=40\nSOURCE_SCROBBLE_PERCENT=20\n"})}),"\n",(0,s.jsx)(t.h3,{id:"should-scrobble-behavior",children:"Should Scrobble Behavior"}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"This feature is currently available only for some Sources. Check each Source's documentation to see if it supported."})}),"\n",(0,s.jsxs)(t.p,{children:["For ",(0,s.jsx)(t.em,{children:"most"})," Sources multi-scrobbler can determine if a user is listening and scrobble automatically. For Sources which multi-scrobbler cannot do this or require additional configuration, a user can indicate to MS that it should or should not scrobble. This action can be taken on the Web Dashboard by clicking the link next to ",(0,s.jsx)(t.strong,{children:"Should Scrobble"})," found in each Source's status card."]}),"\n",(0,s.jsxs)(t.p,{children:["Additionally, for these Sources, the default behavior for Scrobbling can be explicitly set by adding the following value to a Source's ",(0,s.jsx)(t.code,{children:"options"})," in ",(0,s.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json5",metastring:'title="azuracast.json"',children:'{\n "data": {\n // ...\n },\n "options": {\n // set to true to always scrobble automatically\n // set to false to never scrobble automatically\n "systemScrobble": true\n }\n}\n'})})]})}function u(e={}){let{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(f,{...e})}):f(e)}},79316:function(e,t,i){i.d(t,{Z:()=>l});let l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAABlCAYAAAAChgL8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAPA0lEQVR4nO3ceVxV1d7H8c8+A8ggs8iQoqIiKAKiOODUY5qVkd6s6y2v5pBlmWmpWWmKtxK1wbQnLYfM7MnsajfMDFBURBEVFBAZxAlBUBAQDjKevZ8/VByyWyjI2bXerxd/wBnW2ofvWfu3195rSx7ePRUEQcU0Td0BQbhXIsSC6okQC6onQiyongixoHoixILqiRALqidCLKieCLGgeiLEguqJEAuqJ0IsqJ4IsaB6IsSC6okQC6onQiyongixoHq6e3mxi4tbQ/VDEO6aGIkF1RMhFlRPhFhQvXsIsVgkLZiGuwyxIjIsmIy7C7HIsGBCRDkhqN5dhFgR8RVMihiJBdUTU2yC6okQC6onQiyongixoHr1D7E4nhNMjBiJBdUTIW4k+g4hhC0P439fDKS51NS9uTu6dsMIWx7Gpy8GYmvC2/CXDLFk3Yo+j4Yw9pkQQgJbom/wBmx48NmR9Pd2oyQjA0ODlGB63Hs8zKghXtjfp0DVZqdxxtqTwBGjGOFhulG5p5Ud9aXv/zo75gWjSVnDU9O3kd8E9bVkG8is5bMY/oAeCYWC8DNsT7jQoG1oHHsxLMgKDLFExRtuOYzQ2HXgkZEhPNHPm7bOzdFVFHIi6QA/bvwP2zPKkAEwY9C89bw3AGLeH8esHRXQvA+vhk6iv1kBrnkv83GKsUH7fEe1Z9i5O4d/jm3Do0Pas+GLTGobv9V6M92v1z3SOD/KZxFb2L95Mj3rvqoSjv2G8Zi7jpqsXwh9I5TZ36VT06AtS9j26EFXc6hMPkxCxY1H9B6DCVv5PnOeCabrA7boq6vR2LjQdcAI5ixbzPxBzr/9DzGkEP7DAfbt+InIk3KD9hig2YMziYneQsyCfljU/dXI6UNHOC9rce8ViKe2wZttEPd1JG56Es3trNFIMucP7ybyUCYNP57p6ezXETPJSHJSBuXXh2FdG0bPnkA/Zw2XU7awcMlmYnIqkCxdCX72Zeb83YeHpk7gwNEwfr50h7dViohdtYTYBu/vf1eblUpy2RO0cvehq6NExkXTm54ywRBrcfR7hEmjBxPs7YKNUkbeqRS2b/iGDYcKr+3OJCzb9WfiuGH8T9dWOJrXUpKTRvSmDXwedRZ54Ewi5/bGDMB+MJ9EPkTp7khOBj9MwLUCuPWoMPaNqiVh2WRe+cmNGd/OZ4T1ARbOTiNocgg9Pay5khHBknc3cMztcV6fPIy+bS0pz07gu+Wr2JBSeufZRo0rXu0s0cjFZGZd4vqYaRH4GCM7mKEUxbJk3jfsKbn6auVKHntXL2VVp0953d+fR4Lt+SXc8Ov31fky69v5/M0mnaXPzWFjngLoeaDPcJ4fNZAgT0csqgpIjYtk9ZptHCmSAQnn4aFsnupN9tehLC4dzPRRPWhnVU1u8g5WfPwtMRckekz7nE9C7K/uBfpOZ1f0FGIXTWBmhAGlJpuMs0Ye69KaTm11cLFh91sNweRCbOH3Tz5d/DhtKOZ4/D7ia10I7NOfF95ti8WrM1mRXoNk15s3F0/lIbsrnD64l30Flvj0C+LpWZ441rzGgrxUIg61ZnB3d5opF0nceYxTGacpvLIHpVs/urlokPOPEZGUz6nsqrowSnovxr/uSVHOSdItfAn0DeHtN1pyuk17zNIzOKrvQpBnMJPny+SOW0p06R1irHXCraUGjBfJvXA9wlraB/hgr5Ep3BtFTMltr1MK2fLWOH7RS8jVlch/6N8i4TLkNVbOCsKhMp+khEMYHLwIGvocn/i04LUpX3K4/MZz7fo9T6hFBVmpqdDZD6+gEYTONTB+ajiFafuIatuLwb5OUJjOzoQcUnNrrn4uSgnn8ytRulrg6mqLhkIavpi5NyYWYgmLmtNs+/5ndCmbWR9fgoyWTuM/Ys3oBxg0sC2r0jORvLoRZCdRe/x7Zr4dTq4CZuEDGRtsRXY+1Kb/zMIPwf3rifgbkvhqyQriawF2sGd0K74e70HurvW8uyrrajlR9ymYkf71DN6MKkGx9Gf22jkM7+bPiaVTmbK1ENmsAy99/j5jWvnRu5OW6IN3OMzRW9HcXAKlnNK6aQkNTs4OSMjknsu7YwkjV1VgqKrHR2Xuy5gJPXCsyWL19HdYc6IKJBv6z/qAsCFDmDh0G4mbL9a1b2+RwcwXVrCvVEHj+gifrJ5Ij4696eseztcRa1lY7ciDvk6Qvp33F+3lRikvYyirQMEC6+aW9ejg/WNiIVYoOr6HDcdjMLdrSQe/bri7uNHNzxYJCSsrSyTAmJdDjlHBx2sYb07RsD0xk7T0ONasr6obJe7qiNWYS3Lq5asjUEUeZy/K4FRM5sniq+9bfZ4z543Q2hyLZr83zyUh3fJb3SY2CG07P7o7aDBmHeXQZWucW1gDcDIhjbLBfekU0AmruhArlCcf4uC1PYd8IZUjuTI92llj/wcmsSWNCU8SY3IhBr17MFNnjSOkiz3mEhgrism5fGsk5extLFjkwIwJgwgcPobuIwClmoJjO1m+ZB2ROXdbt8nIt4dMUVB+tf+8NaC3qC6l+IoC1jY42mnAIAMyBReLUXDGvbUL2jvskjU6c8z1oNRUU/kH5rE0zW2wkUDn9RRfbHzqV4/X2NpiI1E381JbffNnIiPL17bjd/Opw87OGgmZyyVlJnnVgWmFWHJk2LSXGdnZSMqmD1n6YxInLlzB9vF5bJnme9MTazgbvZZXotdj49YGH5/ODHhiBE/4DuWt6edInvELF3+zkUZmzOPMOSN0ccPTQw85VYCRrKPHKRnpglPfwfT7KpXom+tiyYkRiz5lhj8kLHuZqT+W/W4ziqGMMsDm4j4+Wb6H3Nu+FXLZOYoUaH6v26N1xdNDjySXcPbcbxzMNjHTmifWtqCVqxmSnMuenw5wPL+cGmzx929907dNwj7wSea+9y8WjfKg6nwWB3b8yNJ1B7gkS+gdHLDVALKMAkg6M/T3cyuVQpKOXcAoWeLr166u3xWHt7H5ZDWSQ19mvvMP+ro3QwKkZi3pM24ak/zMUEoT2Lq3CPnGoSZanfaOo37tqWQSixQkezecSo6zL+4wsXEJJBmc8PF0xqqmkvqU2IoMigKY6TG7qUGNozcBrTQoFRkcOXEfTrDchSYZibXtH2fxp/1uOckgF+1nSeguUjMNyG4dGPevN2h95BLN2nfD311zUy2pUFas0CbAB5+e81jrn0j6ZSs69vDHSaokbWccp4wgl+aRXaoQ6NCLGR/Z8FjsJuZuPHEfts5IZuxBcp8egXuv7nh9kUZqLVB7mvXvf4n3BxMJ9h/JkvUjqDRUgKUVFloJpSqXrR+uIapIAWQKC4uRcab7mLdYYLmG0PDbmqlMZt2agwTPDGL0kqUEJGZwQeNMl4D2OGvz2Zy2hx316HXt+VxyZWgb8AzLFvUi7t9LWXmwAseeQXTWgWH/AQ5fabhPqSE1yUissXSmo3dHOt/808EZK8qIXraYz6JPYnAO4NGhQbTOD2fe2mO3BL721A+8PmM1PyQWYdulNw8P6IRNwVH+vXQ+r31z+upzq5NZs2QLcTnVOHj5EuDbCsf7dc1BRjRbM2vQuAUztMuNKzNqzkbwxgtzWbgxjtTcMmRzcyjLJ2XPZuZPmc3C2KJrtbKRlO/X8X1yIbWOHegV5InTr/oukxfxES+8s4mdp4x4dO9Ff/8WVKbt5rM35/JxQnm9dv3GrHDCVsdx0mBFez9vAj1boJWcGfSQD+bKJXZuO8xlU6wlAMnDu2f9uqZcX+0s4+raqjH69CcgYRP8Cv8XOgDd7g94+r047jSlbOp0Hf7BV5+NxO34OsZO30q2qU0QXyNCLKieaR3YCcJdECEWVE+EWFA9EWJB9USIBdUTIRZUT4RYUD0RYkH1VBxiCefhC9i18knaXN8KjSP9XpzPdz98S/Ty4bRV8dYJf5xpXYp5j/R+TzLriebsWhTKLyfzOGuip0mFhvXnCrGjA9aXkomKTee4Kd4gQWgU9zHEV1fefvdQGov3PcAzf/PDtSaL7z9cznab4cye+CBd7Ks5vXcj734cyQklgDc3zMD5y5d57eeSa9draPEa/xFfBO3luZc2U7cOUuvJ5DVhjPW4emOEVZEhlEeFMXRhEv3nrWNS0Vo2WQ5mTLA7muw9fPjeD1Q98gLTQnxxUS5wYNNK3tuYpsqLdIQmqIm1bfoSXP0TMye8wqtbagiZs4hFg4tYOXUSIS99SZb3OGYPd0dTdYzIGAP+A4NuXEKpbcug/s5kRO+7tVQwnmHdq8/z1LIjVF2MYtaoCYxcdvTa5ZsaWvbthd3Ojxk75m1W5HXj7WULGK3dxrTRE3l2cRKuo6cw1ttE7wwi/K77HmKlKJ6NP6aRX1pM6tZojprpOR7+E8mXrlByZj9b4y/TtmNr9NSQHL2fws596H/tYlqdVzAPtsgkYnf+bWvUjFSUlnDJUINcXU5RUQnF5devQFaoTNjOhsP5lJScJXJbIhXWuWzbmESewUBOfBTR5+zp2N72t9fNCSbtvodYvlJ+de0kgCxjVKqprLyxHzcajUg6HRqgJj2WnRc6MijYEQ06Og/siX1yDLsL6rPfV6gov3JjmbwsIytVN7VpxGgEvV4nQqxSpj0JZTxN5K48fAb2oqW5F4P6WnMo6iBFonYVbmLaIUbmzK69nGwfxMA+QfQ2TyQi3jSXjQtNx8RDDHLufiJPtOPpCb0xj4shvvzGY1WVVUgOrfBpY4+FqAX+skw+xCgF7NqZib2LQsyOlJtur6RQGh/J1uIAZi+fwhAHkeK/KhWssZNwfPRtNo06x7TxX5EiTmIItzHpM3ZScxe8PL158ilvsiO+EmfhhDsy4RBLtBg4iRVT2pO//xvmbT7XCDfEFv4MVFBOCMJ/Z/oHdoLwOxq1nOhWUki34oLGbKJRJNq3INHOqam7IfxBjRvi4gImnklvzCYaxWoQIVYRUU4IqteoI3GifQtWN2YDjSTRvkVTd0Goh8YNsZ2T2C0LjU6UE4LqiRALqidCLKieCLGgeiLEguqJEAuqJ0IsqN49zRN3D/BrqH4Iwl0TI7GgeiLEguqJEAuqJ0IsqJ4IsaB6IsSC6okQC6onQiyongixoHoixILqiRALqidCLKieCLGgeiLEgur9P7w+WrWPSpyoAAAAAElFTkSuQmCC"}}]);
+1
assets/js/2ecbbad4.30125fe5.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3396"],{64903:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>l,default:()=>m,toc:()=>h,metadata:()=>i,assets:()=>d,contentTitle:()=>a});var i=JSON.parse('{"id":"configuration/sources/youtube-music","title":"Youtube Music","description":"Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser.","source":"@site/docs/configuration/sources/youtube-music.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/youtube-music","permalink":"/multi-scrobbler/configuration/sources/youtube-music","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/youtube-music.mdx","tags":[],"version":"current","frontMatter":{"title":"Youtube Music","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Yamaha MusicCast","permalink":"/multi-scrobbler/configuration/sources/yamaha-musiccast"},"next":{"title":"Kitchen Sink","permalink":"/multi-scrobbler/configuration/kitchensink"}}'),s=n(85893),o=n(50065),r=n(703),c=n(73752);n(75752);let l={title:"Youtube Music",toc_min_heading_level:2,toc_max_heading_level:5},a=void 0,d={},h=[{value:"Authentication",id:"ytm-auth",level:4},{value:"Configuration",id:"configuration",level:2}];function u(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components},{Config:n,Details:i}=t;return n||j("Config",!0),i||j("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.admonition,{type:"warning",children:(0,s.jsxs)(t.p,{children:["Communication with YT Music is ",(0,s.jsx)(t.strong,{children:"unofficial"})," and not supported or endorsed by Google. This means that ",(0,s.jsx)(t.strong,{children:"this integration may stop working at any time"})," if Google decides to change how YT Music works in the browser."]})}),"\n",(0,s.jsxs)(t.admonition,{title:"Scrobble Troubleshooting",type:"tip",children:[(0,s.jsx)(t.p,{children:"Due to monitoring being unofficial, listening history from YTM can be inconsistent and can cause missed scrobbles."}),(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"/multi-scrobbler/FAQ#youtube-music-misses-or-duplicates-scrobbles",children:(0,s.jsx)(t.strong,{children:"See the FAQ"})})," for a detailed explanation, how to see more details about MS's detection of tracks, and how to properly report an issue."]})]}),"\n",(0,s.jsx)(t.h4,{id:"ytm-auth",children:"Authentication"}),"\n",(0,s.jsx)(t.p,{children:"Only one of these methods needs to be used."}),"\n",(0,s.jsxs)(r.default,{groupId:"ytmAuth",queryString:!0,children:[(0,s.jsxs)(c.default,{value:"cookie",label:"Cookies",children:[(0,s.jsx)(t.p,{children:"Use instructions from"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://github.com/patrickkfkan/Volumio-YouTube.js/wiki/How-to-obtain-Cookie",children:"https://github.com/patrickkfkan/Volumio-YouTube.js/wiki/How-to-obtain-Cookie"})," or"]}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers",children:"https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers"})}),"\n"]}),(0,s.jsxs)(t.p,{children:["to get the ",(0,s.jsx)(t.strong,{children:"Cookie"})," value from a browser."]}),(0,s.jsxs)(t.p,{children:["It is highly recommended to ",(0,s.jsx)(t.a,{href:"https://github.com/LuanRT/YouTube.js/issues/803#issuecomment-2504032666",children:"get the cookie from an Incognito/Private Session"})," to limit the chance the session is invalidated from normal browsing."]}),(0,s.jsxs)(t.p,{children:["Add the cookie to your ",(0,s.jsx)(t.code,{children:"ytmusic.json"})," config in ",(0,s.jsx)(t.code,{children:"data"})," or as an ENV:"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:' {\n "type": "ytmusic",\n "enable": true,\n "name": "MyYTM",\n "data": {\n "cookie": "__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......"\n },\n "options": {\n "logAuthUpdateChanges": true,\n "logDiff": true\n }\n}\n'})}),(0,s.jsx)(t.p,{children:"If MS gives you authentication errors (session invalidated) at some point in the future follow the same instructions to get new cookies."})]}),(0,s.jsxs)(c.default,{value:"oauth",label:"OAuth Client",children:[(0,s.jsxs)(t.admonition,{type:"warning",children:[(0,s.jsxs)(t.p,{children:["As of Sept 25' OAuth clients no longer seem to have permission to access the YTM service, as reported by the upstream YTM library developer and ",(0,s.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/345#issuecomment-3258518769",children:"several other users."})]}),(0,s.jsx)(t.p,{children:"If you have existing, working OAuth credentials keep using them but there is no gaurantee they will continue to work."}),(0,s.jsxs)(t.p,{children:["If you are setting up the YTM Source for the first time you should first try to use ",(0,s.jsx)(t.a,{href:"./?ytmAuth=cookie#ytm-auth",children:"Cookies"}),"."]})]}),(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"https://github.com/LuanRT/YouTube.js/issues/803#issuecomment-2479689924",children:"Based on the instructions from here..."})}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Login to ",(0,s.jsx)(t.a,{href:"https://console.cloud.google.com/",children:"Google Cloud console"})," (create an account, if necessary)","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://console.cloud.google.com/projectcreate",children:"Create a new project"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Go to APIs and services.","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Configure the OAuth consent screen","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Use the old experience if possible"}),"\n",(0,s.jsx)(t.li,{children:"If new is unavoidable then do not fill out any branding and under Authorized Domains you can delete the empty one (in order to save)"}),"\n",(0,s.jsx)(t.li,{children:"Add yourself as an authorized user"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Navigate to Credentials","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:['Create Credentials -> choose "OAuth client ID"',"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Application Type is ",(0,s.jsx)(t.strong,{children:"Web Application"})]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Name"})," is whatever you want, leave Authorization Javascript origins blank"]}),"\n",(0,s.jsxs)(t.li,{children:["Authorized redirect URIs","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["This must be ",(0,s.jsx)(t.strong,{children:"exactly"})," the same as what is displayed in MS! For now leave it blank so we can generate it from MS first"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Create","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["In the newly created client popup save the ",(0,s.jsx)(t.strong,{children:"Client ID"})," and ",(0,s.jsx)(t.strong,{children:"Client Secret"}),", then copy them into ",(0,s.jsx)(t.code,{children:"ytmusic.json"})," or appropriate ENVs:"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\n "type": "ytmusic",\n "enable": true,\n "name": "MyYTM",\n "data": {\n "clientId": "8910....6jqupl.apps.googleusercontent.com",\n "clientSecret": "GOCSPX-WGXL6BSuQ343..."\n },\n "options": {\n "logAuthUpdateChanges": true,\n "logDiff": true\n }\n}\n'})}),(0,s.jsx)(t.p,{children:"Now, start MS and during the YTMusic startup it will log something like this:"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"Will use custom OAuth Client:\nClient ID: ...\nClient Secret: ...\nRedirect URI: http://localhost:9078/api/ytmusic/callback?name=MyYTM\n"})}),(0,s.jsxs)(t.p,{children:["If the beginning of the Redirect URI (before ",(0,s.jsx)(t.code,{children:"api"}),") is EXACTLY how you would reach the MS dashboard from your browser (EX ",(0,s.jsx)(t.code,{children:"http://localhost:9078"}),") then edit your google oauth client section for ",(0,s.jsx)(t.code,{children:"Authorized redirect URIs"})," and add the URL MS has displayed."]}),(0,s.jsxs)(t.p,{children:["If it is NOT EXACTLY the same you either need to set MS's ",(0,s.jsx)(t.a,{href:"/configuration#base-url",children:"base url"})," or you can provide your own (Custom) Redirect URI for MS to use by setting it in ",(0,s.jsx)(t.code,{children:"ytmusic.json"})," or ENV."]}),(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:"Using a Custom Redirect URI"}),(0,s.jsx)(t.p,{children:"The three parts of the URL that must be the same:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["it must start with ",(0,s.jsx)(t.code,{children:"api"})," (after domain or subdirectory IE ",(0,s.jsx)(t.code,{children:"my.domain.tld/api..."})," or ",(0,s.jsx)(t.code,{children:"whatever.tld/subDir/api..."})]}),"\n",(0,s.jsxs)(t.li,{children:["it must end in ",(0,s.jsx)(t.code,{children:"ytmusic/callback"})]}),"\n",(0,s.jsxs)(t.li,{children:["It must include ",(0,s.jsx)(t.code,{children:"name=[NameOfSource]"})," in the query string"]}),"\n"]}),(0,s.jsxs)(t.p,{children:["Remember to add your custom URL to the ",(0,s.jsx)(t.code,{children:"Authorized redirect URIs"})," section in the google oauth client!"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\n "type": "ytmusic",\n "enable": true,\n "name": "MyYTM",\n "data": {\n "clientId": "8910....6jqupl.apps.googleusercontent.com",\n "clientSecret": "GOCSPX-WGXL6BSuQ343...",\n "redirectUri": "http://my.custom.domain/api/ytmusic/callback?name=MyYTM"\n },\n "options": {\n "logAuthUpdateChanges": true,\n "logDiff": true\n }\n}\n'})})]}),(0,s.jsxs)(t.p,{children:["AFTER changing the Authorized redirect URIs on Google Cloud console you may need to wait a few minutes for it to take affect. Then restart MS. From the dashboard click ",(0,s.jsx)(t.code,{children:"(Re)authenticate"})," on the YTmusic source card and follow the auth flow:"]}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:['On the screen about "testing" make sure you hit ',(0,s.jsx)(t.strong,{children:"Continue"})," (not Back To Safety)"]}),"\n",(0,s.jsxs)(t.li,{children:["Make sure to select ALL scopes/permissions/grants it asks you about","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Select what [YourAppName] can access"})," -> Select all"]}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsxs)(t.p,{children:["Once the flow is finished MS will get the credentials and start polling automatically. You should not need to re-authenticate again after restarting MS as it saves the credentials to the ",(0,s.jsx)(t.code,{children:"/config"})," folder."]})]}),(0,s.jsxs)(c.default,{value:"ytt",label:"YoutubeTV",children:[(0,s.jsx)(t.admonition,{type:"warning",children:(0,s.jsxs)(t.p,{children:["Using the built-in YoutubeTV authentication is unlikely to work due to ",(0,s.jsx)(t.a,{href:"https://github.com/yt-dlp/yt-dlp/issues/11462#issuecomment-2471703090",children:"Google restricting what permissions TV clients can have"}),". This authentication method should not be used."]})}),(0,s.jsx)(t.p,{children:"To authenticate start multi-scrobbler with an empty YT Music configuration. An authentication URL/code will be logged in additon to being available from the dashboard."}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"ERROR: Sign in with the code 'CLV-KFA-BVKY' using the authentication link on the dashboard or https://www.google.com/device\n"})}),(0,s.jsxs)(t.p,{children:["Visit the authentication URL and enter the code that was provided (also available on the dashboard). After completing the setup flow MS will log ",(0,s.jsx)(t.code,{children:"Auth success"})," and the YT Music dashboard card will display as ",(0,s.jsx)(t.strong,{children:"Idle"})," after refreshing. Click the ",(0,s.jsx)(t.strong,{children:"Start"})," link to begin monitoring."]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(n,{config:"YTMusicSourceConfig",fileContent:'[\n {\n "name": "MyYTMusic",\n "enable": true,\n "clients": [],\n "data": {\n "cookie": "__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......",\n // either cookie or id/secret needs to be provided\n "clientId": "891098404....apps.googleusercontent.com",\n "clientSecret": "GOCS..."\n\n // optional\n //"redirectUri": "http://my.custom.tld/api/ytmusic/callback?name=MyYTMusic"\n },\n "options": {\n "logDiff": true\n }\n }\n]\n',name:"ytmusic",children:(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Environmental Variable"}),(0,s.jsx)(t.th,{children:"Required?"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_COOKIE"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Value for Cookie Authentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_CLIENT_ID"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Client ID for OAuth Athentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_CLIENT_SECRET"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Client Secret for OAuth Athentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_REDIRECT_URI"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"A custom redirect URI for OAuth Athentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_LOG_DIFF"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{children:"false"}),(0,s.jsx)(t.td,{children:"Log YTM history changes"})]})]})]})})]})}function m(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}function j(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
-1
assets/js/2ecbbad4.ead83d98.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3396"],{64903:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>l,default:()=>m,toc:()=>h,metadata:()=>i,assets:()=>d,contentTitle:()=>a});var i=JSON.parse('{"id":"configuration/sources/youtube-music","title":"Youtube Music","description":"Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser.","source":"@site/docs/configuration/sources/youtube-music.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/youtube-music","permalink":"/multi-scrobbler/configuration/sources/youtube-music","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/youtube-music.mdx","tags":[],"version":"current","frontMatter":{"title":"Youtube Music","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Yamaha MusicCast","permalink":"/multi-scrobbler/configuration/sources/yamaha-musiccast"},"next":{"title":"Kitchen Sink","permalink":"/multi-scrobbler/configuration/kitchensink"}}'),s=n(85893),o=n(50065),r=n(703),c=n(73752);n(75752);let l={title:"Youtube Music",toc_min_heading_level:2,toc_max_heading_level:5},a=void 0,d={},h=[{value:"Authentication",id:"ytm-auth",level:4},{value:"Configuration",id:"configuration",level:2}];function u(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components},{Config:n,Details:i}=t;return n||j("Config",!0),i||j("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.admonition,{type:"warning",children:(0,s.jsxs)(t.p,{children:["Communication with YT Music is ",(0,s.jsx)(t.strong,{children:"unofficial"})," and not supported or endorsed by Google. This means that ",(0,s.jsx)(t.strong,{children:"this integration may stop working at any time"})," if Google decides to change how YT Music works in the browser."]})}),"\n",(0,s.jsxs)(t.admonition,{title:"Scrobble Troubleshooting",type:"tip",children:[(0,s.jsx)(t.p,{children:"Due to monitoring being unofficial, listening history from YTM can be inconsistent and can cause missed scrobbles."}),(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"/multi-scrobbler/FAQ#youtube-music-misses-or-duplicates-scrobbles",children:(0,s.jsx)(t.strong,{children:"See the FAQ"})})," for a detailed explanation, how to see more details about MS's detection of tracks, and how to properly report an issue."]})]}),"\n",(0,s.jsx)(t.h4,{id:"ytm-auth",children:"Authentication"}),"\n",(0,s.jsx)(t.p,{children:"Only one of these methods needs to be used."}),"\n",(0,s.jsxs)(r.default,{groupId:"ytmAuth",queryString:!0,children:[(0,s.jsxs)(c.default,{value:"cookie",label:"Cookies",children:[(0,s.jsx)(t.p,{children:"Use instructions from"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://github.com/patrickkfkan/Volumio-YouTube.js/wiki/How-to-obtain-Cookie",children:"https://github.com/patrickkfkan/Volumio-YouTube.js/wiki/How-to-obtain-Cookie"})," or"]}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers",children:"https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers"})}),"\n"]}),(0,s.jsxs)(t.p,{children:["to get the ",(0,s.jsx)(t.strong,{children:"Cookie"})," value from a browser."]}),(0,s.jsxs)(t.p,{children:["It is highly recommended to ",(0,s.jsx)(t.a,{href:"https://github.com/LuanRT/YouTube.js/issues/803#issuecomment-2504032666",children:"get the cookie from an Incognito/Private Session"})," to limit the chance the session is invalidated from normal browsing."]}),(0,s.jsxs)(t.p,{children:["Add the cookie to your ",(0,s.jsx)(t.code,{children:"ytmusic.json"})," config in ",(0,s.jsx)(t.code,{children:"data"})," or as an ENV:"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:' {\n "type": "ytmusic",\n "enable": true,\n "name": "MyYTM",\n "data": {\n "cookie": "__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......"\n },\n "options": {\n "logAuthUpdateChanges": true,\n "logDiff": true\n }\n}\n'})}),(0,s.jsx)(t.p,{children:"If MS gives you authentication errors (session invalidated) at some point in the future follow the same instructions to get new cookies."})]}),(0,s.jsxs)(c.default,{value:"oauth",label:"OAuth Client",children:[(0,s.jsxs)(t.admonition,{type:"warning",children:[(0,s.jsxs)(t.p,{children:["As of Sept 25' OAuth clients no longer seem to have permission to access the YTM service, as reported by the upstream YTM library developer and ",(0,s.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/345#issuecomment-3258518769",children:"several other users."})]}),(0,s.jsx)(t.p,{children:"If you have existing, working OAuth credentials keep using them but there is no gaurantee they will continue to work."}),(0,s.jsxs)(t.p,{children:["If you are setting up the YTM Source for the first time you should first try to use ",(0,s.jsx)(t.a,{href:"./?ytmAuth=cookie#ytm-auth",children:"Cookies"}),"."]})]}),(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"https://github.com/LuanRT/YouTube.js/issues/803#issuecomment-2479689924",children:"Based on the instructions from here..."})}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Login to ",(0,s.jsx)(t.a,{href:"https://console.cloud.google.com/",children:"Google Cloud console"})," (create an account, if necessary)","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://console.cloud.google.com/projectcreate",children:"Create a new project"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Go to APIs and services.","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Configure the OAuth consent screen","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Use the old experience if possible"}),"\n",(0,s.jsx)(t.li,{children:"If new is unavoidable then do not fill out any branding and under Authorized Domains you can delete the empty one (in order to save)"}),"\n",(0,s.jsx)(t.li,{children:"Add yourself as an authorized user"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Navigate to Credentials","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:['Create Credentials -> choose "OAuth client ID"',"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Application Type is ",(0,s.jsx)(t.strong,{children:"Web Application"})]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Name"})," is whatever you want, leave Authorization Javascript origins blank"]}),"\n",(0,s.jsxs)(t.li,{children:["Authorized redirect URIs","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["This must be ",(0,s.jsx)(t.strong,{children:"exactly"})," the same as what is displayed in MS! For now leave it blank so we can generate it from MS first"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Create","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["In the newly created client popup save the ",(0,s.jsx)(t.strong,{children:"Client ID"})," and ",(0,s.jsx)(t.strong,{children:"Client Secret"}),", then copy them into ",(0,s.jsx)(t.code,{children:"ytmusic.json"})," or appropriate ENVs:"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\n "type": "ytmusic",\n "enable": true,\n "name": "MyYTM",\n "data": {\n "clientId": "8910....6jqupl.apps.googleusercontent.com",\n "clientSecret": "GOCSPX-WGXL6BSuQ343..."\n },\n "options": {\n "logAuthUpdateChanges": true,\n "logDiff": true\n }\n}\n'})}),(0,s.jsx)(t.p,{children:"Now, start MS and during the YTMusic startup it will log something like this:"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"Will use custom OAuth Client:\nClient ID: ...\nClient Secret: ...\nRedirect URI: http://localhost:9078/api/ytmusic/callback?name=MyYTM\n"})}),(0,s.jsxs)(t.p,{children:["If the beginning of the Redirect URI (before ",(0,s.jsx)(t.code,{children:"api"}),") is EXACTLY how you would reach the MS dashboard from your browser (EX ",(0,s.jsx)(t.code,{children:"http://localhost:9078"}),") then edit your google oauth client section for ",(0,s.jsx)(t.code,{children:"Authorized redirect URIs"})," and add the URL MS has displayed."]}),(0,s.jsxs)(t.p,{children:["If it is NOT EXACTLY the same you either need to set MS's ",(0,s.jsx)(t.a,{href:"https://foxxmd.github.io/multi-scrobbler/docs/configuration/#base-url",children:"base url"})," or you can provide your own (Custom) Redirect URI for MS to use by setting it in ",(0,s.jsx)(t.code,{children:"ytmusic.json"})," or ENV."]}),(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:"Using a Custom Redirect URI"}),(0,s.jsx)(t.p,{children:"The three parts of the URL that must be the same:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["it must start with ",(0,s.jsx)(t.code,{children:"api"})," (after domain or subdirectory IE ",(0,s.jsx)(t.code,{children:"my.domain.tld/api..."})," or ",(0,s.jsx)(t.code,{children:"whatever.tld/subDir/api..."})]}),"\n",(0,s.jsxs)(t.li,{children:["it must end in ",(0,s.jsx)(t.code,{children:"ytmusic/callback"})]}),"\n",(0,s.jsxs)(t.li,{children:["It must include ",(0,s.jsx)(t.code,{children:"name=[NameOfSource]"})," in the query string"]}),"\n"]}),(0,s.jsxs)(t.p,{children:["Remember to add your custom URL to the ",(0,s.jsx)(t.code,{children:"Authorized redirect URIs"})," section in the google oauth client!"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\n "type": "ytmusic",\n "enable": true,\n "name": "MyYTM",\n "data": {\n "clientId": "8910....6jqupl.apps.googleusercontent.com",\n "clientSecret": "GOCSPX-WGXL6BSuQ343...",\n "redirectUri": "http://my.custom.domain/api/ytmusic/callback?name=MyYTM"\n },\n "options": {\n "logAuthUpdateChanges": true,\n "logDiff": true\n }\n}\n'})})]}),(0,s.jsxs)(t.p,{children:["AFTER changing the Authorized redirect URIs on Google Cloud console you may need to wait a few minutes for it to take affect. Then restart MS. From the dashboard click ",(0,s.jsx)(t.code,{children:"(Re)authenticate"})," on the YTmusic source card and follow the auth flow:"]}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:['On the screen about "testing" make sure you hit ',(0,s.jsx)(t.strong,{children:"Continue"})," (not Back To Safety)"]}),"\n",(0,s.jsxs)(t.li,{children:["Make sure to select ALL scopes/permissions/grants it asks you about","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Select what [YourAppName] can access"})," -> Select all"]}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsxs)(t.p,{children:["Once the flow is finished MS will get the credentials and start polling automatically. You should not need to re-authenticate again after restarting MS as it saves the credentials to the ",(0,s.jsx)(t.code,{children:"/config"})," folder."]})]}),(0,s.jsxs)(c.default,{value:"ytt",label:"YoutubeTV",children:[(0,s.jsx)(t.admonition,{type:"warning",children:(0,s.jsxs)(t.p,{children:["Using the built-in YoutubeTV authentication is unlikely to work due to ",(0,s.jsx)(t.a,{href:"https://github.com/yt-dlp/yt-dlp/issues/11462#issuecomment-2471703090",children:"Google restricting what permissions TV clients can have"}),". This authentication method should not be used."]})}),(0,s.jsx)(t.p,{children:"To authenticate start multi-scrobbler with an empty YT Music configuration. An authentication URL/code will be logged in additon to being available from the dashboard."}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"ERROR: Sign in with the code 'CLV-KFA-BVKY' using the authentication link on the dashboard or https://www.google.com/device\n"})}),(0,s.jsxs)(t.p,{children:["Visit the authentication URL and enter the code that was provided (also available on the dashboard). After completing the setup flow MS will log ",(0,s.jsx)(t.code,{children:"Auth success"})," and the YT Music dashboard card will display as ",(0,s.jsx)(t.strong,{children:"Idle"})," after refreshing. Click the ",(0,s.jsx)(t.strong,{children:"Start"})," link to begin monitoring."]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(n,{config:"YTMusicSourceConfig",fileContent:'[\n {\n "name": "MyYTMusic",\n "enable": true,\n "clients": [],\n "data": {\n "cookie": "__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......",\n // either cookie or id/secret needs to be provided\n "clientId": "891098404....apps.googleusercontent.com",\n "clientSecret": "GOCS..."\n\n // optional\n //"redirectUri": "http://my.custom.tld/api/ytmusic/callback?name=MyYTMusic"\n },\n "options": {\n "logDiff": true\n }\n }\n]\n',name:"ytmusic",children:(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Environmental Variable"}),(0,s.jsx)(t.th,{children:"Required?"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_COOKIE"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Value for Cookie Authentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_CLIENT_ID"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Client ID for OAuth Athentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_CLIENT_SECRET"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Client Secret for OAuth Athentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_REDIRECT_URI"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"A custom redirect URI for OAuth Athentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"YTM_LOG_DIFF"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{children:"false"}),(0,s.jsx)(t.td,{children:"Log YTM history changes"})]})]})]})})]})}function m(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}function j(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
-1
assets/js/3827a595.5e80120c.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["5291"],{32134:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>r,default:()=>u,toc:()=>c,metadata:()=>s,assets:()=>a,contentTitle:()=>l});var s=JSON.parse('{"id":"configuration/sources/lastfm-endpoint","title":"Lastfm (Endpoint)","description":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server.","source":"@site/docs/configuration/sources/lastfm-endpoint.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/lastfm-endpoint","permalink":"/multi-scrobbler/configuration/sources/lastfm-endpoint","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/lastfm-endpoint.mdx","tags":[],"version":"current","frontMatter":{"title":"Lastfm (Endpoint)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Koito","permalink":"/multi-scrobbler/configuration/sources/koito-source"},"next":{"title":"Lastfm","permalink":"/multi-scrobbler/configuration/sources/lastfm-source"}}'),i=n(85893),o=n(50065);n(703),n(73752),n(75752);let r={title:"Lastfm (Endpoint)",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,a={},c=[{value:"URL",id:"url",level:3},{value:"Configuration",id:"configuration",level:2}];function d(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components},{Config:n}=t;return n||function(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server."}),"\n",(0,i.jsx)(t.admonition,{title:"Other Uses",type:"tip",children:(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["To ",(0,i.jsx)(t.strong,{children:"scrobble to"})," Last.fm, create a ",(0,i.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})]}),"\n",(0,i.jsxs)(t.li,{children:["To monitor and re-scrobble activity from your Last.fm account, create a ",(0,i.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})]}),"\n"]})}),"\n",(0,i.jsx)(t.h3,{id:"url",children:"URL"}),"\n",(0,i.jsxs)(t.p,{children:["If a ",(0,i.jsx)(t.strong,{children:"slug"})," is ",(0,i.jsx)(t.strong,{children:"not"})," provided in configuration then multi-scrobbler will accept Last.fm scrobbles at"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"http://localhost:9078/2.0/\n"})}),"\n",(0,i.jsx)(t.p,{children:'which is the "standard" Last.fm server path for scrobbling'}),"\n",(0,i.jsx)(t.p,{children:"Use a slug only if you need to setup multiple Last.fm Endpoint sources and cannot use different tokens."}),"\n",(0,i.jsx)(t.p,{children:"If a slug is used then the URL will be:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"http://localhost:9078/api/lastfm/mySlug\n"})}),"\n",(0,i.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n,{config:"LastFMEndpointSourceConfig",fileContent:'[\n {\n "name": "myLfm",\n "enable": true,\n "data": {\n "slug": "mySlug"\n }\n }\n]\n',name:"endpointlfm",children:(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,i.jsx)(t.th,{style:{textAlign:"left"},children:"Required?"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.code,{children:"LFMENDPOINT_ENABLE"})}),(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"No"}),(0,i.jsx)(t.td,{}),(0,i.jsx)(t.td,{children:"Use LFM Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.code,{children:"LFM_SLUG"})}),(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"No"}),(0,i.jsx)(t.td,{}),(0,i.jsx)(t.td,{children:"(Optional) The URL suffix to use for accepting LFM scrobbles"})]})]})]})})]})}function u(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]);
+1
assets/js/3827a595.d60e8b5d.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["5291"],{32134:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>r,default:()=>u,toc:()=>c,metadata:()=>s,assets:()=>a,contentTitle:()=>l});var s=JSON.parse('{"id":"configuration/sources/lastfm-endpoint","title":"Lastfm (Endpoint)","description":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server.","source":"@site/docs/configuration/sources/lastfm-endpoint.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/lastfm-endpoint","permalink":"/multi-scrobbler/configuration/sources/lastfm-endpoint","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/lastfm-endpoint.mdx","tags":[],"version":"current","frontMatter":{"title":"Lastfm (Endpoint)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Koito","permalink":"/multi-scrobbler/configuration/sources/koito-source"},"next":{"title":"Last.fm","permalink":"/multi-scrobbler/configuration/sources/lastfm-source"}}'),i=n(85893),o=n(50065);n(703),n(73752),n(75752);let r={title:"Lastfm (Endpoint)",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,a={},c=[{value:"URL",id:"url",level:3},{value:"Configuration",id:"configuration",level:2}];function d(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components},{Config:n}=t;return n||function(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server."}),"\n",(0,i.jsx)(t.admonition,{title:"Other Uses",type:"tip",children:(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["To ",(0,i.jsx)(t.strong,{children:"scrobble to"})," Last.fm, create a ",(0,i.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})]}),"\n",(0,i.jsxs)(t.li,{children:["To monitor and re-scrobble activity from your Last.fm account, create a ",(0,i.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})]}),"\n"]})}),"\n",(0,i.jsx)(t.h3,{id:"url",children:"URL"}),"\n",(0,i.jsxs)(t.p,{children:["If a ",(0,i.jsx)(t.strong,{children:"slug"})," is ",(0,i.jsx)(t.strong,{children:"not"})," provided in configuration then multi-scrobbler will accept Last.fm scrobbles at"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"http://localhost:9078/2.0/\n"})}),"\n",(0,i.jsx)(t.p,{children:'which is the "standard" Last.fm server path for scrobbling'}),"\n",(0,i.jsx)(t.p,{children:"Use a slug only if you need to setup multiple Last.fm Endpoint sources and cannot use different tokens."}),"\n",(0,i.jsx)(t.p,{children:"If a slug is used then the URL will be:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"http://localhost:9078/api/lastfm/mySlug\n"})}),"\n",(0,i.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n,{config:"LastFMEndpointSourceConfig",fileContent:'[\n {\n "name": "myLfm",\n "enable": true,\n "data": {\n "slug": "mySlug"\n }\n }\n]\n',name:"endpointlfm",children:(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,i.jsx)(t.th,{style:{textAlign:"left"},children:"Required?"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Description"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.code,{children:"LFMENDPOINT_ENABLE"})}),(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"No"}),(0,i.jsx)(t.td,{}),(0,i.jsx)(t.td,{children:"Use LFM Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{style:{textAlign:"left"},children:(0,i.jsx)(t.code,{children:"LFM_SLUG"})}),(0,i.jsx)(t.td,{style:{textAlign:"left"},children:"No"}),(0,i.jsx)(t.td,{}),(0,i.jsx)(t.td,{children:"(Optional) The URL suffix to use for accepting LFM scrobbles"})]})]})]})})]})}function u(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]);
-1
assets/js/41cd626a.29bc7212.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["4854"],{87896:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>o,default:()=>h,toc:()=>c,metadata:()=>i,assets:()=>a,contentTitle:()=>l});var i=JSON.parse('{"id":"configuration/sources/vlc","title":"VLC","description":"MS communicates with VLC using the Web (http) interface module","source":"@site/docs/configuration/sources/vlc.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/vlc","permalink":"/multi-scrobbler/configuration/sources/vlc","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/vlc.mdx","tags":[],"version":"current","frontMatter":{"title":"VLC","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/sources/tealfm-source"},"next":{"title":"Webscrobbler","permalink":"/multi-scrobbler/configuration/sources/webscrobbler"}}'),r=t(85893),s=t(50065);t(703),t(73752),t(75752);let o={title:"VLC",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,a={},c=[{value:"Enable HTTP Interface",id:"enable-http-interface",level:4},{value:"Setting VLC Interface and Port",id:"setting-vlc-interface-and-port",level:5},{value:"Filename Parsing",id:"filename-parsing",level:4},{value:"Vlc Information Reporting",id:"vlc-information-reporting",level:4},{value:"Configuration",id:"configuration",level:2}];function d(e){let n={a:"a",code:"code",em:"em",h2:"h2",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Config:t}=n;return t||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["MS communicates with ",(0,r.jsx)(n.a,{href:"https://www.videolan.org/vlc/",children:"VLC"})," using the ",(0,r.jsxs)(n.a,{href:"https://wiki.videolan.org/VLC_HTTP_requests/",children:["Web (",(0,r.jsx)(n.code,{children:"http"}),") interface module"]})]}),"\n",(0,r.jsx)(n.h4,{id:"enable-http-interface",children:"Enable HTTP Interface"}),"\n",(0,r.jsx)(n.p,{children:"Open VLC:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Tools"})," Menu -> Preferences","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["In the bottom left change ",(0,r.jsx)(n.strong,{children:"Show Settings"})," from ",(0,r.jsx)(n.code,{children:"Simple"})," to ",(0,r.jsx)(n.code,{children:"All"})]}),"\n",(0,r.jsxs)(n.li,{children:["In the updated window select ",(0,r.jsx)(n.code,{children:"Interface -> Main interfaces"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["In the ",(0,r.jsx)(n.strong,{children:"Extra interface modules"})," section enable ",(0,r.jsx)(n.strong,{children:"Web"})," and verify that ",(0,r.jsx)(n.code,{children:"http"})," is shown in the textbox"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Select ",(0,r.jsx)(n.code,{children:"Interface -> Main interfaces -> Lua"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"In Lua HTTP -> Password -> set a password in this box"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save"})," at the bottom to persist your changes"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:"Restart VLC"}),"\n",(0,r.jsxs)(n.li,{children:["Verify the HTTP interface is accessible by navigating to ",(0,r.jsx)(n.code,{children:"http://localhost:8080"})," in your browser"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If the interface is accessible, after typing in your password, VLC is now ready to be used by MS."}),"\n",(0,r.jsx)(n.h5,{id:"setting-vlc-interface-and-port",children:"Setting VLC Interface and Port"}),"\n",(0,r.jsx)(n.p,{children:"These can be set by starting VLC from command line with specific options:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"vlc --http-host yourHostIp:yourPort"})," or"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"vlc --http-port yourPort"})," or"]}),"\n",(0,r.jsxs)(n.li,{children:["modify the configuration file for VLC by editing keys with the same values as from the command line (",(0,r.jsx)(n.code,{children:"http-host"})," and ",(0,r.jsx)(n.code,{children:"http-port"}),")"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"filename-parsing",children:"Filename Parsing"}),"\n",(0,r.jsxs)(n.p,{children:["If the file being played in VLC does not have ID3 tags/metadata information multi-scrobbler can attempt to extract artist, title, and album information from the raw filename using regular expressions. Mutli-scrobbler will only do this if there is ",(0,r.jsx)(n.strong,{children:"no other information"})," reported by VLC about these fields."]}),"\n",(0,r.jsxs)(n.p,{children:["To extract this information use ",(0,r.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Named_capturing_group",children:"named capture groups"})," in your expression matching the field that should be extracted: ",(0,r.jsx)(n.code,{children:"artist"})," ",(0,r.jsx)(n.code,{children:"title"})," and/or ",(0,r.jsx)(n.code,{children:"album"}),". MS accepts multiple expressions, the first one that matches a filename will be used."]}),"\n",(0,r.jsxs)(n.p,{children:["Example usage in ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"a file-based config:"})]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config/vlc.json" {10-15}',children:'[\n {\n "name": "MyVlc",\n "enable": true,\n "data": {\n // ...\n },\n "options": {\n "filenamePatterns": [\n // Extracts artist and title from filenames that look like:\n // My Artist - My Cool title.mp4\n "/^\\\\s*(?<artist>.+?) - (?<title>.+?)\\\\.\\\\w+$/i"\n ],\n // logs to DEBUG when MS tries to extract data from a filename\n "logFilenamePatterns": true,\n }\n }\n]\n'})}),"\n",(0,r.jsx)(n.h4,{id:"vlc-information-reporting",children:"Vlc Information Reporting"}),"\n",(0,r.jsxs)(n.p,{children:["If you find that VLC is incorrectly reporting track information (in its interface) but multi-scrobbler is not parsing it correctly it may be due to the ",(0,r.jsx)(n.em,{children:"name"})," of the fields VLC is reporting. mutli-scrobbler uses the most common field name but does not cover all use cases. Before reporting an issue please turn on metadata logging and include output from your logs while it is turned on:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config/vlc.json" {9-9}',children:' [\n {\n "name": "MyVlc",\n "enable": true,\n "data": {\n // ...\n },\n "options": {\n "dumpVlcMetadata": true\n }\n }\n ]\n'})}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(t,{config:"VLCSourceConfig",fileContent:'[\n {\n "enable": true,\n "name": "MyVlc",\n "data": {\n "url": "localhost:8080",\n "password": "changeme"\n }\n }\n]\n',name:"vlc",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"VLC_URL"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"localhost:8080"})}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"VLC_PASSWORD"})}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]})]})]})})]})}function h(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]);
+1
assets/js/41cd626a.af102e25.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["4854"],{87896:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>l,default:()=>h,toc:()=>c,metadata:()=>i,assets:()=>a,contentTitle:()=>o});var i=JSON.parse('{"id":"configuration/sources/vlc","title":"VLC","description":"MS communicates with VLC using the Web (http) interface module","source":"@site/docs/configuration/sources/vlc.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/vlc","permalink":"/multi-scrobbler/configuration/sources/vlc","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/vlc.mdx","tags":[],"version":"current","frontMatter":{"title":"VLC","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/sources/tealfm-source"},"next":{"title":"Webscrobbler","permalink":"/multi-scrobbler/configuration/sources/webscrobbler"}}'),r=t(85893),s=t(50065);t(703),t(73752),t(75752);let l={title:"VLC",toc_min_heading_level:2,toc_max_heading_level:5},o=void 0,a={},c=[{value:"Enable HTTP Interface",id:"enable-http-interface",level:4},{value:"Setting VLC Interface and Port",id:"setting-vlc-interface-and-port",level:5},{value:"Filename Parsing",id:"filename-parsing",level:4},{value:"Vlc Information Reporting",id:"vlc-information-reporting",level:4},{value:"Configuration",id:"configuration",level:2}];function d(e){let n={a:"a",code:"code",em:"em",h2:"h2",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Config:t,Details:i}=n;return t||u("Config",!0),i||u("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["MS communicates with ",(0,r.jsx)(n.a,{href:"https://www.videolan.org/vlc/",children:"VLC"})," using the ",(0,r.jsxs)(n.a,{href:"https://wiki.videolan.org/VLC_HTTP_requests/",children:["Web (",(0,r.jsx)(n.code,{children:"http"}),") interface module"]})]}),"\n",(0,r.jsx)(n.h4,{id:"enable-http-interface",children:"Enable HTTP Interface"}),"\n",(0,r.jsx)(n.p,{children:"Open VLC:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Tools"})," Menu -> Preferences","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["In the bottom left change ",(0,r.jsx)(n.strong,{children:"Show Settings"})," from ",(0,r.jsx)(n.code,{children:"Simple"})," to ",(0,r.jsx)(n.code,{children:"All"})]}),"\n",(0,r.jsxs)(n.li,{children:["In the updated window select ",(0,r.jsx)(n.code,{children:"Interface -> Main interfaces"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["In the ",(0,r.jsx)(n.strong,{children:"Extra interface modules"})," section enable ",(0,r.jsx)(n.strong,{children:"Web"})," and verify that ",(0,r.jsx)(n.code,{children:"http"})," is shown in the textbox"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Select ",(0,r.jsx)(n.code,{children:"Interface -> Main interfaces -> Lua"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"In Lua HTTP -> Password -> set a password in this box"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save"})," at the bottom to persist your changes"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:"Restart VLC"}),"\n",(0,r.jsxs)(n.li,{children:["Verify the HTTP interface is accessible by navigating to ",(0,r.jsx)(n.code,{children:"http://localhost:8080"})," in your browser"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If the interface is accessible, after typing in your password, VLC is now ready to be used by MS."}),"\n",(0,r.jsx)(n.h5,{id:"setting-vlc-interface-and-port",children:"Setting VLC Interface and Port"}),"\n",(0,r.jsx)(n.p,{children:"These can be set by starting VLC from command line with specific options:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"vlc --http-host yourHostIp:yourPort"})," or"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"vlc --http-port yourPort"})," or"]}),"\n",(0,r.jsxs)(n.li,{children:["modify the configuration file for VLC by editing keys with the same values as from the command line (",(0,r.jsx)(n.code,{children:"http-host"})," and ",(0,r.jsx)(n.code,{children:"http-port"}),")"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"filename-parsing",children:"Filename Parsing"}),"\n",(0,r.jsxs)(n.p,{children:["If the file being played in VLC does not have ID3 tags/metadata information multi-scrobbler can attempt to extract artist, title, and album information from the raw filename using regular expressions. Mutli-scrobbler will only do this if there is ",(0,r.jsx)(n.strong,{children:"no other information"})," reported by VLC about these fields."]}),"\n",(0,r.jsxs)(n.p,{children:["To extract this information use ",(0,r.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Named_capturing_group",children:"named capture groups"})," in your expression matching the field that should be extracted: ",(0,r.jsx)(n.code,{children:"artist"})," ",(0,r.jsx)(n.code,{children:"title"})," and/or ",(0,r.jsx)(n.code,{children:"album"}),". MS accepts multiple expressions, the first one that matches a filename will be used."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Example usage in ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"a file-based config:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config/vlc.json" {10-15}',children:'[\n {\n "name": "MyVlc",\n "enable": true,\n "data": {\n // ...\n },\n "options": {\n "filenamePatterns": [\n // Extracts artist and title from filenames that look like:\n // My Artist - My Cool title.mp4\n "/^\\\\s*(?<artist>.+?) - (?<title>.+?)\\\\.\\\\w+$/i"\n ],\n // logs to DEBUG when MS tries to extract data from a filename\n "logFilenamePatterns": true,\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h4,{id:"vlc-information-reporting",children:"Vlc Information Reporting"}),"\n",(0,r.jsxs)(n.p,{children:["If you find that VLC is incorrectly reporting track information (in its interface) but multi-scrobbler is not parsing it correctly it may be due to the ",(0,r.jsx)(n.em,{children:"name"})," of the fields VLC is reporting. mutli-scrobbler uses the most common field name but does not cover all use cases. Before reporting an issue please turn on metadata logging and include output from your logs while it is turned on:"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Metadata Logging Configuration"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config/vlc.json" {9-9}',children:' [\n {\n "name": "MyVlc",\n "enable": true,\n "data": {\n // ...\n },\n "options": {\n "dumpVlcMetadata": true\n }\n }\n ]\n'})})]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(t,{config:"VLCSourceConfig",fileContent:'[\n {\n "enable": true,\n "name": "MyVlc",\n "data": {\n "url": "localhost:8080",\n "password": "changeme"\n }\n }\n]\n',name:"vlc",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"VLC_URL"})}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"localhost:8080"})}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"VLC_PASSWORD"})}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]})]})]})})]})}function h(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}function u(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+1
assets/js/4edc808e.4b36b05e.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8005"],{38741:function(e,i,n){n.r(i),n.d(i,{frontMatter:()=>t,default:()=>d,toc:()=>a,metadata:()=>s,assets:()=>c,contentTitle:()=>l});var s=JSON.parse('{"id":"index","title":"Overview","description":"Latest Release","source":"@site/docs/index.mdx","sourceDirName":".","slug":"/","permalink":"/multi-scrobbler/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/index.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","title":"Overview","sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Quickstart","permalink":"/multi-scrobbler/quickstart"}}'),r=n(85893),o=n(50065);let t={slug:"/",title:"Overview",sidebar_position:1},l=void 0,c={},a=[{value:"How Does multi-scrobbler (MS) Work?",id:"how-does-multi-scrobbler-ms-work",level:2},{value:"Source",id:"source",level:3},{value:"Client",id:"client",level:3},{value:"Quick Start",id:"quick-start",level:2},{value:"Installation",id:"installation",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Usage",id:"usage",level:2},{value:"Help/FAQ",id:"helpfaq",level:2},{value:"Development",id:"development",level:2},{value:"License",id:"license",level:2}];function h(e){let i={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.img,{src:"https://img.shields.io/github/v/release/foxxmd/multi-scrobbler",alt:"Latest Release"}),"\n",(0,r.jsx)(i.img,{src:"https://img.shields.io/badge/License-MIT-yellow.svg",alt:"License: MIT"}),"\n",(0,r.jsx)(i.img,{src:"https://img.shields.io/docker/pulls/foxxmd/multi-scrobbler",alt:"Docker Pulls"})]}),"\n",(0,r.jsx)("img",{src:n(84858).Z,align:"right",alt:"multi-scrobbler logo",width:"180",height:"180"}),"\n",(0,r.jsxs)(i.p,{children:["A javascript app to scrobble music you listened to, to ",(0,r.jsx)(i.a,{href:"https://github.com/krateng/maloja",children:"Maloja"}),", ",(0,r.jsx)(i.a,{href:"https://www.last.fm",children:"Last.fm"}),", ",(0,r.jsx)(i.a,{href:"https://listenbrainz.org",children:"ListenBrainz"}),", and ",(0,r.jsx)(i.a,{href:"https://koito.io/",children:"Koito"}),"."]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Supports scrobbling from many ",(0,r.jsx)(i.a,{href:"/configuration/sources",children:(0,r.jsx)(i.strong,{children:"Sources"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/azuracast",children:"Azuracast"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/deezer",children:"Deezer"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/google-cast",children:"Google Cast (Chromecast)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/icecast",children:"Icecast"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/jriver",children:"JRiver"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/kodi",children:"Kodi"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/koito-source",children:"Koito"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/listenbrainz-source",children:"ListenBrainz"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"ListenBrainz (Endpoint)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/maloja",children:"Maloja"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/mopidy",children:"Mopidy"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/mpd",children:"MPD (Music Player Daemon)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/mpris",children:"MPRIS (Linux Desktop)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/musikcube",children:"Musikcube"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/plex",children:"Plex"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/spotify",children:"Spotify"})}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.a,{href:"/configuration/sources/subsonic",children:"Subsonic-compatible APIs"})," (like ",(0,r.jsx)(i.a,{href:"https://airsonic.github.io/",children:"Airsonic"})," and ",(0,r.jsx)(i.a,{href:"https://www.navidrome.org/",children:"Navidrome"}),")"]}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/webscrobbler",children:"WebScrobbler"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/vlc",children:"VLC"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/yamaha-musiccast",children:"Yamaha MusicCast"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/youtube-music",children:"Youtube Music"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Supports scrobbling to many ",(0,r.jsx)(i.a,{href:"/configuration/clients",children:(0,r.jsx)(i.strong,{children:"Clients"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/koito",children:"Koito"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/librefm",children:"Libre.fm"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/listenbrainz",children:"ListenBrainz"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/maloja",children:"Maloja"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/rocksky",children:"Rocksky"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/tealfm",children:"teal.fm"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Enhance/correct scrobble data with ",(0,r.jsx)(i.a,{href:"/configuration/transforms",children:"search patterns"}),", ",(0,r.jsx)(i.a,{href:"/configuration/transforms",children:"built-in corrections"}),", or the ",(0,r.jsx)(i.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," database"]}),"\n",(0,r.jsxs)(i.li,{children:["Monitor status of Sources and Clients using ",(0,r.jsx)(i.a,{href:"/configuration#webhook-configurations",children:"webhooks (Gotify, Ntfy, Apprise)"})," or ",(0,r.jsx)(i.a,{href:"/configuration#health-endpoint",children:"healthcheck endpoint"})]}),"\n",(0,r.jsxs)(i.li,{children:["Supports ",(0,r.jsx)(i.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})," for scrobble Clients"]}),"\n",(0,r.jsx)(i.li,{children:"Supports configuring for single or multiple users (scrobbling for your friends and family!)"}),"\n",(0,r.jsx)(i.li,{children:"Web server interface for stats, basic control, and detailed logs"}),"\n",(0,r.jsx)(i.li,{children:"Graceful network and client failure handling (queued scrobbles that auto-retry)"}),"\n",(0,r.jsx)(i.li,{children:"Smart handling of credentials (persistent, authorization through app)"}),"\n",(0,r.jsxs)(i.li,{children:["Easy configuration through ",(0,r.jsx)(i.a,{href:"/configuration#configuration-types",children:"ENVs or JSON"})]}),"\n",(0,r.jsxs)(i.li,{children:["Install using ",(0,r.jsx)(i.a,{href:"/installation#docker",children:"Docker images for x86/ARM"})," or ",(0,r.jsx)(i.a,{href:"/installation#nodejs",children:"locally with NodeJS"})]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"/quickstart",children:(0,r.jsx)(i.strong,{children:"Quick Start Guide"})})}),"\n",(0,r.jsx)("img",{src:n(68338).Z,width:"800"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Why should I use this over a browser extension and/or mobile app scrobbler?"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Platform independent"})," -- Because multi-scrobbler communicates directly with service APIs it will scrobble everything you play regardless of where you play it. No more need for apps on every platform you use!"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Open-source"})," -- Get peace of mind knowing exactly how your personal data is being handled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Track your activity regardless of where you listen"})," -- Scrobble from many Sources to one Client with ease and without duplicating tracks."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Manage scrobbling for others"})," -- Scrobble for your friends and family without any setup on their part. Easily silo sources to specific clients to keep plays separate."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Standardize your data"})," -- Match your scrobbles with the ",(0,r.jsx)(i.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," database to ensure scrobbled data is as correct and rich as possible."]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"But I already scrobble my music to Last.fm/ListenBrainz, is multi-scrobbler for me?"})}),"\n",(0,r.jsxs)(i.p,{children:["Yes! You can use ",(0,r.jsxs)(i.a,{href:"/configuration/sources/lastfm-source",children:["Last.fm as a ",(0,r.jsx)(i.strong,{children:"Source"})]})," or ",(0,r.jsxs)(i.a,{href:"configuration/sources/listenbrainz-source",children:["Listenbrainz as a ",(0,r.jsx)(i.strong,{children:"Source"})]})," to forward scrobbles from your profile to any other Client! That way you can keep your current scrobble setup as-is but still get the benefit of capturing your data to a self-hosted location."]}),"\n",(0,r.jsxs)(i.p,{children:["Use the ",(0,r.jsx)(i.strong,{children:"Last.fm"})," tab in the ",(0,r.jsx)(i.a,{href:"/quickstart/#setup-sources",children:"Quickstart Sources"})," to get started."]}),"\n",(0,r.jsx)(i.h2,{id:"how-does-multi-scrobbler-ms-work",children:"How Does multi-scrobbler (MS) Work?"}),"\n",(0,r.jsxs)(i.p,{children:["You set up ",(0,r.jsx)(i.a,{href:"/configuration",children:"configurations"})," for one or more ",(0,r.jsx)(i.a,{href:"/configuration/sources",children:(0,r.jsx)(i.strong,{children:"Sources"})})," and one or more ",(0,r.jsx)(i.a,{href:"/configuration/clients",children:(0,r.jsx)(i.strong,{children:"Clients"})}),". MS monitors all of your configured ",(0,r.jsx)(i.strong,{children:"Sources"}),". When new tracks are played by a Source MS grabs that information and then sends it (scrobbles it) to all ",(0,r.jsx)(i.strong,{children:"Clients"})," that Source is configured to forward to."]}),"\n",(0,r.jsx)(i.h3,{id:"source",children:"Source"}),"\n",(0,r.jsxs)(i.p,{children:["A ",(0,r.jsx)(i.a,{href:"/configuration/sources",children:(0,r.jsx)(i.strong,{children:"Source"})})," is a data source that contains information about music you are playing or have listened to, like a desktop player, web music player, or cloud music service. Examples are ",(0,r.jsx)(i.strong,{children:"Spotify, Jellyfin, Plex, Youtube Music, Navidrome"}),", etc..."]}),"\n",(0,r.jsx)(i.p,{children:"Source configurations consist of:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"A friendly name."}),"\n",(0,r.jsx)(i.li,{children:"Any data needed to communicate or authenticate with the Source."}),"\n",(0,r.jsx)(i.li,{children:"An optional list of Client names that the Source should scrobble to. If omitted the Source also scrobbles to all configured Clients."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"client",children:"Client"}),"\n",(0,r.jsxs)(i.p,{children:["A ",(0,r.jsx)(i.a,{href:"/configuration/clients",children:(0,r.jsx)(i.strong,{children:"Client"})})," is an application that stores the historical information about what music you have played (scrobbles). Examples are ",(0,r.jsx)(i.strong,{children:"Maloja, Last.fm, Listenbrainz"}),"..."]}),"\n",(0,r.jsx)(i.p,{children:"Client configurations consist of:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"A friendly name."}),"\n",(0,r.jsx)(i.li,{children:"Any data needed to communicate or authenticate with the Client."}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsxs)(i.a,{href:"/quickstart",children:["See the ",(0,r.jsx)(i.strong,{children:"Quick Start Guide"})]})}),"\n",(0,r.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsxs)(i.a,{href:"/installation",children:["See the ",(0,r.jsx)(i.strong,{children:"Installation"})," documentation"]})}),"\n",(0,r.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsxs)(i.a,{href:"/configuration",children:["See the ",(0,r.jsx)(i.strong,{children:"Configuration"})," documentation"]})}),"\n",(0,r.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(i.p,{children:"A status page with statistics, recent logs, and some runtime configuration options can be found at"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"http://localhost:9078\n"})}),"\n",(0,r.jsx)(i.p,{children:"Output is also provided to stdout/stderr as well as file if specified in configuration."}),"\n",(0,r.jsx)(i.p,{children:"On first startup you may need to authorize Spotify and/or Last.fm by visiting the callback URL (which can also be accessed from the status page). Visit the status page above to find the applicable link to trigger this."}),"\n",(0,r.jsx)(i.h2,{id:"helpfaq",children:"Help/FAQ"}),"\n",(0,r.jsxs)(i.p,{children:["Having issues with connections or configuration? Check the ",(0,r.jsx)(i.a,{href:"/FAQ",children:"FAQ"})," before creating an issue!"]}),"\n",(0,r.jsx)(i.h2,{id:"development",children:"Development"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"/development/dev-common",children:"Detailed architecture and development guides for Sources/Clients"})}),"\n",(0,r.jsx)(i.h2,{id:"license",children:"License"}),"\n",(0,r.jsx)(i.p,{children:"MIT"})]})}function d(e={}){let{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},84858:function(e,i,n){n.d(i,{Z:()=>s});let s=n.p+"assets/images/icon-ae97f2044a6600a69b9c4eeb60cef68e.png"},68338:function(e,i,n){n.d(i,{Z:()=>s});let s=n.p+"assets/images/status-ui-4622935175049ce84685778fe2e4c8d8.png"}}]);
-1
assets/js/4edc808e.e1172d67.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8005"],{38741:function(e,i,n){n.r(i),n.d(i,{frontMatter:()=>t,default:()=>d,toc:()=>a,metadata:()=>s,assets:()=>c,contentTitle:()=>l});var s=JSON.parse('{"id":"index","title":"Overview","description":"Latest Release","source":"@site/docs/index.mdx","sourceDirName":".","slug":"/","permalink":"/multi-scrobbler/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/index.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","title":"Overview","sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Quickstart","permalink":"/multi-scrobbler/quickstart"}}'),r=n(85893),o=n(50065);let t={slug:"/",title:"Overview",sidebar_position:1},l=void 0,c={},a=[{value:"How Does multi-scrobbler (MS) Work?",id:"how-does-multi-scrobbler-ms-work",level:2},{value:"Source",id:"source",level:3},{value:"Client",id:"client",level:3},{value:"Quick Start",id:"quick-start",level:2},{value:"Installation",id:"installation",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Usage",id:"usage",level:2},{value:"Help/FAQ",id:"helpfaq",level:2},{value:"Development",id:"development",level:2},{value:"License",id:"license",level:2}];function h(e){let i={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.img,{src:"https://img.shields.io/github/v/release/foxxmd/multi-scrobbler",alt:"Latest Release"}),"\n",(0,r.jsx)(i.img,{src:"https://img.shields.io/badge/License-MIT-yellow.svg",alt:"License: MIT"}),"\n",(0,r.jsx)(i.img,{src:"https://img.shields.io/docker/pulls/foxxmd/multi-scrobbler",alt:"Docker Pulls"})]}),"\n",(0,r.jsx)("img",{src:n(84858).Z,align:"right",alt:"multi-scrobbler logo",width:"180",height:"180"}),"\n",(0,r.jsxs)(i.p,{children:["A javascript app to scrobble music you listened to, to ",(0,r.jsx)(i.a,{href:"https://github.com/krateng/maloja",children:"Maloja"}),", ",(0,r.jsx)(i.a,{href:"https://www.last.fm",children:"Last.fm"}),", ",(0,r.jsx)(i.a,{href:"https://listenbrainz.org",children:"ListenBrainz"}),", and ",(0,r.jsx)(i.a,{href:"https://koito.io/",children:"Koito"}),"."]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Supports scrobbling from many ",(0,r.jsx)(i.a,{href:"/configuration/sources",children:(0,r.jsx)(i.strong,{children:"Sources"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/azuracast",children:"Azuracast"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/deezer",children:"Deezer"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/google-cast",children:"Google Cast (Chromecast)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/icecast",children:"Icecast"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/jriver",children:"JRiver"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/kodi",children:"Kodi"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/koito-source",children:"Koito"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/listenbrainz-source",children:"ListenBrainz"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"ListenBrainz (Endpoint)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/maloja",children:"Maloja"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/mopidy",children:"Mopidy"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/mpd",children:"MPD (Music Player Daemon)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/mpris",children:"MPRIS (Linux Desktop)"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/musikcube",children:"Musikcube"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/plex",children:"Plex"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/spotify",children:"Spotify"})}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.a,{href:"/configuration/sources/subsonic",children:"Subsonic-compatible APIs"})," (like ",(0,r.jsx)(i.a,{href:"https://airsonic.github.io/",children:"Airsonic"})," and ",(0,r.jsx)(i.a,{href:"https://www.navidrome.org/",children:"Navidrome"}),")"]}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/webscrobbler",children:"WebScrobbler"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/vlc",children:"VLC"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/yamaha-musiccast",children:"Yamaha MusicCast"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/sources/youtube-music",children:"Youtube Music"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Supports scrobbling to many ",(0,r.jsx)(i.a,{href:"/configuration/clients",children:(0,r.jsx)(i.strong,{children:"Clients"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/koito",children:"Koito"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/listenbrainz",children:"ListenBrainz"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/maloja",children:"Maloja"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/rocksky",children:"Rocksky"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"/configuration/clients/tealfm",children:"teal.fm"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Enhance/correct scrobble data with ",(0,r.jsx)(i.a,{href:"/configuration/transforms",children:"search patterns"}),", ",(0,r.jsx)(i.a,{href:"/configuration/transforms",children:"built-in corrections"}),", or the ",(0,r.jsx)(i.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," database"]}),"\n",(0,r.jsxs)(i.li,{children:["Monitor status of Sources and Clients using ",(0,r.jsx)(i.a,{href:"/configuration#webhook-configurations",children:"webhooks (Gotify, Ntfy, Apprise)"})," or ",(0,r.jsx)(i.a,{href:"/configuration#health-endpoint",children:"healthcheck endpoint"})]}),"\n",(0,r.jsxs)(i.li,{children:["Supports ",(0,r.jsx)(i.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})," for scrobble Clients"]}),"\n",(0,r.jsx)(i.li,{children:"Supports configuring for single or multiple users (scrobbling for your friends and family!)"}),"\n",(0,r.jsx)(i.li,{children:"Web server interface for stats, basic control, and detailed logs"}),"\n",(0,r.jsx)(i.li,{children:"Graceful network and client failure handling (queued scrobbles that auto-retry)"}),"\n",(0,r.jsx)(i.li,{children:"Smart handling of credentials (persistent, authorization through app)"}),"\n",(0,r.jsxs)(i.li,{children:["Easy configuration through ",(0,r.jsx)(i.a,{href:"/configuration#configuration-types",children:"ENVs or JSON"})]}),"\n",(0,r.jsxs)(i.li,{children:["Install using ",(0,r.jsx)(i.a,{href:"/installation#docker",children:"Docker images for x86/ARM"})," or ",(0,r.jsx)(i.a,{href:"/installation#nodejs",children:"locally with NodeJS"})]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"/quickstart",children:(0,r.jsx)(i.strong,{children:"Quick Start Guide"})})}),"\n",(0,r.jsx)("img",{src:n(68338).Z,width:"800"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Why should I use this over a browser extension and/or mobile app scrobbler?"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Platform independent"})," -- Because multi-scrobbler communicates directly with service APIs it will scrobble everything you play regardless of where you play it. No more need for apps on every platform you use!"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Open-source"})," -- Get peace of mind knowing exactly how your personal data is being handled."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Track your activity regardless of where you listen"})," -- Scrobble from many Sources to one Client with ease and without duplicating tracks."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Manage scrobbling for others"})," -- Scrobble for your friends and family without any setup on their part. Easily silo sources to specific clients to keep plays separate."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Standardize your data"})," -- Match your scrobbles with the ",(0,r.jsx)(i.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," database to ensure scrobbled data is as correct and rich as possible."]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"But I already scrobble my music to Last.fm/ListenBrainz, is multi-scrobbler for me?"})}),"\n",(0,r.jsxs)(i.p,{children:["Yes! You can use ",(0,r.jsxs)(i.a,{href:"/configuration/sources/lastfm-source",children:["Last.fm as a ",(0,r.jsx)(i.strong,{children:"Source"})]})," or ",(0,r.jsxs)(i.a,{href:"configuration/sources/listenbrainz-source",children:["Listenbrainz as a ",(0,r.jsx)(i.strong,{children:"Source"})]})," to forward scrobbles from your profile to any other Client! That way you can keep your current scrobble setup as-is but still get the benefit of capturing your data to a self-hosted location."]}),"\n",(0,r.jsxs)(i.p,{children:["Use the ",(0,r.jsx)(i.strong,{children:"Last.fm"})," tab in the ",(0,r.jsx)(i.a,{href:"/quickstart/#setup-sources",children:"Quickstart Sources"})," to get started."]}),"\n",(0,r.jsx)(i.h2,{id:"how-does-multi-scrobbler-ms-work",children:"How Does multi-scrobbler (MS) Work?"}),"\n",(0,r.jsxs)(i.p,{children:["You set up ",(0,r.jsx)(i.a,{href:"/configuration",children:"configurations"})," for one or more ",(0,r.jsx)(i.a,{href:"/configuration/sources",children:(0,r.jsx)(i.strong,{children:"Sources"})})," and one or more ",(0,r.jsx)(i.a,{href:"/configuration/clients",children:(0,r.jsx)(i.strong,{children:"Clients"})}),". MS monitors all of your configured ",(0,r.jsx)(i.strong,{children:"Sources"}),". When new tracks are played by a Source MS grabs that information and then sends it (scrobbles it) to all ",(0,r.jsx)(i.strong,{children:"Clients"})," that Source is configured to forward to."]}),"\n",(0,r.jsx)(i.h3,{id:"source",children:"Source"}),"\n",(0,r.jsxs)(i.p,{children:["A ",(0,r.jsx)(i.a,{href:"/configuration/sources",children:(0,r.jsx)(i.strong,{children:"Source"})})," is a data source that contains information about music you are playing or have listened to, like a desktop player, web music player, or cloud music service. Examples are ",(0,r.jsx)(i.strong,{children:"Spotify, Jellyfin, Plex, Youtube Music, Navidrome"}),", etc..."]}),"\n",(0,r.jsx)(i.p,{children:"Source configurations consist of:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"A friendly name."}),"\n",(0,r.jsx)(i.li,{children:"Any data needed to communicate or authenticate with the Source."}),"\n",(0,r.jsx)(i.li,{children:"An optional list of Client names that the Source should scrobble to. If omitted the Source also scrobbles to all configured Clients."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"client",children:"Client"}),"\n",(0,r.jsxs)(i.p,{children:["A ",(0,r.jsx)(i.a,{href:"/configuration/clients",children:(0,r.jsx)(i.strong,{children:"Client"})})," is an application that stores the historical information about what music you have played (scrobbles). Examples are ",(0,r.jsx)(i.strong,{children:"Maloja, Last.fm, Listenbrainz"}),"..."]}),"\n",(0,r.jsx)(i.p,{children:"Client configurations consist of:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"A friendly name."}),"\n",(0,r.jsx)(i.li,{children:"Any data needed to communicate or authenticate with the Client."}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsxs)(i.a,{href:"/quickstart",children:["See the ",(0,r.jsx)(i.strong,{children:"Quick Start Guide"})]})}),"\n",(0,r.jsx)(i.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsxs)(i.a,{href:"/installation",children:["See the ",(0,r.jsx)(i.strong,{children:"Installation"})," documentation"]})}),"\n",(0,r.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsxs)(i.a,{href:"/configuration",children:["See the ",(0,r.jsx)(i.strong,{children:"Configuration"})," documentation"]})}),"\n",(0,r.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(i.p,{children:"A status page with statistics, recent logs, and some runtime configuration options can be found at"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"http://localhost:9078\n"})}),"\n",(0,r.jsx)(i.p,{children:"Output is also provided to stdout/stderr as well as file if specified in configuration."}),"\n",(0,r.jsx)(i.p,{children:"On first startup you may need to authorize Spotify and/or Last.fm by visiting the callback URL (which can also be accessed from the status page). Visit the status page above to find the applicable link to trigger this."}),"\n",(0,r.jsx)(i.h2,{id:"helpfaq",children:"Help/FAQ"}),"\n",(0,r.jsxs)(i.p,{children:["Having issues with connections or configuration? Check the ",(0,r.jsx)(i.a,{href:"/FAQ",children:"FAQ"})," before creating an issue!"]}),"\n",(0,r.jsx)(i.h2,{id:"development",children:"Development"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"/development/dev-common",children:"Detailed architecture and development guides for Sources/Clients"})}),"\n",(0,r.jsx)(i.h2,{id:"license",children:"License"}),"\n",(0,r.jsx)(i.p,{children:"MIT"})]})}function d(e={}){let{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},84858:function(e,i,n){n.d(i,{Z:()=>s});let s=n.p+"assets/images/icon-ae97f2044a6600a69b9c4eeb60cef68e.png"},68338:function(e,i,n){n.d(i,{Z:()=>s});let s=n.p+"assets/images/status-ui-4622935175049ce84685778fe2e4c8d8.png"}}]);
-1
assets/js/4f7d60c5.9f448f9d.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8569"],{73292:function(e,n,i){i.r(n),i.d(n,{frontMatter:()=>o,default:()=>h,toc:()=>d,metadata:()=>t,assets:()=>c,contentTitle:()=>l});var t=JSON.parse('{"id":"configuration/clients/listenbrainz","title":"Listenbrainz","description":"* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)","source":"@site/docs/configuration/clients/listenbrainz.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/listenbrainz","permalink":"/multi-scrobbler/configuration/clients/listenbrainz","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/listenbrainz.mdx","tags":[],"version":"current","frontMatter":{"title":"Listenbrainz","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Last.fm","permalink":"/multi-scrobbler/configuration/clients/lastfm"},"next":{"title":"Maloja","permalink":"/multi-scrobbler/configuration/clients/maloja"}}'),r=i(85893),s=i(50065);i(703),i(73752),i(75752);var a=i(92822);let o={title:"Listenbrainz",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,c={},d=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",admonition:"admonition",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Config:i}=n;return i||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{title:"Other Users",type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To monitor and re-scrobble activity from a Listenbrainz account create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/listenbrainz-source",children:"Listenbrainz (Source)"})]}),"\n",(0,r.jsxs)(n.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz (Endpoint)"})]}),"\n"]})}),"\n",(0,r.jsxs)(n.p,{children:["You will need to run your own Listenbrainz server or have an account ",(0,r.jsx)(n.a,{href:"https://listenbrainz.org/login/",children:"on the official instance"})]}),"\n",(0,r.jsxs)(n.p,{children:["On your ",(0,r.jsx)(n.a,{href:"https://listenbrainz.org/profile/",children:"profile page"})," find your ",(0,r.jsx)(n.strong,{children:"User Token"})," to use in the configuration."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i,{config:"ListenbrainzClientConfig",fileContent:a.Z,client:!0,name:"listenbrainz",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"LZ_TOKEN"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"User token from your LZ profile"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"LZ_USER"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Your LZ username"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"LZ_URL"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://api.listenbrainz.org/",children:"https://api.listenbrainz.org/"})}),(0,r.jsx)(n.td,{children:"The base URL for the LZ server"})]})]})]})})]})}function h(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},92822:function(e,n,i){i.d(n,{Z:()=>t});let t='[\n {\n "name": "brainzClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "FoxxMD",\n "url": "https://api.listenbrainz.org"\n }\n },\n {\n "name": "brainzSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "FoxxMD",\n "url": "https://api.listenbrainz.org"\n }\n }\n]\n'}}]);
+1
assets/js/4f7d60c5.ab57f92e.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8569"],{73292:function(e,n,i){i.r(n),i.d(n,{frontMatter:()=>a,default:()=>h,toc:()=>d,metadata:()=>t,assets:()=>c,contentTitle:()=>l});var t=JSON.parse('{"id":"configuration/clients/listenbrainz","title":"Listenbrainz","description":"* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)","source":"@site/docs/configuration/clients/listenbrainz.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/listenbrainz","permalink":"/multi-scrobbler/configuration/clients/listenbrainz","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/listenbrainz.mdx","tags":[],"version":"current","frontMatter":{"title":"Listenbrainz","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Libre.fm","permalink":"/multi-scrobbler/configuration/clients/librefm"},"next":{"title":"Maloja","permalink":"/multi-scrobbler/configuration/clients/maloja"}}'),r=i(85893),s=i(50065);i(703),i(73752),i(75752);var o=i(92822);let a={title:"Listenbrainz",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,c={},d=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",admonition:"admonition",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Config:i}=n;return i||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{title:"Other Users",type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To monitor and re-scrobble activity from a Listenbrainz account create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/listenbrainz-source",children:"Listenbrainz (Source)"})]}),"\n",(0,r.jsxs)(n.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz (Endpoint)"})]}),"\n"]})}),"\n",(0,r.jsxs)(n.p,{children:["You will need to run your own Listenbrainz server or have an account ",(0,r.jsx)(n.a,{href:"https://listenbrainz.org/login/",children:"on the official instance"})]}),"\n",(0,r.jsxs)(n.p,{children:["On your ",(0,r.jsx)(n.a,{href:"https://listenbrainz.org/profile/",children:"profile page"})," find your ",(0,r.jsx)(n.strong,{children:"User Token"})," to use in the configuration."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i,{config:"ListenbrainzClientConfig",fileContent:o.Z,client:!0,name:"listenbrainz",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Environmental Variable"}),(0,r.jsx)(n.th,{children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"LZ_TOKEN"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"User token from your LZ profile"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"LZ_USER"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Your LZ username"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"LZ_URL"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://api.listenbrainz.org/",children:"https://api.listenbrainz.org/"})}),(0,r.jsx)(n.td,{children:"The base URL for the LZ server"})]})]})]})})]})}function h(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},92822:function(e,n,i){i.d(n,{Z:()=>t});let t='[\n {\n "name": "brainzClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "FoxxMD",\n "url": "https://api.listenbrainz.org"\n }\n },\n {\n "name": "brainzSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "FoxxMD",\n "url": "https://api.listenbrainz.org"\n }\n }\n]\n'}}]);
+1
assets/js/5a378701.6c08a8bc.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["7246"],{94023:function(e,s,l){l.r(s),l.d(s,{frontMatter:()=>h,default:()=>b,toc:()=>u,metadata:()=>r,assets:()=>j,contentTitle:()=>x});var r=JSON.parse('{"id":"configuration/sources/jellyfin","title":"Jellyfin","description":"Must be using Jellyfin 10.7 or greater","source":"@site/docs/configuration/sources/jellyfin.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/jellyfin","permalink":"/multi-scrobbler/configuration/sources/jellyfin","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/jellyfin.mdx","tags":[],"version":"current","frontMatter":{"title":"Jellyfin","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Icecast","permalink":"/multi-scrobbler/configuration/sources/icecast"},"next":{"title":"JRiver","permalink":"/multi-scrobbler/configuration/sources/jriver"}}'),n=l(85893),i=l(50065),t=l(703),o=l(73752),d=l(75752),c=l.n(d);let a='[\n {\n "name": "MyJellyfin",\n "enable": true,\n "clients": [],\n "data": {\n "url": "http://localhost:8096",\n "user": "FoxxMD",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c",\n\n // everything below is optional\n "usersAllow": ["FoxxMD","SomeOtherUser"],\n "usersBlock": ["AnotherUser"],\n "devicesAllow": ["firefox"],\n "devicesBlock": ["google-home"],\n "librariesAllow": ["GoodMusic"],\n "librariesBlock": ["BadMusic"],\n "additionalAllowedLibraryTypes": ["musicvideos"],\n "allowUnknown": false,\n },\n "options": {\n "logPayload": true,\n "logFilterFailure": "debug"\n }\n }\n]\n',h={title:"Jellyfin",toc_min_heading_level:2,toc_max_heading_level:5},x=void 0,j={},u=[{value:"Configuration",id:"configuration",level:4}];function f(e){let s={code:"code",h4:"h4",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components},{AIOExample:l,DetailsAdmo:r,SchemaLink:d}=s;return l||m("AIOExample",!0),r||m("DetailsAdmo",!0),d||m("SchemaLink",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.p,{children:"Must be using Jellyfin 10.7 or greater"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Create an ",(0,n.jsx)(s.strong,{children:"API Key"})," for multi-scrobbler","\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["In the Jellyfin desktop web UI Navigate to -> Administration -> Dashboard -> API Keys (",(0,n.jsx)(s.code,{children:"http://YOUR_JELLYIN_URL/web/index.html#!/apikeys.html"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Click ",(0,n.jsx)(s.code,{children:"+"})," button and create a new key with ",(0,n.jsx)(s.strong,{children:"App name"})," ",(0,n.jsx)(s.code,{children:"multi-scrobbler"})]}),"\n",(0,n.jsx)(s.li,{children:"Copy the created API Key value for use in configuration below"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["It is ",(0,n.jsx)(s.strong,{children:"recommended"})," to use API Key + username but if you are not an admin for your Jellyfin instance you can also authenticate with your Jellyfin username and ",(0,n.jsx)(s.strong,{children:"password."})]}),"\n",(0,n.jsxs)(r,{type:"tip",summary:"Important Defaults",children:[(0,n.jsx)(s.p,{children:"By default..."}),(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["multi-scrobbler will ",(0,n.jsx)(s.strong,{children:"only"})," scrobble for the user authenticated with the API.","\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Allowed Users (",(0,n.jsx)(s.code,{children:"usersAllow"})," or ",(0,n.jsx)(s.code,{children:"JELLYFIN_USERS_ALLOW"}),") are only necessary if you want to scrobble for additional users."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["multi-scrobbler will ",(0,n.jsx)(s.strong,{children:"only"})," scrobble media found in Jellyfin libraries that were labelled as ",(0,n.jsx)(s.strong,{children:"Music."}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"librariesAllow"})," or ",(0,n.jsx)(s.code,{children:"JELLYFIN_LIBRARIES_ALLOW"})," will override this"]}),"\n",(0,n.jsxs)(s.li,{children:["OR use ",(0,n.jsx)(s.code,{children:"additionalAllowedLibraryTypes"})," to allow more types (like ",(0,n.jsx)(s.code,{children:"mixed"})," or ",(0,n.jsx)(s.code,{children:"book"})," for audiobooks)"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["multi-scrobbler will ",(0,n.jsx)(s.strong,{children:"only"})," scrobble media Jellyfin detects as ",(0,n.jsx)(s.strong,{children:"Audio."}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["To force multi-scrobbler to scrobble when media is detected as ",(0,n.jsx)(s.strong,{children:"Unknown"})," use ",(0,n.jsx)(s.code,{children:'"allowUnknown": true'})," in file/aio configuration."]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,n.jsx)(s.h4,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsxs)(t.default,{groupId:"configType",queryString:!0,children:[(0,n.jsx)(o.default,{value:"env",label:"ENV",children:(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Environmental Variable"}),(0,n.jsx)(s.th,{children:"Required?"}),(0,n.jsx)(s.th,{children:"Default"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_URL"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"Yes"})}),(0,n.jsx)(s.td,{}),(0,n.jsxs)(s.td,{children:["The URL of the Jellyfin server IE ",(0,n.jsx)(s.code,{children:"http://localhost:8096"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_USER"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"Yes"})}),(0,n.jsx)(s.td,{}),(0,n.jsx)(s.td,{children:"The user to authenticate with the API"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_APIKEY"})}),(0,n.jsx)(s.td,{children:"No"}),(0,n.jsx)(s.td,{}),(0,n.jsxs)(s.td,{children:["The API Key to use for authentication ",(0,n.jsx)(s.strong,{children:"(Must provide either apikey or password)"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_PASSWORD"})}),(0,n.jsx)(s.td,{children:"No"}),(0,n.jsx)(s.td,{}),(0,n.jsxs)(s.td,{children:["The password of the user to authenticate for. ",(0,n.jsx)(s.strong,{children:"(Must provide either apikey or password)"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_USERS_ALLOW"})}),(0,n.jsx)(s.td,{children:"No"}),(0,n.jsx)(s.td,{}),(0,n.jsx)(s.td,{children:"Comma-separated list of usernames (from Jellyfin) to scrobble for"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_USERS_BLOCK"})}),(0,n.jsx)(s.td,{children:"No"}),(0,n.jsx)(s.td,{}),(0,n.jsx)(s.td,{children:"Comma-separated list of usernames (from Jellyfin) to disallow scrobble for"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_DEVICES_ALLOW"})}),(0,n.jsx)(s.td,{children:"No"}),(0,n.jsx)(s.td,{}),(0,n.jsx)(s.td,{children:"Comma-separated list of devices to scrobble from"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_DEVICES_BLOCK"})}),(0,n.jsx)(s.td,{children:"No"}),(0,n.jsx)(s.td,{}),(0,n.jsx)(s.td,{children:"Comma-separated list of devices to disallow scrobbles from"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_LIBRARIES_ALLOW"})}),(0,n.jsx)(s.td,{children:"No"}),(0,n.jsx)(s.td,{}),(0,n.jsx)(s.td,{children:"Comma-separated list of libraries to allow scrobbles from"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"JELLYFIN_LIBRARIES_BLOCK"})}),(0,n.jsx)(s.td,{children:"No"}),(0,n.jsx)(s.td,{}),(0,n.jsx)(s.td,{children:"Comma-separated list of libraries to disallow scrobbles from"})]})]})]})}),(0,n.jsxs)(o.default,{value:"file",label:"File",children:[(0,n.jsx)(c(),{title:"CONFIG_DIR/jellyfin.json",language:"json5",children:a}),(0,n.jsxs)(s.p,{children:["or ",(0,n.jsx)(d,{lower:!0,objectName:"JellyApiSourceConfig"})]})]}),(0,n.jsxs)(o.default,{value:"aio",label:"AIO",children:[(0,n.jsx)(l,{data:a,name:"jellyfin"}),(0,n.jsxs)(s.p,{children:["or ",(0,n.jsx)(d,{lower:!0,objectName:"JellyApiSourceConfig"})]})]})]})]})}function b(e={}){let{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(f,{...e})}):f(e)}function m(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
-1
assets/js/5a378701.7e37c733.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["7246"],{94023:function(e,s,l){l.r(s),l.d(s,{frontMatter:()=>h,default:()=>b,toc:()=>u,metadata:()=>n,assets:()=>j,contentTitle:()=>x});var n=JSON.parse('{"id":"configuration/sources/jellyfin","title":"Jellyfin","description":"Must be using Jellyfin 10.7 or greater","source":"@site/docs/configuration/sources/jellyfin.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/jellyfin","permalink":"/multi-scrobbler/configuration/sources/jellyfin","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/jellyfin.mdx","tags":[],"version":"current","frontMatter":{"title":"Jellyfin","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Icecast","permalink":"/multi-scrobbler/configuration/sources/icecast"},"next":{"title":"JRiver","permalink":"/multi-scrobbler/configuration/sources/jriver"}}'),r=l(85893),i=l(50065),t=l(703),o=l(73752),d=l(75752),c=l.n(d);let a='[\n {\n "name": "MyJellyfin",\n "enable": true,\n "clients": [],\n "data": {\n "url": "http://localhost:8096",\n "user": "FoxxMD",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c",\n\n // everything below is optional\n "usersAllow": ["FoxxMD","SomeOtherUser"],\n "usersBlock": ["AnotherUser"],\n "devicesAllow": ["firefox"],\n "devicesBlock": ["google-home"],\n "librariesAllow": ["GoodMusic"],\n "librariesBlock": ["BadMusic"],\n "additionalAllowedLibraryTypes": ["musicvideos"],\n "allowUnknown": false,\n },\n "options": {\n "logPayload": true,\n "logFilterFailure": "debug"\n }\n }\n]\n',h={title:"Jellyfin",toc_min_heading_level:2,toc_max_heading_level:5},x=void 0,j={},u=[{value:"Configuration",id:"configuration",level:4}];function f(e){let s={admonition:"admonition",code:"code",h4:"h4",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components},{AIOExample:l,SchemaLink:n}=s;return l||m("AIOExample",!0),n||m("SchemaLink",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.p,{children:"Must be using Jellyfin 10.7 or greater"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Create an ",(0,r.jsx)(s.strong,{children:"API Key"})," for multi-scrobbler","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["In the Jellyfin desktop web UI Navigate to -> Administration -> Dashboard -> API Keys (",(0,r.jsx)(s.code,{children:"http://YOUR_JELLYIN_URL/web/index.html#!/apikeys.html"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:["Click ",(0,r.jsx)(s.code,{children:"+"})," button and create a new key with ",(0,r.jsx)(s.strong,{children:"App name"})," ",(0,r.jsx)(s.code,{children:"multi-scrobbler"})]}),"\n",(0,r.jsx)(s.li,{children:"Copy the created API Key value for use in configuration below"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["It is ",(0,r.jsx)(s.strong,{children:"recommended"})," to use API Key + username but if you are not an admin for your Jellyfin instance you can also authenticate with your Jellyfin username and ",(0,r.jsx)(s.strong,{children:"password."})]}),"\n",(0,r.jsxs)(s.admonition,{title:"Important Defaults",type:"tip",children:[(0,r.jsx)(s.p,{children:"By default..."}),(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["multi-scrobbler will ",(0,r.jsx)(s.strong,{children:"only"})," scrobble for the user authenticated with the API.","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Allowed Users (",(0,r.jsx)(s.code,{children:"usersAllow"})," or ",(0,r.jsx)(s.code,{children:"JELLYFIN_USERS_ALLOW"}),") are only necessary if you want to scrobble for additional users."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["multi-scrobbler will ",(0,r.jsx)(s.strong,{children:"only"})," scrobble media found in Jellyfin libraries that were labelled as ",(0,r.jsx)(s.strong,{children:"Music."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"librariesAllow"})," or ",(0,r.jsx)(s.code,{children:"JELLYFIN_LIBRARIES_ALLOW"})," will override this"]}),"\n",(0,r.jsxs)(s.li,{children:["OR use ",(0,r.jsx)(s.code,{children:"additionalAllowedLibraryTypes"})," to allow more types (like ",(0,r.jsx)(s.code,{children:"mixed"})," or ",(0,r.jsx)(s.code,{children:"book"})," for audiobooks)"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["multi-scrobbler will ",(0,r.jsx)(s.strong,{children:"only"})," scrobble media Jellyfin detects as ",(0,r.jsx)(s.strong,{children:"Audio."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["To force multi-scrobbler to scrobble when media is detected as ",(0,r.jsx)(s.strong,{children:"Unknown"})," use ",(0,r.jsx)(s.code,{children:'"allowUnknown": true'})," in file/aio configuration."]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,r.jsx)(s.h4,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(t.default,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(o.default,{value:"env",label:"ENV",children:(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Environmental Variable"}),(0,r.jsx)(s.th,{children:"Required?"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_URL"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.strong,{children:"Yes"})}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["The URL of the Jellyfin server IE ",(0,r.jsx)(s.code,{children:"http://localhost:8096"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_USER"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.strong,{children:"Yes"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"The user to authenticate with the API"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_APIKEY"})}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["The API Key to use for authentication ",(0,r.jsx)(s.strong,{children:"(Must provide either apikey or password)"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_PASSWORD"})}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["The password of the user to authenticate for. ",(0,r.jsx)(s.strong,{children:"(Must provide either apikey or password)"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_USERS_ALLOW"})}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Comma-separated list of usernames (from Jellyfin) to scrobble for"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_USERS_BLOCK"})}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Comma-separated list of usernames (from Jellyfin) to disallow scrobble for"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_DEVICES_ALLOW"})}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Comma-separated list of devices to scrobble from"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_DEVICES_BLOCK"})}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Comma-separated list of devices to disallow scrobbles from"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_LIBRARIES_ALLOW"})}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Comma-separated list of libraries to allow scrobbles from"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_LIBRARIES_BLOCK"})}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Comma-separated list of libraries to disallow scrobbles from"})]})]})]})}),(0,r.jsxs)(o.default,{value:"file",label:"File",children:[(0,r.jsx)(c(),{title:"CONFIG_DIR/jellyfin.json",language:"json5",children:a}),(0,r.jsxs)(s.p,{children:["or ",(0,r.jsx)(n,{lower:!0,objectName:"JellyApiSourceConfig"})]})]}),(0,r.jsxs)(o.default,{value:"aio",label:"AIO",children:[(0,r.jsx)(l,{data:a,name:"jellyfin"}),(0,r.jsxs)(s.p,{children:["or ",(0,r.jsx)(n,{lower:!0,objectName:"JellyApiSourceConfig"})]})]})]})]})}function b(e={}){let{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(f,{...e})}):f(e)}function m(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
-1
assets/js/64837553.05731c91.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["9621"],{10164:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>a,default:()=>u,toc:()=>d,metadata:()=>i,assets:()=>o,contentTitle:()=>l});var i=JSON.parse('{"id":"configuration/clients/lastfm","title":"Last.fm","description":"* To monitor and re-scrobble activity from your Last.fm account create a Last.fm (Source)","source":"@site/docs/configuration/clients/lastfm.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/lastfm","permalink":"/multi-scrobbler/configuration/clients/lastfm","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/lastfm.mdx","tags":[],"version":"current","frontMatter":{"title":"Last.fm","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Koito","permalink":"/multi-scrobbler/configuration/clients/koito"},"next":{"title":"Listenbrainz","permalink":"/multi-scrobbler/configuration/clients/listenbrainz"}}'),r=n(85893),s=n(50065);n(703),n(73752),n(75752);var c=n(55293);let a={title:"Last.fm",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,o={},d=[{value:"Configuration",id:"configuration",level:2}];function h(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Config:n}=t;return n||function(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.admonition,{title:"Other Users",type:"tip",children:(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["To monitor and re-scrobble activity from your Last.fm account create a ",(0,r.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})]}),"\n",(0,r.jsxs)(t.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a ",(0,r.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})]}),"\n"]})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://www.last.fm/api/account/create",children:"Register for an API account here."})}),"\n",(0,r.jsx)(t.p,{children:"The Callback URL is actually specified by multi-scrobbler but to keep things consistent you should use"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"http://localhost:9078/lastfm/callback\n"})}),"\n",(0,r.jsxs)(t.p,{children:["or replace ",(0,r.jsx)(t.code,{children:"localhost:9078"})," with your own base URL."]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n,{config:"LastfmClientConfig",fileContent:c.Z,client:!0,name:"lastfm",children:(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Environmental Variable"}),(0,r.jsx)(t.th,{children:"Required?"}),(0,r.jsx)(t.th,{children:"Default"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LASTFM_API_KEY"})}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Api Key from your API Account"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LASTFM_SECRET"})}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Shared secret from your API Account"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LASTFM_REDIRECT_URI"})}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"http://localhost:9078/lastfm/callback"})}),(0,r.jsxs)(t.td,{children:["Url to use for authentication. Must include ",(0,r.jsx)(t.code,{children:"lastfm/callback"})," somewhere in it"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LASTFM_SESSION"})}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Session id. Will be generated by authentication flow if not provided."})]})]})]})})]})}function u(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},55293:function(e,t,n){n.d(t,{Z:()=>i});let i='[\n {\n "name": "myLastFmClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "name": "myLastFmSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'}}]);
+1
assets/js/64837553.891b3708.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["9621"],{10164:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>a,default:()=>u,toc:()=>d,metadata:()=>i,assets:()=>o,contentTitle:()=>l});var i=JSON.parse('{"id":"configuration/clients/lastfm","title":"Last.fm","description":"* To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a Last.fm (Source)","source":"@site/docs/configuration/clients/lastfm.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/lastfm","permalink":"/multi-scrobbler/configuration/clients/lastfm","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/lastfm.mdx","tags":[],"version":"current","frontMatter":{"title":"Last.fm","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Koito","permalink":"/multi-scrobbler/configuration/clients/koito"},"next":{"title":"Libre.fm","permalink":"/multi-scrobbler/configuration/clients/librefm"}}'),r=n(85893),s=n(50065);n(703),n(73752),n(75752);var c=n(55293);let a={title:"Last.fm",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,o={},d=[{value:"Callback/Redirect URL",id:"callbackredirect-url",level:3},{value:"Configuration",id:"configuration",level:2}];function h(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Config:n,Details:i}=t;return n||f("Config",!0),i||f("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.admonition,{title:"Other Users",type:"tip",children:(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a ",(0,r.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})]}),"\n",(0,r.jsxs)(t.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a ",(0,r.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})]}),"\n"]})}),"\n",(0,r.jsxs)(t.p,{children:["You will need a ",(0,r.jsx)(t.a,{href:"https://www.last.fm",children:"Last.fm"})," account to use the Last.fm API."]}),"\n",(0,r.jsxs)(t.p,{children:["After creating your account, ",(0,r.jsx)(t.a,{href:"https://www.last.fm/api/account/create",children:"register for an API account here."})]}),"\n",(0,r.jsxs)(t.p,{children:["The callback URL in the API account form is not used, but to keep it consistent use the same value you set using the ",(0,r.jsx)(t.a,{href:"#callback-redirect-url",children:"Callback/Redirect URL"})," section."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Take note of your API Key and Secret after account creation."})}),"\n",(0,r.jsx)(t.h3,{id:"callbackredirect-url",children:"Callback/Redirect URL"}),"\n",(0,r.jsxs)(t.p,{children:["The Redirect (Callback) URL is used to redirect your ",(0,r.jsx)(t.strong,{children:"browser"})," to multi-scrobbler after authentication has completed."]}),"\n",(0,r.jsxs)(t.p,{children:["So, the ",(0,r.jsx)(t.em,{children:"base of the URL"})," you use should be the ",(0,r.jsx)(t.em,{children:"same"})," as the URL you would use to navigate to the multi-scrobbler dashboard."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(t.p,{children:["If you can visit the multi-scrobbler dashboard by navigating to ",(0,r.jsx)(t.a,{href:"http://192.168.0.100:9078",children:"http://192.168.0.100:9078"})," in your web browser..."]}),(0,r.jsxs)(t.p,{children:["then the ENV ",(0,r.jsx)(t.code,{children:"LASTFM_REDIRECT_URI"}),", or ",(0,r.jsx)(t.code,{children:"redirectUri"})," for last.fm/libre.fm json config, should be"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"http://192.168.0.100:9078/lastfm/callback\n"})})]}),"\n",(0,r.jsxs)(t.p,{children:["The Redirect URL can be explicitly specified in the configuration below, or by using the global ",(0,r.jsx)(t.a,{href:"/configuration#base-url",children:"Base URL"})," setting."]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n,{config:"LastfmClientConfig",fileContent:c.Z,client:!0,name:"lastfm",children:(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Environmental Variable"}),(0,r.jsx)(t.th,{children:"Required?"}),(0,r.jsx)(t.th,{children:"Default"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LASTFM_API_KEY"})}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Api Key from your API Account"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LASTFM_SECRET"})}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Shared secret from your API Account"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LASTFM_REDIRECT_URI"})}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"http://localhost:9078/lastfm/callback"})}),(0,r.jsxs)(t.td,{children:["Url to use for authentication. Must include ",(0,r.jsx)(t.code,{children:"lastfm/callback"})," somewhere in it"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LASTFM_SESSION"})}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Session id. Will be generated by authentication flow if not provided."})]})]})]})})]})}function u(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}function f(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},55293:function(e,t,n){n.d(t,{Z:()=>i});let i='[\n {\n "name": "myLastFmClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "name": "myLastFmSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'}}]);
+1
assets/js/73287945.77055eea.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3151"],{19171:function(e,i,n){n.r(i),n.d(i,{frontMatter:()=>c,default:()=>d,toc:()=>u,metadata:()=>r,assets:()=>l,contentTitle:()=>a});var r=JSON.parse('{"id":"configuration/sources/librefm-source","title":"Libre.fm","description":"This Source monitors your Libre.fm scrobble history and re-scrobbles new activity to configured Clients.","source":"@site/docs/configuration/sources/librefm-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/librefm-source","permalink":"/multi-scrobbler/configuration/sources/librefm-source","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/librefm-source.mdx","tags":[],"version":"current","frontMatter":{"title":"Libre.fm","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Last.fm","permalink":"/multi-scrobbler/configuration/sources/lastfm-source"},"next":{"title":"Listenbrainz (Endpoint)","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint"}}'),t=n(85893),o=n(50065);n(703),n(73752),n(75752);var s=n(59162);let c={title:"Libre.fm",toc_min_heading_level:2,toc_max_heading_level:5},a=void 0,l={},u=[{value:"Configuration",id:"configuration",level:2}];function f(e){let i={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components},{Config:n}=i;return n||function(e,i){throw Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(i.p,{children:["This Source ",(0,t.jsx)(i.strong,{children:"monitors your Libre.fm scrobble history"})," and re-scrobbles new activity to configured ",(0,t.jsx)(i.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,t.jsx)(i.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["To ",(0,t.jsx)(i.strong,{children:"scrobble to"})," Libre.fm, create a ",(0,t.jsx)(i.a,{href:"/configuration/clients/librefm",children:"Libre.fm (Client)"})]}),"\n"]})}),"\n",(0,t.jsxs)(i.p,{children:["To configure this Source use the same registration instructions and configuration data shown in ",(0,t.jsx)(i.a,{href:"/configuration/clients/librefm",children:"Libre.fm (Client)"})," with the difference being ",(0,t.jsx)(i.code,{children:'"configureAs": "source"'})," defined in the File/AIO configuration below."]}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(n,{config:"LibrefmSourceConfig",fileContent:s.Z,name:"librefm",children:(0,t.jsx)(i.admonition,{type:"note",children:(0,t.jsxs)(i.p,{children:["You cannot use ENV variables shown in the ",(0,t.jsx)(i.a,{href:"/configuration/clients/librefm",children:"Libre.fm Client config"})," -- multi-scrobbler assumes Libre.fm ENVs are always used for the ",(0,t.jsx)(i.strong,{children:"client"})," configuration. You must use the ",(0,t.jsx)(i.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO"})," config to setup Libre.fm as a Source."]})})})]})}function d(e={}){let{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(f,{...e})}):f(e)}},59162:function(e,i,n){n.d(i,{Z:()=>r});let r='[\n {\n "name": "myLibreFmClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "apiKey": "anything",\n "secret": "anything",\n "redirectUri": "http://localhost:9078/librefm/callback"\n }\n },\n {\n "name": "myLibreFmSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "apiKey": "anything",\n "secret": "anything",\n "redirectUri": "http://localhost:9078/librefm/callback"\n }\n }\n]\n'}}]);
+1
assets/js/778b0fa6.6281df9d.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3989"],{66833:function(e,t,i){i.r(t),i.d(t,{frontMatter:()=>a,default:()=>x,toc:()=>u,metadata:()=>r,assets:()=>d,contentTitle:()=>h});var r=JSON.parse('{"id":"configuration/sources/spotify","title":"Spotify","description":"If your Spotify player has Automix enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is \\"mixed\\" in your queue with a shorter play time than its actual length and Spotify does not report this modified play time in its API. This does not affect MS\'s ability to scrobble from Spotify but it will affect the accuracy of the duration MS reports was played.","source":"@site/docs/configuration/sources/spotify.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/spotify","permalink":"/multi-scrobbler/configuration/sources/spotify","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/spotify.mdx","tags":[],"version":"current","frontMatter":{"title":"Spotify","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/sources/rocksky-source"},"next":{"title":"Subsonic","permalink":"/multi-scrobbler/configuration/sources/subsonic"}}'),s=i(85893),o=i(50065),n=i(703),c=i(73752);i(75752);var l=i(51952);i(21863);let a={title:"Spotify",toc_min_heading_level:2,toc_max_heading_level:5},h=void 0,d={},u=[{value:"Authenticate Spotify with Multi-Scrobbler",id:"authenticate-spotify-with-multi-scrobbler",level:4},{value:"Configuration",id:"configuration",level:2}];function p(e){let t={a:"a",code:"code",h2:"h2",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components},{Config:r,Details:a,DetailsAdmo:h}=t;return r||f("Config",!0),a||f("Details",!0),h||f("DetailsAdmo",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(h,{type:"note",summary:"Spotify and Automix",children:(0,s.jsxs)(t.p,{children:["If your Spotify player has ",(0,s.jsx)(t.a,{href:"https://community.spotify.com/t5/FAQs/What-is-Automix/ta-p/5257278",children:"Automix"}),' enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is "mixed" in your queue with a shorter play time than its actual length and ',(0,s.jsx)(t.a,{href:"https://community.spotify.com/t5/Spotify-for-Developers/Wrong-duration-ms-of-track-with-Automix/m-p/5429147",children:"Spotify does not report this modified play time in its API."})," This ",(0,s.jsx)(t.strong,{children:"does not affect MS's ability to scrobble"})," from Spotify but it will affect the accuracy of the duration MS reports was played."]})}),"\n",(0,s.jsx)(t.h4,{id:"authenticate-spotify-with-multi-scrobbler",children:"Authenticate Spotify with Multi-Scrobbler"}),"\n",(0,s.jsxs)(t.p,{children:["To access your Spotify history you must ",(0,s.jsx)(t.a,{href:"https://developer.spotify.com/dashboard",children:"create a Spotify App"})," to get a\nClient ID/Secret."]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsxs)(t.strong,{children:["Login to ",(0,s.jsx)(t.a,{href:"https://developer.spotify.com",children:"https://developer.spotify.com"})]})," with your existing Spotify account and accept Developer Terms"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Navigate to your Spotify Developer ",(0,s.jsx)(t.a,{href:"https://developer.spotify.com/dashboard",children:"Dashboard"})," and start the ",(0,s.jsx)(t.strong,{children:"Create App"})," process"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Determine the correct ",(0,s.jsx)(t.strong,{children:"Redirect URI"})," to use and set it in your App settings"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(a,{children:[(0,s.jsx)("summary",{children:"Redirect URI Instructions"}),(0,s.jsxs)(t.p,{children:["A Redirect URI is the URL that Spotify will navigate your ",(0,s.jsx)(t.strong,{children:"browser"})," to after you complete authorization. The URL will contain the code necessary for multi-scrobbler to get a Spotify access token."]}),(0,s.jsxs)(t.p,{children:["Spotify ",(0,s.jsx)(t.a,{href:"https://developer.spotify.com/documentation/web-api/tutorials/migration-insecure-redirect-uri",children:(0,s.jsx)(t.strong,{children:"no longer allows insecure URIs"})})," (start with ",(0,s.jsx)(t.code,{children:"http://"}),") unless the address is ",(0,s.jsx)(t.code,{children:"127.0.0.1"})," -- so ",(0,s.jsx)(t.code,{children:"localhost"})," and internal IPs (",(0,s.jsx)(t.code,{children:"192.168.0.xxx"}),") no longer work."]}),(0,s.jsxs)(t.p,{children:["Use ",(0,s.jsx)(t.strong,{children:"one"})," of the following methods to specify a valid Redirect URI and complete Spotify authentication with multi-scrobbler:"]}),(0,s.jsxs)(n.default,{groupId:"spotifyRedirect",queryString:!0,children:[(0,s.jsxs)(c.default,{value:"https",label:"HTTPS",children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Use a domain you control, with SSL certificates/HTTPS enabled, to create a valid redirect URI."})}),(0,s.jsxs)(t.p,{children:["For example, if you are already running multi-scrobbler behind a reverse proxy (nginx/traefik/caddy) at ",(0,s.jsx)(t.code,{children:"https://scrobbler.mydomain.com"})," then set the Spotify Redirect URI for your Spotify App, and multi-scrobbler ",(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV, to ",(0,s.jsx)(t.code,{children:"https://scrobbler.mydomain.com/callback"})]}),(0,s.jsxs)(t.p,{children:["Alternatively, if multi-scrobbler is not accessible behind your domain, then use the ",(0,s.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,s.jsx)(t.strong,{children:"Echo"})})," method with your own domain instead of 127.0.0.1."]})]}),(0,s.jsxs)(c.default,{value:"local",label:"Run MS Locally",children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Run multi-scrobbler, configured for a Spotify Source, from the same machine as your browser in order to get credentials."})}),(0,s.jsxs)(t.p,{children:["In this scenario you can use ",(0,s.jsx)(t.code,{children:"http://127.0.0.1:9078/callback"})," as the Spotify Redirect URI and multi-scrobbler ",(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV."]}),(0,s.jsxs)(t.p,{children:["After completing authentication, copy the contents of local multi-scrobbler's ",(0,s.jsx)(t.a,{href:"/installation#storage",children:"configuration folder"})," to the final location of where multi-scrobbler will be run."]})]}),(0,s.jsxs)(c.default,{value:"echo",label:"Echo",children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:'Use a docker container on the same machine your browser is on to "intercept" the callback URL from Spotify authentication, then manually finish the process by changing the domain to your multi-scrobbler instance.'})}),(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Create a container on the same machine as your browser using the ",(0,s.jsx)(t.a,{href:"https://github.com/mendhak/docker-http-https-echo",children:(0,s.jsx)(t.code,{children:"mendhak/http-https-echo:36"})})," image. This container runs a simple HTTP server that echos back any request it recieves."]}),"\n"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",children:"docker run --rm -p 127.0.0.1:5079:8080 mendhak/http-https-echo:36\n"})}),(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Set the Spotify Redirect URI and multi-scrobbler ",(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV as ",(0,s.jsx)(t.code,{children:"http://127.0.0.1:5079/callback"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In ",(0,s.jsx)(t.a,{href:"#authenticate-spotify-with-multi-scrobbler",children:"Authenticate Spotify with Multi-Scrobbler"})," (outside these Redirect Instructions) go to ",(0,s.jsx)(t.strong,{children:"Step 4"})," and continue the instructions"]}),"\n"]}),"\n"]}),(0,s.jsxs)(t.p,{children:["Eventually, Spotify will redirect you to a web page with a URL like ",(0,s.jsx)(t.code,{children:"http://127.0.0.1:5079/callback?code=xxxxxx..."})]}),(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"echo",src:i(2538).Z+"",width:"560",height:"521"})}),(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsxs)(t.li,{children:["In the URL, replace ",(0,s.jsx)(t.code,{children:"127.0.0.1:5079"})," with the address/IP for your multi-scrobbler instance so the URL is similar to ",(0,s.jsx)(t.code,{children:"http://192.168.0.101:9078/callback?code=xxxxxx..."}),". Then navigate to this URL to complete authentication."]}),"\n"]})]}),(0,s.jsxs)(c.default,{value:"msEcho",label:"Echo from echo.multi-scrobbler.app",children:[(0,s.jsxs)(t.p,{children:["For your convenience, I run the ",(0,s.jsx)(t.a,{href:"https://github.com/mendhak/docker-http-https-echo",children:(0,s.jsx)(t.code,{children:"mendhak/http-https-echo:36"})})," container from the ",(0,s.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,s.jsx)(t.strong,{children:"Echo"})})," approach on a domain I, the multi-scrobbler developer ",(0,s.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"}),", control and self-host. Please be aware:"]}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["I ",(0,s.jsx)(t.strong,{children:"do not collect personal data"})," or any querystrings/data sent in requests to this site"]}),"\n",(0,s.jsxs)(t.li,{children:["It's ",(0,s.jsx)(t.strong,{children:"not possible"})," for me to use the code sent by Spotify to this URL without also having your Client ID/Secret"]}),"\n",(0,s.jsxs)(t.li,{children:["However, there is ",(0,s.jsx)(t.strong,{children:"always"})," risk involved with trusting a service you do not control. Evaluate the risk of using this site for yourself."]}),"\n"]}),(0,s.jsxs)(t.p,{children:["Use the ",(0,s.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,s.jsx)(t.strong,{children:"Echo"})})," approach, starting from ",(0,s.jsx)(t.strong,{children:"Step 2"}),", with ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"https://echo.multi-scrobbler.app/callback",children:"https://echo.multi-scrobbler.app/callback"})})," as Spotify Redirect URI and multi-scrobbler ",(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV."]})]})]})]}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Save your new App, then copy the Client ID/Secret from the App's Basic Information page."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Add the Client ID, Secret, and Redirect URI to the respective field/ENV in the ",(0,s.jsx)(t.a,{href:"#configuration",children:"configuration section below"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Start multi-scrobbler, then visit the Web Dashboard and click ",(0,s.jsx)(t.strong,{children:"(Re)authenticate"})," on the Spotify card to start the auth process"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(r,{config:"SpotifySourceConfig",fileContent:l.Z,name:"spotify",children:(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Environmental Variable"}),(0,s.jsx)(t.th,{children:"Required?"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SPOTIFY_CLIENT_ID"})}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SPOTIFY_CLIENT_SECRET"})}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"http://localhost:9078/callback"})}),(0,s.jsxs)(t.td,{children:["URI must end in ",(0,s.jsx)(t.code,{children:"callback"})]})]})]})]})})]})}function x(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}function f(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},21863:function(e,t,i){i.d(t,{Z:()=>s}),i(67294);var r=i(85893);function s(e){return(0,r.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}},51952:function(e,t,i){i.d(t,{Z:()=>r});let r='[\n {\n "name": "MySpotify",\n "enable": true,\n "clients": [],\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n }\n]\n'},2538:function(e,t,i){i.d(t,{Z:()=>r});let r=i.p+"assets/images/echo-08989f35a8e831d1991e0aa90d40d07a.png"}}]);
-1
assets/js/778b0fa6.6fbcc7c2.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3989"],{66833:function(e,t,i){i.r(t),i.d(t,{frontMatter:()=>a,default:()=>x,toc:()=>p,metadata:()=>r,assets:()=>d,contentTitle:()=>h});var r=JSON.parse('{"id":"configuration/sources/spotify","title":"Spotify","description":"Spotify and Automix","source":"@site/docs/configuration/sources/spotify.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/spotify","permalink":"/multi-scrobbler/configuration/sources/spotify","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/spotify.mdx","tags":[],"version":"current","frontMatter":{"title":"Spotify","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/sources/rocksky-source"},"next":{"title":"Subsonic","permalink":"/multi-scrobbler/configuration/sources/subsonic"}}'),s=i(85893),n=i(50065),o=i(703),c=i(73752);i(75752);var l=i(51952);let a={title:"Spotify",toc_min_heading_level:2,toc_max_heading_level:5},h=void 0,d={},p=[{value:"Authenticate Spotify with Multi-Scrobbler",id:"authenticate-spotify-with-multi-scrobbler",level:4},{value:"Configuration",id:"configuration",level:2}];function u(e){let t={a:"a",code:"code",h2:"h2",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components},{Config:r,Details:a}=t;return r||f("Config",!0),a||f("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(a,{children:[(0,s.jsx)("summary",{children:"Spotify and Automix"}),(0,s.jsxs)(t.p,{children:["If your Spotify player has ",(0,s.jsx)(t.a,{href:"https://community.spotify.com/t5/FAQs/What-is-Automix/ta-p/5257278",children:"Automix"}),' enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is "mixed" in your queue with a shorter play time than its actual length and ',(0,s.jsx)(t.a,{href:"https://community.spotify.com/t5/Spotify-for-Developers/Wrong-duration-ms-of-track-with-Automix/m-p/5429147",children:"Spotify does not report this modified play time in its API."})," This ",(0,s.jsx)(t.strong,{children:"does not affect MS's ability to scrobble"})," from Spotify but it will affect the accuracy of the duration MS reports was played."]})]}),"\n",(0,s.jsx)(t.h4,{id:"authenticate-spotify-with-multi-scrobbler",children:"Authenticate Spotify with Multi-Scrobbler"}),"\n",(0,s.jsxs)(t.p,{children:["To access your Spotify history you must ",(0,s.jsx)(t.a,{href:"https://developer.spotify.com/dashboard",children:"create a Spotify App"})," to get a\nClient ID/Secret."]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsxs)(t.strong,{children:["Login to ",(0,s.jsx)(t.a,{href:"https://developer.spotify.com",children:"https://developer.spotify.com"})]})," with your existing Spotify account and accept Developer Terms"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Navigate to your Spotify Developer ",(0,s.jsx)(t.a,{href:"https://developer.spotify.com/dashboard",children:"Dashboard"})," and start the ",(0,s.jsx)(t.strong,{children:"Create App"})," process"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Determine the correct ",(0,s.jsx)(t.strong,{children:"Redirect URI"})," to use and set it in your App settings"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(a,{children:[(0,s.jsx)("summary",{children:"Redirect URI Instructions"}),(0,s.jsxs)(t.p,{children:["A Redirect URI is the URL that Spotify will navigate your ",(0,s.jsx)(t.strong,{children:"browser"})," to after you complete authorization. The URL will contain the code necessary for multi-scrobbler to get a Spotify access token."]}),(0,s.jsxs)(t.p,{children:["Spotify ",(0,s.jsx)(t.a,{href:"https://developer.spotify.com/documentation/web-api/tutorials/migration-insecure-redirect-uri",children:(0,s.jsx)(t.strong,{children:"no longer allows insecure URIs"})})," (start with ",(0,s.jsx)(t.code,{children:"http://"}),") unless the address is ",(0,s.jsx)(t.code,{children:"127.0.0.1"})," -- so ",(0,s.jsx)(t.code,{children:"localhost"})," and internal IPs (",(0,s.jsx)(t.code,{children:"192.168.0.xxx"}),") no longer work."]}),(0,s.jsxs)(t.p,{children:["Use ",(0,s.jsx)(t.strong,{children:"one"})," of the following methods to specify a valid Redirect URI and complete Spotify authentication with multi-scrobbler:"]}),(0,s.jsxs)(o.default,{groupId:"spotifyRedirect",queryString:!0,children:[(0,s.jsxs)(c.default,{value:"https",label:"HTTPS",children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Use a domain you control, with SSL certificates/HTTPS enabled, to create a valid redirect URI."})}),(0,s.jsxs)(t.p,{children:["For example, if you are already running multi-scrobbler behind a reverse proxy (nginx/traefik/caddy) at ",(0,s.jsx)(t.code,{children:"https://scrobbler.mydomain.com"})," then set the Spotify Redirect URI for your Spotify App, and multi-scrobbler ",(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV, to ",(0,s.jsx)(t.code,{children:"https://scrobbler.mydomain.com/callback"})]}),(0,s.jsxs)(t.p,{children:["Alternatively, if multi-scrobbler is not accessible behind your domain, then use the ",(0,s.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,s.jsx)(t.strong,{children:"Echo"})})," method with your own domain instead of 127.0.0.1."]})]}),(0,s.jsxs)(c.default,{value:"local",label:"Run MS Locally",children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Run multi-scrobbler, configured for a Spotify Source, from the same machine as your browser in order to get credentials."})}),(0,s.jsxs)(t.p,{children:["In this scenario you can use ",(0,s.jsx)(t.code,{children:"http://127.0.0.1:9078/callback"})," as the Spotify Redirect URI and multi-scrobbler ",(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV."]}),(0,s.jsxs)(t.p,{children:["After completing authentication, copy the contents of local multi-scrobbler's ",(0,s.jsx)(t.a,{href:"/installation#storage",children:"configuration folder"})," to the final location of where multi-scrobbler will be run."]})]}),(0,s.jsxs)(c.default,{value:"echo",label:"Echo",children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:'Use a docker container on the same machine your browser is on to "intercept" the callback URL from Spotify authentication, then manually finish the process by changing the domain to your multi-scrobbler instance.'})}),(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Create a container on the same machine as your browser using the ",(0,s.jsx)(t.a,{href:"https://github.com/mendhak/docker-http-https-echo",children:(0,s.jsx)(t.code,{children:"mendhak/http-https-echo:36"})})," image. This container runs a simple HTTP server that echos back any request it recieves."]}),"\n"]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",children:"docker run --rm -p 127.0.0.1:5079:8080 mendhak/http-https-echo:36\n"})}),(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Set the Spotify Redirect URI and multi-scrobbler ",(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV as ",(0,s.jsx)(t.code,{children:"http://127.0.0.1:5079/callback"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In ",(0,s.jsx)(t.a,{href:"#authenticate-spotify-with-multi-scrobbler",children:"Authenticate Spotify with Multi-Scrobbler"})," (outside these Redirect Instructions) go to ",(0,s.jsx)(t.strong,{children:"Step 4"})," and continue the instructions"]}),"\n"]}),"\n"]}),(0,s.jsxs)(t.p,{children:["Eventually, Spotify will redirect you to a web page with a URL like ",(0,s.jsx)(t.code,{children:"http://127.0.0.1:5079/callback?code=xxxxxx..."})]}),(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"echo",src:i(2538).Z+"",width:"560",height:"521"})}),(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsxs)(t.li,{children:["In the URL, replace ",(0,s.jsx)(t.code,{children:"127.0.0.1:5079"})," with the address/IP for your multi-scrobbler instance so the URL is similar to ",(0,s.jsx)(t.code,{children:"http://192.168.0.101:9078/callback?code=xxxxxx..."}),". Then navigate to this URL to complete authentication."]}),"\n"]})]}),(0,s.jsxs)(c.default,{value:"msEcho",label:"Echo from echo.multi-scrobbler.app",children:[(0,s.jsxs)(t.p,{children:["For your convenience, I run the ",(0,s.jsx)(t.a,{href:"https://github.com/mendhak/docker-http-https-echo",children:(0,s.jsx)(t.code,{children:"mendhak/http-https-echo:36"})})," container from the ",(0,s.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,s.jsx)(t.strong,{children:"Echo"})})," approach on a domain I, the multi-scrobbler developer ",(0,s.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"}),", control and self-host. Please be aware:"]}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["I ",(0,s.jsx)(t.strong,{children:"do not collect personal data"})," or any querystrings/data sent in requests to this site"]}),"\n",(0,s.jsxs)(t.li,{children:["It's ",(0,s.jsx)(t.strong,{children:"not possible"})," for me to use the code sent by Spotify to this URL without also having your Client ID/Secret"]}),"\n",(0,s.jsxs)(t.li,{children:["However, there is ",(0,s.jsx)(t.strong,{children:"always"})," risk involved with trusting a service you do not control. Evaluate the risk of using this site for yourself."]}),"\n"]}),(0,s.jsxs)(t.p,{children:["Use the ",(0,s.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,s.jsx)(t.strong,{children:"Echo"})})," approach, starting from ",(0,s.jsx)(t.strong,{children:"Step 2"}),", with ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"https://echo.multi-scrobbler.app/callback",children:"https://echo.multi-scrobbler.app/callback"})})," as Spotify Redirect URI and multi-scrobbler ",(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV."]})]})]})]}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Save your new App, then copy the Client ID/Secret from the App's Basic Information page."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Add the Client ID, Secret, and Redirect URI to the respective field/ENV in the ",(0,s.jsx)(t.a,{href:"#configuration",children:"configuration section below"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Start multi-scrobbler, then visit the Web Dashboard and click ",(0,s.jsx)(t.strong,{children:"(Re)authenticate"})," on the Spotify card to start the auth process"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(r,{config:"SpotifySourceConfig",fileContent:l.Z,name:"spotify",children:(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Environmental Variable"}),(0,s.jsx)(t.th,{children:"Required?"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SPOTIFY_CLIENT_ID"})}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SPOTIFY_CLIENT_SECRET"})}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"http://localhost:9078/callback"})}),(0,s.jsxs)(t.td,{children:["URI must end in ",(0,s.jsx)(t.code,{children:"callback"})]})]})]})]})})]})}function x(e={}){let{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}function f(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},51952:function(e,t,i){i.d(t,{Z:()=>r});let r='[\n {\n "name": "MySpotify",\n "enable": true,\n "clients": [],\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n }\n]\n'},2538:function(e,t,i){i.d(t,{Z:()=>r});let r=i.p+"assets/images/echo-08989f35a8e831d1991e0aa90d40d07a.png"}}]);
+1 -1
assets/js/7971.d6d41a5a.js assets/js/7971.bbd67a34.js
··· 1 - (()=>{"use strict";var e,r,t,n,o,s={81005:function(e,r,t){t.d(r,{J:()=>s,_k:()=>n,bJ:()=>u,dK:()=>o,qo:()=>i}),t(31336);let n=[],o=["en"],s="search-index{dir}.json?_=784ac775",i=8,u=1}},i={};function u(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={exports:{}};return s[e](t,t.exports,u),t.exports}u.m=s,u.x=()=>{var e=u.O(void 0,["842"],function(){return u(75020)});return u.O(e)},u.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return u.d(r,{a:r}),r},u.d=(e,r)=>{for(var t in r)u.o(r,t)&&!u.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},u.f={},u.e=e=>Promise.all(Object.keys(u.f).reduce((r,t)=>(u.f[t](e,r),r),[])),u.u=e=>"assets/js/"+e+".241b89af.js",u.miniCssF=e=>""+e+".css",u.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e=[],u.O=(r,t,n,o)=>{if(t){o=o||0;for(var s=e.length;s>0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[t,n,o];return}for(var i=1/0,s=0;s<e.length;s++){for(var t=e[s][0],n=e[s][1],o=e[s][2],a=!0,f=0;f<t.length;f++)(!1&o||i>=o)&&Object.keys(u.O).every(e=>u.O[e](t[f]))?t.splice(f--,1):(a=!1,o<i&&(i=o));if(a){e.splice(s--,1);var c=n();void 0!==c&&(r=c)}}return r},u.p="/multi-scrobbler/",u.rv=()=>"1.4.6",r=u.x,u.x=()=>u.e("842").then(r),u.gca=function(e){return e=({})[e]||e,u.p+u.u(e)},t={7971:1},u.f.i=(e,r)=>{t[e]||importScripts(u.p+u.u(e))},o=(n=self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push.bind(n),n.push=e=>{var r=e[0],n=e[1],s=e[2];for(var i in n)u.o(n,i)&&(u.m[i]=n[i]);for(s&&s(u);r.length;)t[r.pop()]=1;o(e)},u.x()})(); 1 + (()=>{"use strict";var e,r,t,n,o,s={81005:function(e,r,t){t.d(r,{J:()=>s,_k:()=>n,bJ:()=>u,dK:()=>o,qo:()=>i}),t(31336);let n=[],o=["en"],s="search-index{dir}.json?_=d820d7e2",i=8,u=1}},i={};function u(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={exports:{}};return s[e](t,t.exports,u),t.exports}u.m=s,u.x=()=>{var e=u.O(void 0,["842"],function(){return u(75020)});return u.O(e)},u.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return u.d(r,{a:r}),r},u.d=(e,r)=>{for(var t in r)u.o(r,t)&&!u.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},u.f={},u.e=e=>Promise.all(Object.keys(u.f).reduce((r,t)=>(u.f[t](e,r),r),[])),u.u=e=>"assets/js/"+e+".241b89af.js",u.miniCssF=e=>""+e+".css",u.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e=[],u.O=(r,t,n,o)=>{if(t){o=o||0;for(var s=e.length;s>0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[t,n,o];return}for(var i=1/0,s=0;s<e.length;s++){for(var t=e[s][0],n=e[s][1],o=e[s][2],a=!0,f=0;f<t.length;f++)(!1&o||i>=o)&&Object.keys(u.O).every(e=>u.O[e](t[f]))?t.splice(f--,1):(a=!1,o<i&&(i=o));if(a){e.splice(s--,1);var p=n();void 0!==p&&(r=p)}}return r},u.p="/multi-scrobbler/",u.rv=()=>"1.4.6",r=u.x,u.x=()=>u.e("842").then(r),u.gca=function(e){return e=({})[e]||e,u.p+u.u(e)},t={7971:1},u.f.i=(e,r)=>{t[e]||importScripts(u.p+u.u(e))},o=(n=self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push.bind(n),n.push=e=>{var r=e[0],n=e[1],s=e[2];for(var i in n)u.o(n,i)&&(u.m[i]=n[i]);for(s&&s(u);r.length;)t[r.pop()]=1;o(e)},u.x()})();
+1
assets/js/7b4f75c2.b94d1530.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3748"],{62494:function(e,i,n){n.r(i),n.d(i,{frontMatter:()=>l,default:()=>u,toc:()=>a,metadata:()=>t,assets:()=>d,contentTitle:()=>o});var t=JSON.parse('{"id":"configuration/clients/librefm","title":"Libre.fm","description":"* To monitor and re-scrobble activity from your Libre.fm account create a Libre.fm (Source)","source":"@site/docs/configuration/clients/librefm.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/librefm","permalink":"/multi-scrobbler/configuration/clients/librefm","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/librefm.mdx","tags":[],"version":"current","frontMatter":{"title":"Libre.fm","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Last.fm","permalink":"/multi-scrobbler/configuration/clients/lastfm"},"next":{"title":"Listenbrainz","permalink":"/multi-scrobbler/configuration/clients/listenbrainz"}}'),r=n(85893),c=n(50065);n(703),n(73752),n(75752);var s=n(59162);let l={title:"Libre.fm",toc_min_heading_level:2,toc_max_heading_level:5},o=void 0,d={},a=[{value:"Callback/Redirect URL",id:"callbackredirect-url",level:3},{value:"Custom Libre.fm instance",id:"custom-librefm-instance",level:3},{value:"Configuration",id:"configuration",level:2}];function h(e){let i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,c.a)(),...e.components},{Config:n,Details:t}=i;return n||b("Config",!0),t||b("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.admonition,{title:"Other Users",type:"tip",children:(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["To monitor and re-scrobble activity from your Libre.fm account create a ",(0,r.jsx)(i.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm (Source)"})]}),"\n"]})}),"\n",(0,r.jsxs)(i.p,{children:["To use the official ",(0,r.jsx)(i.a,{href:"https://libre.fm/",children:"Libre.fm"})," instance you will need an account. Or, you can run your own Libre.fm instance ",(0,r.jsx)(i.a,{href:"https://github.com/foocorp/gnu-fm",children:"using the legacy source code"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["No API account, ",(0,r.jsx)(i.a,{href:"https://github.com/libre-fm/developer/wiki/Libre.fm-fundamentals#api-keys",children:"API Key, or Secret"})," is needed to use the Libre.fm API. Instead, use ",(0,r.jsx)(i.strong,{children:"any values"})," for API Key/Secret in the configuration. Authentication is done by allowing access from your account on redirect."]}),"\n",(0,r.jsx)(i.h3,{id:"callbackredirect-url",children:"Callback/Redirect URL"}),"\n",(0,r.jsxs)(i.p,{children:["The Redirect (Callback) URL is used to redirect your ",(0,r.jsx)(i.strong,{children:"browser"})," to multi-scrobbler after authentication has completed."]}),"\n",(0,r.jsxs)(i.p,{children:["So, the ",(0,r.jsx)(i.em,{children:"base of the URL"})," you use should be the ",(0,r.jsx)(i.em,{children:"same"})," as the URL you would use to navigate to the multi-scrobbler dashboard."]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(i.p,{children:["If you can visit the multi-scrobbler dashboard by navigating to ",(0,r.jsx)(i.a,{href:"http://192.168.0.100:9078",children:"http://192.168.0.100:9078"})," in your web browser..."]}),(0,r.jsxs)(i.p,{children:["then the ENV ",(0,r.jsx)(i.code,{children:"LIBREFM_REDIRECT_URI"}),", or ",(0,r.jsx)(i.code,{children:"redirectUri"})," for libre.fm json config, should be"]}),(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"http://192.168.0.100:9078/librefm/callback\n"})})]}),"\n",(0,r.jsxs)(i.p,{children:["The Redirect URL can be explicitly specified in the configuration below, or by using the global ",(0,r.jsx)(i.a,{href:"/configuration#base-url",children:"Base URL"})," setting."]}),"\n",(0,r.jsx)(i.h3,{id:"custom-librefm-instance",children:"Custom Libre.fm instance"}),"\n",(0,r.jsxs)(i.p,{children:["If you are ",(0,r.jsx)(i.strong,{children:"not"})," using the official Libre.fm instance then specify your custom instance using ENV ",(0,r.jsx)(i.code,{children:"LIBREFM_URLBASE"})," or ",(0,r.jsx)(i.code,{children:"urlBase"})," property in the ",(0,r.jsx)(i.code,{children:"data"})," section in File/AIO config."]}),"\n",(0,r.jsxs)(i.p,{children:["The value should be ",(0,r.jsx)(i.code,{children:"protocol://libre.tld/path/prefix"})," EX:"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"https://my.cool.libre.com/2.0/\n"})}),"\n",(0,r.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n,{config:"LibrefmClientConfig",fileContent:s.Z,client:!0,name:"librefm",children:(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Environmental Variable"}),(0,r.jsx)(i.th,{children:"Required?"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"LIBREFM_ENABLE"})}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{}),(0,r.jsxs)(i.td,{children:["Set to ",(0,r.jsx)(i.code,{children:"true"})," to enable Libre.fm, if not using any of the below variables"]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"LIBREFM_API_KEY"})}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"anything"})}),(0,r.jsx)(i.td,{children:"Optional API Key"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"LIBREFM_SECRET"})}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"anything"})}),(0,r.jsx)(i.td,{children:"Optional shared secret"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"LIBREFM_REDIRECT_URI"})}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"http://localhost:9078/librefm/callback"})}),(0,r.jsxs)(i.td,{children:["Url to use for authentication. Must include ",(0,r.jsx)(i.code,{children:"librefm/callback"})," somewhere in it"]})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"LIBREFM_SESSION"})}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"Session id. Will be generated by authentication flow if not provided."})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:(0,r.jsx)(i.code,{children:"LIBREFM_URLBASE"})}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{}),(0,r.jsxs)(i.td,{children:["Use for custom Libre.fm instance only. The host + path prefix EX ",(0,r.jsx)(i.code,{children:"https://my.libre.example/2.0/"})]})]})]})]})})]})}function u(e={}){let{wrapper:i}={...(0,c.a)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}function b(e,i){throw Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},59162:function(e,i,n){n.d(i,{Z:()=>t});let t='[\n {\n "name": "myLibreFmClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "apiKey": "anything",\n "secret": "anything",\n "redirectUri": "http://localhost:9078/librefm/callback"\n }\n },\n {\n "name": "myLibreFmSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "apiKey": "anything",\n "secret": "anything",\n "redirectUri": "http://localhost:9078/librefm/callback"\n }\n }\n]\n'}}]);
-1
assets/js/7d837a1d.08c28abc.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3664"],{67189:function(e){e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Overview","href":"/multi-scrobbler/","docId":"index","unlisted":false},{"type":"link","label":"Quickstart","href":"/multi-scrobbler/quickstart","docId":"quickstart","unlisted":false},{"type":"category","label":"Installation","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"As a Service","href":"/multi-scrobbler/installation/service","docId":"installation/service","unlisted":false}],"href":"/multi-scrobbler/installation/"},{"type":"category","label":"Updating","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/multi-scrobbler/updating/","docId":"updating/updating","unlisted":false}],"href":"/multi-scrobbler/category/updating"},{"type":"category","label":"Configuration","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Scrobble Clients","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Koito","href":"/multi-scrobbler/configuration/clients/koito","docId":"configuration/clients/koito","unlisted":false},{"type":"link","label":"Last.fm","href":"/multi-scrobbler/configuration/clients/lastfm","docId":"configuration/clients/lastfm","unlisted":false},{"type":"link","label":"Listenbrainz","href":"/multi-scrobbler/configuration/clients/listenbrainz","docId":"configuration/clients/listenbrainz","unlisted":false},{"type":"link","label":"Maloja","href":"/multi-scrobbler/configuration/clients/maloja","docId":"configuration/clients/maloja","unlisted":false},{"type":"link","label":"Rocksky","href":"/multi-scrobbler/configuration/clients/rocksky","docId":"configuration/clients/rocksky","unlisted":false},{"type":"link","label":"Teal.fm","href":"/multi-scrobbler/configuration/clients/tealfm","docId":"configuration/clients/tealfm","unlisted":false}],"href":"/multi-scrobbler/configuration/clients/"},{"type":"category","label":"Scrobble Sources","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Azuracast","href":"/multi-scrobbler/configuration/sources/azuracast","docId":"configuration/sources/azuracast","unlisted":false},{"type":"link","label":"Deezer","href":"/multi-scrobbler/configuration/sources/deezer","docId":"configuration/sources/deezer","unlisted":false},{"type":"link","label":"Google Cast (Chromecast)","href":"/multi-scrobbler/configuration/sources/google-cast","docId":"configuration/sources/google-cast","unlisted":false},{"type":"link","label":"Icecast","href":"/multi-scrobbler/configuration/sources/icecast","docId":"configuration/sources/icecast","unlisted":false},{"type":"link","label":"Jellyfin","href":"/multi-scrobbler/configuration/sources/jellyfin","docId":"configuration/sources/jellyfin","unlisted":false},{"type":"link","label":"JRiver","href":"/multi-scrobbler/configuration/sources/jriver","docId":"configuration/sources/jriver","unlisted":false},{"type":"link","label":"Kodi","href":"/multi-scrobbler/configuration/sources/kodi","docId":"configuration/sources/kodi","unlisted":false},{"type":"link","label":"Koito","href":"/multi-scrobbler/configuration/sources/koito-source","docId":"configuration/sources/koito-source","unlisted":false},{"type":"link","label":"Lastfm (Endpoint)","href":"/multi-scrobbler/configuration/sources/lastfm-endpoint","docId":"configuration/sources/lastfm-endpoint","unlisted":false},{"type":"link","label":"Lastfm","href":"/multi-scrobbler/configuration/sources/lastfm-source","docId":"configuration/sources/lastfm-source","unlisted":false},{"type":"link","label":"Listenbrainz (Endpoint)","href":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint","docId":"configuration/sources/listenbrainz-endpoint","unlisted":false},{"type":"link","label":"Listenbrainz","href":"/multi-scrobbler/configuration/sources/listenbrainz-source","docId":"configuration/sources/listenbrainz-source","unlisted":false},{"type":"link","label":"Maloja","href":"/multi-scrobbler/configuration/sources/maloja","docId":"configuration/sources/maloja","unlisted":false},{"type":"link","label":"Mopidy","href":"/multi-scrobbler/configuration/sources/mopidy","docId":"configuration/sources/mopidy","unlisted":false},{"type":"link","label":"MPD (Music Player Daemon)","href":"/multi-scrobbler/configuration/sources/mpd","docId":"configuration/sources/mpd","unlisted":false},{"type":"link","label":"MPRIS","href":"/multi-scrobbler/configuration/sources/mpris","docId":"configuration/sources/mpris","unlisted":false},{"type":"link","label":"Musikcube","href":"/multi-scrobbler/configuration/sources/musikcube","docId":"configuration/sources/musikcube","unlisted":false},{"type":"link","label":"Plex","href":"/multi-scrobbler/configuration/sources/plex","docId":"configuration/sources/plex","unlisted":false},{"type":"link","label":"Rocksky","href":"/multi-scrobbler/configuration/sources/rocksky-source","docId":"configuration/sources/rocksky-source","unlisted":false},{"type":"link","label":"Spotify","href":"/multi-scrobbler/configuration/sources/spotify","docId":"configuration/sources/spotify","unlisted":false},{"type":"link","label":"Subsonic","href":"/multi-scrobbler/configuration/sources/subsonic","docId":"configuration/sources/subsonic","unlisted":false},{"type":"link","label":"Teal.fm","href":"/multi-scrobbler/configuration/sources/tealfm-source","docId":"configuration/sources/tealfm-source","unlisted":false},{"type":"link","label":"VLC","href":"/multi-scrobbler/configuration/sources/vlc","docId":"configuration/sources/vlc","unlisted":false},{"type":"link","label":"Webscrobbler","href":"/multi-scrobbler/configuration/sources/webscrobbler","docId":"configuration/sources/webscrobbler","unlisted":false},{"type":"link","label":"Yamaha MusicCast","href":"/multi-scrobbler/configuration/sources/yamaha-musiccast","docId":"configuration/sources/yamaha-musiccast","unlisted":false},{"type":"link","label":"Youtube Music","href":"/multi-scrobbler/configuration/sources/youtube-music","docId":"configuration/sources/youtube-music","unlisted":false}],"href":"/multi-scrobbler/configuration/sources/"},{"type":"link","label":"Kitchen Sink","href":"/multi-scrobbler/configuration/kitchensink","docId":"configuration/kitchensink","unlisted":false},{"type":"category","label":"Enhance Scrobbles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Musicbrainz Stage","href":"/multi-scrobbler/configuration/transforms/musicbrainz","docId":"configuration/transforms/musicbrainz","unlisted":false},{"type":"link","label":"Native Stage","href":"/multi-scrobbler/configuration/transforms/native","docId":"configuration/transforms/native","unlisted":false},{"type":"link","label":"User Stage","href":"/multi-scrobbler/configuration/transforms/user","docId":"configuration/transforms/user","unlisted":false}],"href":"/multi-scrobbler/configuration/transforms/"}],"href":"/multi-scrobbler/configuration/"},{"type":"category","label":"Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Common Development","href":"/multi-scrobbler/development/dev-common","docId":"development/dev-common","unlisted":false},{"type":"link","label":"Source Development/Tutorial","href":"/multi-scrobbler/development/dev-source","docId":"development/dev-source","unlisted":false},{"type":"link","label":"Client Development/Tutorial","href":"/multi-scrobbler/development/dev-client","docId":"development/dev-client","unlisted":false},{"type":"link","label":"Flatpak","href":"/multi-scrobbler/development/flatpak","docId":"development/flatpak","unlisted":false}],"href":"/multi-scrobbler/category/development"},{"type":"link","label":"FAQ","href":"/multi-scrobbler/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"Config Playground","href":"/playground"}]},"docs":{"configuration/clients/clients":{"id":"configuration/clients/clients","title":"Overview","description":"A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz...","sidebar":"tutorialSidebar"},"configuration/clients/koito":{"id":"configuration/clients/koito","title":"Koito","description":"To monitor and re-scrobble activity from a Koito account create a Koito (Source)","sidebar":"tutorialSidebar"},"configuration/clients/lastfm":{"id":"configuration/clients/lastfm","title":"Last.fm","description":"* To monitor and re-scrobble activity from your Last.fm account create a Last.fm (Source)","sidebar":"tutorialSidebar"},"configuration/clients/listenbrainz":{"id":"configuration/clients/listenbrainz","title":"Listenbrainz","description":"* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)","sidebar":"tutorialSidebar"},"configuration/clients/maloja":{"id":"configuration/clients/maloja","title":"Maloja","description":"Setup a Maloja server if you have not already done this.","sidebar":"tutorialSidebar"},"configuration/clients/rocksky":{"id":"configuration/clients/rocksky","title":"Rocksky","description":"To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)","sidebar":"tutorialSidebar"},"configuration/clients/tealfm":{"id":"configuration/clients/tealfm","title":"Teal.fm","description":"To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source)","sidebar":"tutorialSidebar"},"configuration/configuration":{"id":"configuration/configuration","title":"Overview","description":"Check the FAQ if you have any issues after configuration!","sidebar":"tutorialSidebar"},"configuration/kitchensink":{"id":"configuration/kitchensink","title":"Kitchen Sink","description":"Scenario:","sidebar":"tutorialSidebar"},"configuration/sources/azuracast":{"id":"configuration/sources/azuracast","title":"Azuracast","description":"Azuracast may not correctly report track length or position. If this is the case you should reduce the \\"listened to\\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly.","sidebar":"tutorialSidebar"},"configuration/sources/deezer":{"id":"configuration/sources/deezer","title":"Deezer","description":"This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer\'s TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk.","sidebar":"tutorialSidebar"},"configuration/sources/google-cast":{"id":"configuration/sources/google-cast","title":"Google Cast (Chromecast)","description":"If your media device can be Cast to using this button Chromecast Icon on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play.","sidebar":"tutorialSidebar"},"configuration/sources/icecast":{"id":"configuration/sources/icecast","title":"Icecast","description":"Parse metadata from any Icecast Station (streams) to use for scrobbling.","sidebar":"tutorialSidebar"},"configuration/sources/jellyfin":{"id":"configuration/sources/jellyfin","title":"Jellyfin","description":"Must be using Jellyfin 10.7 or greater","sidebar":"tutorialSidebar"},"configuration/sources/jriver":{"id":"configuration/sources/jriver","title":"JRiver","description":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can can be in the JRiver GUI:","sidebar":"tutorialSidebar"},"configuration/sources/kodi":{"id":"configuration/sources/kodi","title":"Kodi","description":"In order for multi-scrobbler to communicate with Kodi you must have the Web Interface enabled. This can be done in the Kodi GUI:","sidebar":"tutorialSidebar"},"configuration/sources/koito-source":{"id":"configuration/sources/koito-source","title":"Koito","description":"This Source monitors a Koito account\'s scrobble history and then re-scrobbles discovered tracks to configured Clients.","sidebar":"tutorialSidebar"},"configuration/sources/lastfm-endpoint":{"id":"configuration/sources/lastfm-endpoint","title":"Lastfm (Endpoint)","description":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server.","sidebar":"tutorialSidebar"},"configuration/sources/lastfm-source":{"id":"configuration/sources/lastfm-source","title":"Lastfm","description":"This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients.","sidebar":"tutorialSidebar"},"configuration/sources/listenbrainz-endpoint":{"id":"configuration/sources/listenbrainz-endpoint","title":"Listenbrainz (Endpoint)","description":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server.","sidebar":"tutorialSidebar"},"configuration/sources/listenbrainz-source":{"id":"configuration/sources/listenbrainz-source","title":"Listenbrainz","description":"This Source monitors a Listenbrainz account\'s scrobble history and then re-scrobbles discovered tracks to configured clients.","sidebar":"tutorialSidebar"},"configuration/sources/maloja":{"id":"configuration/sources/maloja","title":"Maloja","description":"To scrobble to a Maloja server, create a Maloja (Client)","sidebar":"tutorialSidebar"},"configuration/sources/mopidy":{"id":"configuration/sources/mopidy","title":"Mopidy","description":"Mopidy is a headless music server that supports playing music from many standard and non-standard sources such as Pandora, Bandcamp, and Tunein.","sidebar":"tutorialSidebar"},"configuration/sources/mpd":{"id":"configuration/sources/mpd","title":"MPD (Music Player Daemon)","description":"MS communicates with MPD using the TCP client connection.","sidebar":"tutorialSidebar"},"configuration/sources/mpris":{"id":"configuration/sources/mpris","title":"MPRIS","description":"MPRIS is a standard interface for communicating with Music Players on linux operating systems.","sidebar":"tutorialSidebar"},"configuration/sources/musikcube":{"id":"configuration/sources/musikcube","title":"Musikcube","description":"In order to use Musikcube configure it to accept websocket connections in server setup:","sidebar":"tutorialSidebar"},"configuration/sources/plex":{"id":"configuration/sources/plex","title":"Plex","description":"Find your Plex Token and make note of the URL and Port used to connect to your Plex instance.","sidebar":"tutorialSidebar"},"configuration/sources/rocksky-source":{"id":"configuration/sources/rocksky-source","title":"Rocksky","description":"To scrobble to* Rocksky, create a Rocksky (Client)","sidebar":"tutorialSidebar"},"configuration/sources/sources":{"id":"configuration/sources/sources","title":"Overview","description":"A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc...","sidebar":"tutorialSidebar"},"configuration/sources/spotify":{"id":"configuration/sources/spotify","title":"Spotify","description":"Spotify and Automix","sidebar":"tutorialSidebar"},"configuration/sources/subsonic":{"id":"configuration/sources/subsonic","title":"Subsonic","description":"This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome)","sidebar":"tutorialSidebar"},"configuration/sources/tealfm-source":{"id":"configuration/sources/tealfm-source","title":"Teal.fm","description":"To scrobble to* an ATProto PDS, create a teal.fm (Client)","sidebar":"tutorialSidebar"},"configuration/sources/vlc":{"id":"configuration/sources/vlc","title":"VLC","description":"MS communicates with VLC using the Web (http) interface module","sidebar":"tutorialSidebar"},"configuration/sources/webscrobbler":{"id":"configuration/sources/webscrobbler","title":"Webscrobbler","description":"After installing the Webscrobbler extension open the preferences/settings for it:","sidebar":"tutorialSidebar"},"configuration/sources/yamaha-musiccast":{"id":"configuration/sources/yamaha-musiccast","title":"Yamaha MusicCast","description":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs.","sidebar":"tutorialSidebar"},"configuration/sources/youtube-music":{"id":"configuration/sources/youtube-music","title":"Youtube Music","description":"Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser.","sidebar":"tutorialSidebar"},"configuration/transforms/musicbrainz":{"id":"configuration/transforms/musicbrainz","title":"Musicbrainz Stage","description":"The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data.","sidebar":"tutorialSidebar"},"configuration/transforms/native":{"id":"configuration/transforms/native","title":"Native Stage","description":"The Native Stage uses built-in heuristics to try to extract Artists from Play artist/track data.","sidebar":"tutorialSidebar"},"configuration/transforms/transforms":{"id":"configuration/transforms/transforms","title":"Enhancing Scrobbles","description":"Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler\'s lifecycle.","sidebar":"tutorialSidebar"},"configuration/transforms/user":{"id":"configuration/transforms/user","title":"User Stage","description":"The User Stage uses search-and-replace expressions, provided by you, to modify/replace parts of Play data.","sidebar":"tutorialSidebar"},"development/dev-client":{"id":"development/dev-client","title":"Client Development/Tutorial","description":"To do...","sidebar":"tutorialSidebar"},"development/dev-common":{"id":"development/dev-common","title":"Common Development","description":"Start here for MS development","sidebar":"tutorialSidebar"},"development/dev-source":{"id":"development/dev-source","title":"Source Development/Tutorial","description":"This document will provide a step-by-step guide for creating a (trivial) new Source in MS alongside describing what aspects of the Source need to be implemented based on the service you use. Before using this document you should review Common Development.","sidebar":"tutorialSidebar"},"development/flatpak":{"id":"development/flatpak","title":"Flatpak","description":"Building Flatpak App locally","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"FAQ","description":"Connection Issues","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Overview","description":"Latest Release","sidebar":"tutorialSidebar"},"installation/installation":{"id":"installation/installation","title":"Overview","description":"For the difference between ENV and File examples in this document see Configuration Types.","sidebar":"tutorialSidebar"},"installation/service":{"id":"installation/service","title":"As a Service","description":"If you have multi-scrobbler installed locally you can enable it to run as a background service when you login.","sidebar":"tutorialSidebar"},"quickstart":{"id":"quickstart","title":"Quickstart","description":"This guide will get you up and running with multi-scrobbler using Docker and docker compose. At the end of the guide you will have:","sidebar":"tutorialSidebar"},"updating/updating":{"id":"updating/updating","title":"Overview","description":"Updating","sidebar":"tutorialSidebar"}}}}')}}]);
+1
assets/js/7d837a1d.859e4da7.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["3664"],{67189:function(e){e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Overview","href":"/multi-scrobbler/","docId":"index","unlisted":false},{"type":"link","label":"Quickstart","href":"/multi-scrobbler/quickstart","docId":"quickstart","unlisted":false},{"type":"category","label":"Installation","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"As a Service","href":"/multi-scrobbler/installation/service","docId":"installation/service","unlisted":false}],"href":"/multi-scrobbler/installation/"},{"type":"category","label":"Updating","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/multi-scrobbler/updating/","docId":"updating/updating","unlisted":false}],"href":"/multi-scrobbler/category/updating"},{"type":"category","label":"Configuration","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Scrobble Clients","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Koito","href":"/multi-scrobbler/configuration/clients/koito","docId":"configuration/clients/koito","unlisted":false},{"type":"link","label":"Last.fm","href":"/multi-scrobbler/configuration/clients/lastfm","docId":"configuration/clients/lastfm","unlisted":false},{"type":"link","label":"Libre.fm","href":"/multi-scrobbler/configuration/clients/librefm","docId":"configuration/clients/librefm","unlisted":false},{"type":"link","label":"Listenbrainz","href":"/multi-scrobbler/configuration/clients/listenbrainz","docId":"configuration/clients/listenbrainz","unlisted":false},{"type":"link","label":"Maloja","href":"/multi-scrobbler/configuration/clients/maloja","docId":"configuration/clients/maloja","unlisted":false},{"type":"link","label":"Rocksky","href":"/multi-scrobbler/configuration/clients/rocksky","docId":"configuration/clients/rocksky","unlisted":false},{"type":"link","label":"Teal.fm","href":"/multi-scrobbler/configuration/clients/tealfm","docId":"configuration/clients/tealfm","unlisted":false}],"href":"/multi-scrobbler/configuration/clients/"},{"type":"category","label":"Scrobble Sources","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Azuracast","href":"/multi-scrobbler/configuration/sources/azuracast","docId":"configuration/sources/azuracast","unlisted":false},{"type":"link","label":"Deezer","href":"/multi-scrobbler/configuration/sources/deezer","docId":"configuration/sources/deezer","unlisted":false},{"type":"link","label":"Google Cast (Chromecast)","href":"/multi-scrobbler/configuration/sources/google-cast","docId":"configuration/sources/google-cast","unlisted":false},{"type":"link","label":"Icecast","href":"/multi-scrobbler/configuration/sources/icecast","docId":"configuration/sources/icecast","unlisted":false},{"type":"link","label":"Jellyfin","href":"/multi-scrobbler/configuration/sources/jellyfin","docId":"configuration/sources/jellyfin","unlisted":false},{"type":"link","label":"JRiver","href":"/multi-scrobbler/configuration/sources/jriver","docId":"configuration/sources/jriver","unlisted":false},{"type":"link","label":"Kodi","href":"/multi-scrobbler/configuration/sources/kodi","docId":"configuration/sources/kodi","unlisted":false},{"type":"link","label":"Koito","href":"/multi-scrobbler/configuration/sources/koito-source","docId":"configuration/sources/koito-source","unlisted":false},{"type":"link","label":"Lastfm (Endpoint)","href":"/multi-scrobbler/configuration/sources/lastfm-endpoint","docId":"configuration/sources/lastfm-endpoint","unlisted":false},{"type":"link","label":"Last.fm","href":"/multi-scrobbler/configuration/sources/lastfm-source","docId":"configuration/sources/lastfm-source","unlisted":false},{"type":"link","label":"Libre.fm","href":"/multi-scrobbler/configuration/sources/librefm-source","docId":"configuration/sources/librefm-source","unlisted":false},{"type":"link","label":"Listenbrainz (Endpoint)","href":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint","docId":"configuration/sources/listenbrainz-endpoint","unlisted":false},{"type":"link","label":"Listenbrainz","href":"/multi-scrobbler/configuration/sources/listenbrainz-source","docId":"configuration/sources/listenbrainz-source","unlisted":false},{"type":"link","label":"Maloja","href":"/multi-scrobbler/configuration/sources/maloja","docId":"configuration/sources/maloja","unlisted":false},{"type":"link","label":"Mopidy","href":"/multi-scrobbler/configuration/sources/mopidy","docId":"configuration/sources/mopidy","unlisted":false},{"type":"link","label":"MPD (Music Player Daemon)","href":"/multi-scrobbler/configuration/sources/mpd","docId":"configuration/sources/mpd","unlisted":false},{"type":"link","label":"MPRIS","href":"/multi-scrobbler/configuration/sources/mpris","docId":"configuration/sources/mpris","unlisted":false},{"type":"link","label":"Musikcube","href":"/multi-scrobbler/configuration/sources/musikcube","docId":"configuration/sources/musikcube","unlisted":false},{"type":"link","label":"Plex","href":"/multi-scrobbler/configuration/sources/plex","docId":"configuration/sources/plex","unlisted":false},{"type":"link","label":"Rocksky","href":"/multi-scrobbler/configuration/sources/rocksky-source","docId":"configuration/sources/rocksky-source","unlisted":false},{"type":"link","label":"Spotify","href":"/multi-scrobbler/configuration/sources/spotify","docId":"configuration/sources/spotify","unlisted":false},{"type":"link","label":"Subsonic","href":"/multi-scrobbler/configuration/sources/subsonic","docId":"configuration/sources/subsonic","unlisted":false},{"type":"link","label":"Teal.fm","href":"/multi-scrobbler/configuration/sources/tealfm-source","docId":"configuration/sources/tealfm-source","unlisted":false},{"type":"link","label":"VLC","href":"/multi-scrobbler/configuration/sources/vlc","docId":"configuration/sources/vlc","unlisted":false},{"type":"link","label":"Webscrobbler","href":"/multi-scrobbler/configuration/sources/webscrobbler","docId":"configuration/sources/webscrobbler","unlisted":false},{"type":"link","label":"Yamaha MusicCast","href":"/multi-scrobbler/configuration/sources/yamaha-musiccast","docId":"configuration/sources/yamaha-musiccast","unlisted":false},{"type":"link","label":"Youtube Music","href":"/multi-scrobbler/configuration/sources/youtube-music","docId":"configuration/sources/youtube-music","unlisted":false}],"href":"/multi-scrobbler/configuration/sources/"},{"type":"link","label":"Kitchen Sink","href":"/multi-scrobbler/configuration/kitchensink","docId":"configuration/kitchensink","unlisted":false},{"type":"category","label":"Enhance Scrobbles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Musicbrainz Stage","href":"/multi-scrobbler/configuration/transforms/musicbrainz","docId":"configuration/transforms/musicbrainz","unlisted":false},{"type":"link","label":"Native Stage","href":"/multi-scrobbler/configuration/transforms/native","docId":"configuration/transforms/native","unlisted":false},{"type":"link","label":"User Stage","href":"/multi-scrobbler/configuration/transforms/user","docId":"configuration/transforms/user","unlisted":false}],"href":"/multi-scrobbler/configuration/transforms/"}],"href":"/multi-scrobbler/configuration/"},{"type":"category","label":"Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Common Development","href":"/multi-scrobbler/development/dev-common","docId":"development/dev-common","unlisted":false},{"type":"link","label":"Source Development/Tutorial","href":"/multi-scrobbler/development/dev-source","docId":"development/dev-source","unlisted":false},{"type":"link","label":"Client Development/Tutorial","href":"/multi-scrobbler/development/dev-client","docId":"development/dev-client","unlisted":false},{"type":"link","label":"Flatpak","href":"/multi-scrobbler/development/flatpak","docId":"development/flatpak","unlisted":false}],"href":"/multi-scrobbler/category/development"},{"type":"link","label":"FAQ","href":"/multi-scrobbler/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"Config Playground","href":"/playground"}]},"docs":{"configuration/clients/clients":{"id":"configuration/clients/clients","title":"Overview","description":"A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz...","sidebar":"tutorialSidebar"},"configuration/clients/koito":{"id":"configuration/clients/koito","title":"Koito","description":"To monitor and re-scrobble activity from a Koito account create a Koito (Source)","sidebar":"tutorialSidebar"},"configuration/clients/lastfm":{"id":"configuration/clients/lastfm","title":"Last.fm","description":"* To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a Last.fm (Source)","sidebar":"tutorialSidebar"},"configuration/clients/librefm":{"id":"configuration/clients/librefm","title":"Libre.fm","description":"* To monitor and re-scrobble activity from your Libre.fm account create a Libre.fm (Source)","sidebar":"tutorialSidebar"},"configuration/clients/listenbrainz":{"id":"configuration/clients/listenbrainz","title":"Listenbrainz","description":"* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)","sidebar":"tutorialSidebar"},"configuration/clients/maloja":{"id":"configuration/clients/maloja","title":"Maloja","description":"Setup a Maloja server if you have not already done this.","sidebar":"tutorialSidebar"},"configuration/clients/rocksky":{"id":"configuration/clients/rocksky","title":"Rocksky","description":"To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)","sidebar":"tutorialSidebar"},"configuration/clients/tealfm":{"id":"configuration/clients/tealfm","title":"Teal.fm","description":"To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source)","sidebar":"tutorialSidebar"},"configuration/configuration":{"id":"configuration/configuration","title":"Overview","description":"Check the FAQ if you have any issues after configuration!","sidebar":"tutorialSidebar"},"configuration/kitchensink":{"id":"configuration/kitchensink","title":"Kitchen Sink","description":"Scenario:","sidebar":"tutorialSidebar"},"configuration/sources/azuracast":{"id":"configuration/sources/azuracast","title":"Azuracast","description":"Azuracast may not correctly report track length or position. If this is the case you should reduce the \\"listened to\\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly.","sidebar":"tutorialSidebar"},"configuration/sources/deezer":{"id":"configuration/sources/deezer","title":"Deezer","description":"This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer\'s TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk.","sidebar":"tutorialSidebar"},"configuration/sources/google-cast":{"id":"configuration/sources/google-cast","title":"Google Cast (Chromecast)","description":"If your media device can be Cast to using this button Chromecast Icon on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play.","sidebar":"tutorialSidebar"},"configuration/sources/icecast":{"id":"configuration/sources/icecast","title":"Icecast","description":"Parse metadata from any Icecast Station (streams) to use for scrobbling.","sidebar":"tutorialSidebar"},"configuration/sources/jellyfin":{"id":"configuration/sources/jellyfin","title":"Jellyfin","description":"Must be using Jellyfin 10.7 or greater","sidebar":"tutorialSidebar"},"configuration/sources/jriver":{"id":"configuration/sources/jriver","title":"JRiver","description":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can can be in the JRiver GUI:","sidebar":"tutorialSidebar"},"configuration/sources/kodi":{"id":"configuration/sources/kodi","title":"Kodi","description":"In order for multi-scrobbler to communicate with Kodi you must have the Web Interface enabled. This can be done in the Kodi GUI:","sidebar":"tutorialSidebar"},"configuration/sources/koito-source":{"id":"configuration/sources/koito-source","title":"Koito","description":"This Source monitors a Koito account\'s scrobble history and then re-scrobbles discovered tracks to configured Clients.","sidebar":"tutorialSidebar"},"configuration/sources/lastfm-endpoint":{"id":"configuration/sources/lastfm-endpoint","title":"Lastfm (Endpoint)","description":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server.","sidebar":"tutorialSidebar"},"configuration/sources/lastfm-source":{"id":"configuration/sources/lastfm-source","title":"Last.fm","description":"This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients.","sidebar":"tutorialSidebar"},"configuration/sources/librefm-source":{"id":"configuration/sources/librefm-source","title":"Libre.fm","description":"This Source monitors your Libre.fm scrobble history and re-scrobbles new activity to configured Clients.","sidebar":"tutorialSidebar"},"configuration/sources/listenbrainz-endpoint":{"id":"configuration/sources/listenbrainz-endpoint","title":"Listenbrainz (Endpoint)","description":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server.","sidebar":"tutorialSidebar"},"configuration/sources/listenbrainz-source":{"id":"configuration/sources/listenbrainz-source","title":"Listenbrainz","description":"This Source monitors a Listenbrainz account\'s scrobble history and then re-scrobbles discovered tracks to configured clients.","sidebar":"tutorialSidebar"},"configuration/sources/maloja":{"id":"configuration/sources/maloja","title":"Maloja","description":"To scrobble to a Maloja server, create a Maloja (Client)","sidebar":"tutorialSidebar"},"configuration/sources/mopidy":{"id":"configuration/sources/mopidy","title":"Mopidy","description":"Mopidy is a headless music server that supports playing music from many standard and non-standard sources such as Pandora, Bandcamp, and Tunein.","sidebar":"tutorialSidebar"},"configuration/sources/mpd":{"id":"configuration/sources/mpd","title":"MPD (Music Player Daemon)","description":"MS communicates with MPD using the TCP client connection.","sidebar":"tutorialSidebar"},"configuration/sources/mpris":{"id":"configuration/sources/mpris","title":"MPRIS","description":"MPRIS is a standard interface for communicating with Music Players on linux operating systems.","sidebar":"tutorialSidebar"},"configuration/sources/musikcube":{"id":"configuration/sources/musikcube","title":"Musikcube","description":"In order to use Musikcube configure it to accept websocket connections in server setup:","sidebar":"tutorialSidebar"},"configuration/sources/plex":{"id":"configuration/sources/plex","title":"Plex","description":"Find your Plex Token and make note of the URL and Port used to connect to your Plex instance.","sidebar":"tutorialSidebar"},"configuration/sources/rocksky-source":{"id":"configuration/sources/rocksky-source","title":"Rocksky","description":"To scrobble to* Rocksky, create a Rocksky (Client)","sidebar":"tutorialSidebar"},"configuration/sources/sources":{"id":"configuration/sources/sources","title":"Overview","description":"A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc...","sidebar":"tutorialSidebar"},"configuration/sources/spotify":{"id":"configuration/sources/spotify","title":"Spotify","description":"If your Spotify player has Automix enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is \\"mixed\\" in your queue with a shorter play time than its actual length and Spotify does not report this modified play time in its API. This does not affect MS\'s ability to scrobble from Spotify but it will affect the accuracy of the duration MS reports was played.","sidebar":"tutorialSidebar"},"configuration/sources/subsonic":{"id":"configuration/sources/subsonic","title":"Subsonic","description":"This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome)","sidebar":"tutorialSidebar"},"configuration/sources/tealfm-source":{"id":"configuration/sources/tealfm-source","title":"Teal.fm","description":"To scrobble to* an ATProto PDS, create a teal.fm (Client)","sidebar":"tutorialSidebar"},"configuration/sources/vlc":{"id":"configuration/sources/vlc","title":"VLC","description":"MS communicates with VLC using the Web (http) interface module","sidebar":"tutorialSidebar"},"configuration/sources/webscrobbler":{"id":"configuration/sources/webscrobbler","title":"Webscrobbler","description":"After installing the Webscrobbler extension open the preferences/settings for it:","sidebar":"tutorialSidebar"},"configuration/sources/yamaha-musiccast":{"id":"configuration/sources/yamaha-musiccast","title":"Yamaha MusicCast","description":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs.","sidebar":"tutorialSidebar"},"configuration/sources/youtube-music":{"id":"configuration/sources/youtube-music","title":"Youtube Music","description":"Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser.","sidebar":"tutorialSidebar"},"configuration/transforms/musicbrainz":{"id":"configuration/transforms/musicbrainz","title":"Musicbrainz Stage","description":"The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data.","sidebar":"tutorialSidebar"},"configuration/transforms/native":{"id":"configuration/transforms/native","title":"Native Stage","description":"The Native Stage uses built-in heuristics to try to extract Artists from Play artist/track data.","sidebar":"tutorialSidebar"},"configuration/transforms/transforms":{"id":"configuration/transforms/transforms","title":"Enhancing Scrobbles","description":"Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler\'s lifecycle.","sidebar":"tutorialSidebar"},"configuration/transforms/user":{"id":"configuration/transforms/user","title":"User Stage","description":"The User Stage uses search-and-replace expressions, provided by you, to modify/replace parts of Play data.","sidebar":"tutorialSidebar"},"development/dev-client":{"id":"development/dev-client","title":"Client Development/Tutorial","description":"To do...","sidebar":"tutorialSidebar"},"development/dev-common":{"id":"development/dev-common","title":"Common Development","description":"Start here for MS development","sidebar":"tutorialSidebar"},"development/dev-source":{"id":"development/dev-source","title":"Source Development/Tutorial","description":"This document will provide a step-by-step guide for creating a (trivial) new Source in MS alongside describing what aspects of the Source need to be implemented based on the service you use. Before using this document you should review Common Development.","sidebar":"tutorialSidebar"},"development/flatpak":{"id":"development/flatpak","title":"Flatpak","description":"Building Flatpak App locally","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"FAQ","description":"Connection Issues","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Overview","description":"Latest Release","sidebar":"tutorialSidebar"},"installation/installation":{"id":"installation/installation","title":"Overview","description":"For the difference between ENV and File examples in this document see Configuration Types.","sidebar":"tutorialSidebar"},"installation/service":{"id":"installation/service","title":"As a Service","description":"If you have multi-scrobbler installed locally you can enable it to run as a background service when you login.","sidebar":"tutorialSidebar"},"quickstart":{"id":"quickstart","title":"Quickstart","description":"This guide will get you up and running with multi-scrobbler using Docker and docker compose. At the end of the guide you will have:","sidebar":"tutorialSidebar"},"updating/updating":{"id":"updating/updating","title":"Overview","description":"Updating","sidebar":"tutorialSidebar"}}}}')}}]);
+1
assets/js/812e048c.33bd81e7.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6751"],{30341:function(e,t,n){n.d(t,{ZP:()=>a,d$:()=>l});var i=n(85893),s=n(50065),r=n(11753);let l=[];function o(e){let t={a:"a",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.a,{href:"https://docs.bsky.app/docs/advanced-guides/atproto",children:"AT Protocol"})," is a standard to allow different applications to share and interpret your social data."]}),"\n",(0,i.jsxs)(t.p,{children:["Your data is stored in a personal ",(0,i.jsx)(t.a,{href:"https://atproto.com/guides/data-repos",children:"repository"})," in a ",(0,i.jsx)(t.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),", which is data-type agnostic (it's just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc..."]}),"\n",(0,i.jsxs)(t.p,{children:["Even though the application and the PDS/repository are independent, all of this is done for you automatically when you create a ",(0,i.jsx)(t.a,{href:"https://bsky.social/about",children:"Bluesky"})," account."]}),"\n",(0,i.jsx)(t.p,{children:"So..."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:['multi-scrobbler "scrobbles" your plays to your repository',"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["in a JSON data structure which includes ",(0,i.jsxs)(t.a,{href:"https://atproto.com/specs/lexicon",children:[e.name,"'s data type and structure"]})]}),"\n",(0,i.jsxs)(t.li,{children:["at a ",(0,i.jsxs)(t.a,{href:"https://atproto.com/guides/glossary#collection",children:["known location for ",e.name,"'s data"]})," (",(0,i.jsx)(r.Z,{children:e.lexicon}),"), in a list that is appended to as you continue to scrobble"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["when accessing ",e.name,", or another application that knows how to read it, your data is pulled from the repository to render the app"]}),"\n"]})]})}function a(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},89589:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>a,default:()=>p,toc:()=>h,metadata:()=>i,assets:()=>d,contentTitle:()=>c});var i=JSON.parse('{"id":"configuration/clients/tealfm","title":"Teal.fm","description":"To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source)","source":"@site/docs/configuration/clients/tealfm.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/tealfm","permalink":"/multi-scrobbler/configuration/clients/tealfm","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/tealfm.mdx","tags":[],"version":"current","frontMatter":{"title":"Teal.fm","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/clients/rocksky"},"next":{"title":"Overview","permalink":"/multi-scrobbler/configuration/sources/"}}'),s=n(85893),r=n(50065);n(703),n(73752),n(75752);var l=n(92183),o=n(30341);let a={title:"Teal.fm",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,d={},h=[...o.d$,{value:"Setup",id:"setup",level:2},{value:"Bluesky",id:"bluesky",level:4},{value:"Configuration",id:"configuration",level:2},{value:"Identifier",id:"identifier",level:3}];function u(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components},{Config:n,Details:i,DetailsAdmo:a}=t;return n||f("Config",!0),i||f("Details",!0),a||f("DetailsAdmo",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.admonition,{title:"Other Uses",type:"tip",children:(0,s.jsxs)(t.p,{children:["To monitor and re-scrobble activity from a ATProto Profile create a ",(0,s.jsx)(t.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm (Source)"})]})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://teal.fm/",children:(0,s.jsx)(t.strong,{children:"teal.fm"})})," is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a ",(0,s.jsx)(t.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),"."]}),"\n",(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:"How does that work?"}),(0,s.jsx)(o.ZP,{name:"teal.fm",lexicon:"fm.teal"})]}),"\n",(0,s.jsx)(a,{type:"warning",summary:"Your Data Is Public",children:(0,s.jsxs)(t.p,{children:["The default Bluesky PDS is ",(0,s.jsx)(t.strong,{children:"public"}),", meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy."]})}),"\n",(0,s.jsxs)(a,{type:"note",summary:"teal.fm Is Still In Development",children:[(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://notes.teal.fm/3lzlwe6puis2l",children:"teal.fm is still in developement"})," and does not have a public website, yet."]}),(0,s.jsx)(t.p,{children:"To view your teal.fm scrobbles you can:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["use ",(0,s.jsx)(t.a,{href:"https://wrapped.baileytownsend.dev/",children:"wrapped.baileytownsend.dev"})," which gives a simple stats overview of your scrobbles"]}),"\n",(0,s.jsxs)(t.li,{children:["use ",(0,s.jsx)(t.a,{href:"https://tealfm-slice.wisp.place/",children:"teal-slice.wisp.place"})," for a preview of teal.fm"]}),"\n",(0,s.jsxs)(t.li,{children:["use ",(0,s.jsx)(t.a,{href:"https://atproto.at",children:"atproto.at"})," to view the raw data (convenience URLs are generated in multi-scrobbler for you to do this)"]}),"\n"]})]}),"\n",(0,s.jsx)(t.h2,{id:"setup",children:"Setup"}),"\n",(0,s.jsx)(t.h4,{id:"bluesky",children:"Bluesky"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Create a ",(0,s.jsx)(t.a,{href:"https://bsky.app",children:"Bluesky"})," account, if you don't already have one"]}),"\n",(0,s.jsxs)(t.li,{children:["Navigate to ",(0,s.jsx)(t.a,{href:"https://bsky.app/settings/app-passwords",children:"https://bsky.app/settings/app-passwords"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Settings -> Privacy and Security -> App passwords"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Create a new ",(0,s.jsx)(t.strong,{children:"App Password"})," and save it somewhere, it will not be shown again"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(t.h3,{id:"identifier",children:"Identifier"}),"\n",(0,s.jsx)(t.p,{children:"The ATPRoto identifier used with multi-scrobbler should be either:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A valid ",(0,s.jsx)(t.a,{href:"https://atproto.com/specs/did#at-protocol-did-identifier-syntax",children:"DID"}),", starting with ",(0,s.jsx)(t.code,{children:"did:plc:..."})," or ",(0,s.jsx)(t.code,{children:"did:web:..."})]}),"\n",(0,s.jsxs)(t.li,{children:["Your ",(0,s.jsx)(t.strong,{children:"full"})," ATProto handle, including TLD"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"If using a handle:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["For regular Bluesky account this will be like: ",(0,s.jsx)(t.code,{children:"alice.bsky.social"})]}),"\n",(0,s.jsxs)(t.li,{children:["For Bluesky accounts that ",(0,s.jsx)(t.a,{href:"https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial",children:"use their domain as their account"})," this is your domain: ",(0,s.jsx)(t.code,{children:"mydomain.com"})]}),"\n",(0,s.jsx)(t.li,{children:"For non-Bluesky-PDS users, you probably already know your handle"}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["If your identifier does not look like a DID and does not include a TLD then multi-scrobbler will automatically append ",(0,s.jsx)(t.code,{children:".bsky.social"})," to your handle value."]}),"\n",(0,s.jsx)(n,{config:"TealClientConfig",fileContent:l.Z,client:!0,name:"tealfm",children:(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,s.jsx)(t.th,{children:"Required?"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"TEALFM_IDENTIFIER"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{}),(0,s.jsxs)(t.td,{children:["Your ",(0,s.jsx)(t.strong,{children:"full"})," ATProto handle or DID. For Bluesky account this is like ",(0,s.jsx)(t.code,{children:"myUser.bsky.social"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"TEALFM_APP_PW"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Bluesky/ATProto network App Password"})]})]})]})})]})}function p(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}function f(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},11753:function(e,t,n){n.d(t,{Z:()=>s}),n(67294);var i=n(85893);function s(e){return(0,i.jsx)("code",{...e})}},92183:function(e,t,n){n.d(t,{Z:()=>i});let i='[\n {\n "name": "myTeal",\n "configureAs": "client",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3"\n }\n },\n {\n "name": "myTealSource",\n "configureAs": "source",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3",\n\n // everything below is optional\n "serviceAllow": ["plyr"],\n "serviceDeny": ["last.fm"]\n }\n }\n]'}}]);
-1
assets/js/812e048c.ab4bdf23.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6751"],{30341:function(e,t,n){n.d(t,{ZP:()=>a,d$:()=>l});var i=n(85893),s=n(50065),r=n(11753);let l=[];function o(e){let t={a:"a",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.a,{href:"https://docs.bsky.app/docs/advanced-guides/atproto",children:"AT Protocol"})," is a standard to allow different applications to share and interpret your social data."]}),"\n",(0,i.jsxs)(t.p,{children:["Your data is stored in a personal ",(0,i.jsx)(t.a,{href:"https://atproto.com/guides/data-repos",children:"repository"})," in a ",(0,i.jsx)(t.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),", which is data-type agnostic (it's just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc..."]}),"\n",(0,i.jsxs)(t.p,{children:["Even though the application and the PDS/repository are independent, all of this is done for you automatically when you create a ",(0,i.jsx)(t.a,{href:"https://bsky.social/about",children:"Bluesky"})," account."]}),"\n",(0,i.jsx)(t.p,{children:"So..."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:['multi-scrobbler "scrobbles" your plays to your repository',"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["in a JSON data structure which includes ",(0,i.jsxs)(t.a,{href:"https://atproto.com/specs/lexicon",children:[e.name,"'s data type and structure"]})]}),"\n",(0,i.jsxs)(t.li,{children:["at a ",(0,i.jsxs)(t.a,{href:"https://atproto.com/guides/glossary#collection",children:["known location for ",e.name,"'s data"]})," (",(0,i.jsx)(r.Z,{children:e.lexicon}),"), in a list that is appended to as you continue to scrobble"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["when accessing ",e.name,", or another application that knows how to read it, your data is pulled from the repository to render the app"]}),"\n"]})]})}function a(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},89589:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>a,default:()=>p,toc:()=>h,metadata:()=>i,assets:()=>d,contentTitle:()=>c});var i=JSON.parse('{"id":"configuration/clients/tealfm","title":"Teal.fm","description":"To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source)","source":"@site/docs/configuration/clients/tealfm.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/tealfm","permalink":"/multi-scrobbler/configuration/clients/tealfm","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/tealfm.mdx","tags":[],"version":"current","frontMatter":{"title":"Teal.fm","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/clients/rocksky"},"next":{"title":"Overview","permalink":"/multi-scrobbler/configuration/sources/"}}'),s=n(85893),r=n(50065);n(703),n(73752),n(75752);var l=n(92183),o=n(30341);let a={title:"Teal.fm",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,d={},h=[...o.d$,{value:"Setup",id:"setup",level:2},{value:"Bluesky",id:"bluesky",level:4},{value:"Configuration",id:"configuration",level:2},{value:"Identifier",id:"identifier",level:3}];function u(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components},{Config:n,Details:i}=t;return n||f("Config",!0),i||f("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.admonition,{title:"Other Uses",type:"tip",children:(0,s.jsxs)(t.p,{children:["To monitor and re-scrobble activity from a ATProto Profile create a ",(0,s.jsx)(t.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm (Source)"})]})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://teal.fm/",children:(0,s.jsx)(t.strong,{children:"teal.fm"})})," is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a ",(0,s.jsx)(t.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),"."]}),"\n",(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:"How does that work?"}),(0,s.jsx)(o.ZP,{name:"teal.fm",lexicon:"fm.teal"})]}),"\n",(0,s.jsx)(t.admonition,{type:"warning",children:(0,s.jsxs)(t.p,{children:["The default Bluesky PDS is ",(0,s.jsx)(t.strong,{children:"public"}),", meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy."]})}),"\n",(0,s.jsxs)(t.admonition,{type:"note",children:[(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://notes.teal.fm/3lzlwe6puis2l",children:"teal.fm is still in developement"})," and does not have a public website, yet."]}),(0,s.jsx)(t.p,{children:"To view your teal.fm scrobbles you can:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["use ",(0,s.jsx)(t.a,{href:"https://wrapped.baileytownsend.dev/",children:"wrapped.baileytownsend.dev"})," which gives a simple stats overview of your scrobbles"]}),"\n",(0,s.jsxs)(t.li,{children:["use ",(0,s.jsx)(t.a,{href:"https://tealfm-slice.wisp.place/",children:"teal-slice.wisp.place"})," for a preview of teal.fm"]}),"\n",(0,s.jsxs)(t.li,{children:["use ",(0,s.jsx)(t.a,{href:"https://atproto.at",children:"atproto.at"})," to view the raw data (convenience URLs are generated in multi-scrobbler for you to do this)"]}),"\n"]})]}),"\n",(0,s.jsx)(t.h2,{id:"setup",children:"Setup"}),"\n",(0,s.jsx)(t.h4,{id:"bluesky",children:"Bluesky"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Create a ",(0,s.jsx)(t.a,{href:"https://bsky.app",children:"Bluesky"})," account, if you don't already have one"]}),"\n",(0,s.jsxs)(t.li,{children:["Navigate to ",(0,s.jsx)(t.a,{href:"https://bsky.app/settings/app-passwords",children:"https://bsky.app/settings/app-passwords"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Settings -> Privacy and Security -> App passwords"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Create a new ",(0,s.jsx)(t.strong,{children:"App Password"})," and save it somewhere, it will not be shown again"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(t.h3,{id:"identifier",children:"Identifier"}),"\n",(0,s.jsx)(t.p,{children:"The ATPRoto identifier used with multi-scrobbler should be either:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A valid ",(0,s.jsx)(t.a,{href:"https://atproto.com/specs/did#at-protocol-did-identifier-syntax",children:"DID"}),", starting with ",(0,s.jsx)(t.code,{children:"did:plc:..."})," or ",(0,s.jsx)(t.code,{children:"did:web:..."})]}),"\n",(0,s.jsxs)(t.li,{children:["Your ",(0,s.jsx)(t.strong,{children:"full"})," ATProto handle, including TLD"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"If using a handle:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["For regular Bluesky account this will be like: ",(0,s.jsx)(t.code,{children:"alice.bsky.social"})]}),"\n",(0,s.jsxs)(t.li,{children:["For Bluesky accounts that ",(0,s.jsx)(t.a,{href:"https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial",children:"use their domain as their account"})," this is your domain: ",(0,s.jsx)(t.code,{children:"mydomain.com"})]}),"\n",(0,s.jsx)(t.li,{children:"For non-Bluesky-PDS users, you probably already know your handle"}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["If your identifier does not look like a DID and does not include a TLD then multi-scrobbler will automatically append ",(0,s.jsx)(t.code,{children:".bsky.social"})," to your handle value."]}),"\n",(0,s.jsx)(n,{config:"TealClientConfig",fileContent:l.Z,client:!0,name:"tealfm",children:(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,s.jsx)(t.th,{children:"Required?"}),(0,s.jsx)(t.th,{children:"Default"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"TEALFM_IDENTIFIER"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{}),(0,s.jsxs)(t.td,{children:["Your ",(0,s.jsx)(t.strong,{children:"full"})," ATProto handle or DID. For Bluesky account this is like ",(0,s.jsx)(t.code,{children:"myUser.bsky.social"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"TEALFM_APP_PW"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Bluesky/ATProto network App Password"})]})]})]})})]})}function p(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}function f(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},11753:function(e,t,n){n.d(t,{Z:()=>s}),n(67294);var i=n(85893);function s(e){return(0,i.jsx)("code",{...e})}},92183:function(e,t,n){n.d(t,{Z:()=>i});let i='[\n {\n "name": "myTeal",\n "configureAs": "client",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3"\n }\n },\n {\n "name": "myTealSource",\n "configureAs": "source",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3",\n\n // everything below is optional\n "serviceAllow": ["plyr"],\n "serviceDeny": ["last.fm"]\n }\n }\n]'}}]);
-1
assets/js/8303.6f0b6e46.js
··· 1 - (self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8303"],{29097:function(u,D,e){"use strict";e.d(D,{Z:()=>g});var n=e(67294),t=e(85893),r=e(67026),F=e(14709),C=e(34036);function i({type:u,className:D,children:e}){return(0,t.jsx)("div",{className:(0,r.Z)(C.k.common.admonition,C.k.common.admonitionType(u),"admonition_xJq3",D),children:e})}function A({icon:u,title:D}){return(0,t.jsxs)("div",{className:"admonitionHeading_Gvgb",children:[(0,t.jsx)("span",{className:"admonitionIcon_Rf37",children:u}),D]})}function E({children:u}){return u?(0,t.jsx)("div",{className:"admonitionContent_BuS1",children:u}):null}function o(u){let{type:D,icon:e,title:n,children:r,className:F}=u;return(0,t.jsxs)(i,{type:D,className:F,children:[n||e?(0,t.jsx)(A,{title:n,icon:e}):null,(0,t.jsx)(E,{children:r})]})}let a={icon:(0,t.jsx)(function(u){return(0,t.jsx)("svg",{viewBox:"0 0 14 16",...u,children:(0,t.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})},{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function c(u){return(0,t.jsx)(o,{...a,...u,className:(0,r.Z)("alert alert--secondary",u.className),children:u.children})}let s={icon:(0,t.jsx)(function(u){return(0,t.jsx)("svg",{viewBox:"0 0 12 16",...u,children:(0,t.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})},{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function B(u){return(0,t.jsx)(o,{...s,...u,className:(0,r.Z)("alert alert--success",u.className),children:u.children})}let f={icon:(0,t.jsx)(function(u){return(0,t.jsx)("svg",{viewBox:"0 0 14 16",...u,children:(0,t.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})},{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function l(u){return(0,t.jsx)(o,{...f,...u,className:(0,r.Z)("alert alert--info",u.className),children:u.children})}function d(u){return(0,t.jsx)("svg",{viewBox:"0 0 16 16",...u,children:(0,t.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}let h={icon:(0,t.jsx)(d,{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})},m={icon:(0,t.jsx)(function(u){return(0,t.jsx)("svg",{viewBox:"0 0 12 16",...u,children:(0,t.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})},{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})},p={icon:(0,t.jsx)(d,{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})},v={note:c,tip:B,info:l,warning:function(u){return(0,t.jsx)(o,{...h,...u,className:(0,r.Z)("alert alert--warning",u.className),children:u.children})},danger:function(u){return(0,t.jsx)(o,{...m,...u,className:(0,r.Z)("alert alert--danger",u.className),children:u.children})},secondary:u=>(0,t.jsx)(c,{title:"secondary",...u}),important:u=>(0,t.jsx)(l,{title:"important",...u}),success:u=>(0,t.jsx)(B,{title:"success",...u}),caution:function(u){return(0,t.jsx)(o,{...p,...u,className:(0,r.Z)("alert alert--warning",u.className),children:u.children})}};function g(u){let D=function(u){let{mdxAdmonitionTitle:D,rest:e}=function(u){let D=n.Children.toArray(u),e=D.find(u=>n.isValidElement(u)&&"mdxAdmonitionTitle"===u.type),r=D.filter(u=>u!==e);return{mdxAdmonitionTitle:e?.props.children,rest:r.length>0?(0,t.jsx)(t.Fragment,{children:r}):null}}(u.children),r=u.title??D;return{...u,...r&&{title:r},children:e}}(u),e=function(u){let D=v[u];return D||(console.warn(`No admonition component found for admonition type "${u}". Using Info as fallback.`),v.info)}(D.type);return(0,t.jsx)(e,{...D})}},11142:function(u){u.exports=function(){"use strict";function u(u,D){return u(D={exports:{}},D.exports),D.exports}var D,e,n,t,r,F,C,i,A,E,o,a,c,s,B=u(function(u){var D=u.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=D)}),f=u(function(u){var D=u.exports={version:"2.6.5"};"number"==typeof __e&&(__e=D)});f.version;var l=function(u){return"object"==typeof u?null!==u:"function"==typeof u},d=function(u){if(!l(u))throw TypeError(u+" is not an object!");return u},h=function(u){try{return!!u()}catch(u){return!0}},m=!h(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),p=B.document,v=l(p)&&l(p.createElement),g=!m&&!h(function(){return 7!=Object.defineProperty(v?p.createElement("div"):{},"a",{get:function(){return 7}}).a}),y=function(u,D){var e,n;if(!l(u))return u;if(D&&"function"==typeof(e=u.toString)&&!l(n=e.call(u))||"function"==typeof(e=u.valueOf)&&!l(n=e.call(u))||!D&&"function"==typeof(e=u.toString)&&!l(n=e.call(u)))return n;throw TypeError("Can't convert object to primitive value")},w=Object.defineProperty,x=m?Object.defineProperty:function(u,D,e){if(d(u),D=y(D,!0),d(e),g)try{return w(u,D,e)}catch(u){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(u[D]=e.value),u},b=m?function(u,D,e){return x(u,D,{enumerable:!1,configurable:!0,writable:!0,value:e})}:function(u,D,e){return u[D]=e,u},N={}.hasOwnProperty,j=function(u,D){return N.call(u,D)},S=0,P=Math.random(),O=u(function(u){var D="__core-js_shared__",e=B[D]||(B[D]={});(u.exports=function(u,D){return e[u]||(e[u]=void 0!==D?D:{})})("versions",[]).push({version:f.version,mode:"global",copyright:"\xa9 2019 Denis Pushkarev (zloirock.ru)"})})("native-function-to-string",Function.toString),_=u(function(u){var D="Symbol(".concat("src",")_",(++S+P).toString(36)),e="toString",n=(""+O).split(e);f.inspectSource=function(u){return O.call(u)},(u.exports=function(u,e,t,r){var F="function"==typeof t;F&&(j(t,"name")||b(t,"name",e)),u[e]!==t&&(F&&(j(t,D)||b(t,D,u[e]?""+u[e]:n.join(String(e)))),u===B?u[e]=t:r?u[e]?u[e]=t:b(u,e,t):(delete u[e],b(u,e,t)))})(Function.prototype,e,function(){return"function"==typeof this&&this[D]||O.call(this)})}),M=function(u){if("function"!=typeof u)throw TypeError(u+" is not a function!");return u},z=function(u,D,e){if(M(u),void 0===D)return u;switch(e){case 1:return function(e){return u.call(D,e)};case 2:return function(e,n){return u.call(D,e,n)};case 3:return function(e,n,t){return u.call(D,e,n,t)}}return function(){return u.apply(D,arguments)}},V="prototype",k=function(u,D,e){var n,t,r,F,C=u&k.F,i=u&k.G,A=u&k.S,E=u&k.P,o=u&k.B,a=i?B:A?B[D]||(B[D]={}):(B[D]||{})[V],c=i?f:f[D]||(f[D]={}),s=c[V]||(c[V]={});for(n in i&&(e=D),e)r=((t=!C&&a&&void 0!==a[n])?a:e)[n],F=o&&t?z(r,B):E&&"function"==typeof r?z(Function.call,r):r,a&&_(a,n,r,u&k.U),c[n]!=r&&b(c,n,F),E&&s[n]!=r&&(s[n]=r)};B.core=f,k.F=1,k.G=2,k.S=4,k.P=8,k.B=16,k.W=32,k.U=64,k.R=128;var T=Math.ceil,I=Math.floor,L=function(u){return isNaN(u*=1)?0:(u>0?I:T)(u)},J=function(u){if(void 0==u)throw TypeError("Can't call method on "+u);return u},Z=function(u,D){var e,n,t=String(J(u)),r=L(D),F=t.length;return r<0||r>=F?void 0:(e=t.charCodeAt(r))<55296||e>56319||r+1===F||(n=t.charCodeAt(r+1))<56320||n>57343?e:(e-55296<<10)+(n-56320)+65536};k(k.P,"String",{codePointAt:function(u){return Z(this,u)}}),f.String.codePointAt;var R=Math.max,H=Math.min,$=String.fromCharCode,G=String.fromCodePoint;k(k.S+k.F*(!!G&&1!=G.length),"String",{fromCodePoint:function(u){for(var D,e,n=arguments,t=[],r=arguments.length,F=0;r>F;){if(((D=L(D=e=+n[F++]))<0?R(D+1114111,0):H(D,1114111))!==e)throw RangeError(e+" is not a valid code point");t.push(e<65536?$(e):$(((e-=65536)>>10)+55296,e%1024+56320))}return t.join("")}}),f.String.fromCodePoint;var U=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,q=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,W=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,X=function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||q.test(u))},K=function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"\u200C"===u||"\u200D"===u||W.test(u))},Q=function(u){return"string"==typeof u&&/[0-9]/.test(u)},Y=function(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)};function uu(){if(D[t])return String.fromCodePoint(D.codePointAt(t))}function uD(){var u=uu();return"\n"===u?(r++,F=0):u?F+=u.length:F++,u&&(t+=u.length),u}var ue={default:function(){var u;switch(s){case" ":case"\v":case"\f":case" ":case"\xa0":case"\uFEFF":case"\n":case"\r":case"\u2028":case"\u2029":uD();return;case"/":uD(),E="comment";return;case void 0:return uD(),un("eof")}return"string"==typeof(u=s)&&U.test(u)?void uD():ue[e]()},comment:function(){switch(s){case"*":uD(),E="multiLineComment";return;case"/":uD(),E="singleLineComment";return}throw uA(uD())},multiLineComment:function(){switch(s){case"*":uD(),E="multiLineCommentAsterisk";return;case void 0:throw uA(uD())}uD()},multiLineCommentAsterisk:function(){switch(s){case"*":uD();return;case"/":uD(),E="default";return;case void 0:throw uA(uD())}uD(),E="multiLineComment"},singleLineComment:function(){switch(s){case"\n":case"\r":case"\u2028":case"\u2029":uD(),E="default";return;case void 0:return uD(),un("eof")}uD()},value:function(){switch(s){case"{":case"[":return un("punctuator",uD());case"n":return uD(),ut("ull"),un("null",null);case"t":return uD(),ut("rue"),un("boolean",!0);case"f":return uD(),ut("alse"),un("boolean",!1);case"-":case"+":"-"===uD()&&(c=-1),E="sign";return;case".":o=uD(),E="decimalPointLeading";return;case"0":o=uD(),E="zero";return;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":o=uD(),E="decimalInteger";return;case"I":return uD(),ut("nfinity"),un("numeric",1/0);case"N":return uD(),ut("aN"),un("numeric",NaN);case'"':case"'":a='"'===uD(),o="",E="string";return}throw uA(uD())},identifierNameStartEscape:function(){if("u"!==s)throw uA(uD());uD();var u=ur();switch(u){case"$":case"_":break;default:if(!X(u))throw uo()}o+=u,E="identifierName"},identifierName:function(){switch(s){case"$":case"_":case"\u200C":case"\u200D":o+=uD();return;case"\\":uD(),E="identifierNameEscape";return}if(K(s)){o+=uD();return}return un("identifier",o)},identifierNameEscape:function(){if("u"!==s)throw uA(uD());uD();var u=ur();switch(u){case"$":case"_":case"\u200C":case"\u200D":break;default:if(!K(u))throw uo()}o+=u,E="identifierName"},sign:function(){switch(s){case".":o=uD(),E="decimalPointLeading";return;case"0":o=uD(),E="zero";return;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":o=uD(),E="decimalInteger";return;case"I":return uD(),ut("nfinity"),un("numeric",1/0*c);case"N":return uD(),ut("aN"),un("numeric",NaN)}throw uA(uD())},zero:function(){switch(s){case".":o+=uD(),E="decimalPoint";return;case"e":case"E":o+=uD(),E="decimalExponent";return;case"x":case"X":o+=uD(),E="hexadecimal";return}return un("numeric",0*c)},decimalInteger:function(){switch(s){case".":o+=uD(),E="decimalPoint";return;case"e":case"E":o+=uD(),E="decimalExponent";return}if(Q(s)){o+=uD();return}return un("numeric",c*Number(o))},decimalPointLeading:function(){if(Q(s)){o+=uD(),E="decimalFraction";return}throw uA(uD())},decimalPoint:function(){switch(s){case"e":case"E":o+=uD(),E="decimalExponent";return}if(Q(s)){o+=uD(),E="decimalFraction";return}return un("numeric",c*Number(o))},decimalFraction:function(){switch(s){case"e":case"E":o+=uD(),E="decimalExponent";return}if(Q(s)){o+=uD();return}return un("numeric",c*Number(o))},decimalExponent:function(){switch(s){case"+":case"-":o+=uD(),E="decimalExponentSign";return}if(Q(s)){o+=uD(),E="decimalExponentInteger";return}throw uA(uD())},decimalExponentSign:function(){if(Q(s)){o+=uD(),E="decimalExponentInteger";return}throw uA(uD())},decimalExponentInteger:function(){if(Q(s)){o+=uD();return}return un("numeric",c*Number(o))},hexadecimal:function(){if(Y(s)){o+=uD(),E="hexadecimalInteger";return}throw uA(uD())},hexadecimalInteger:function(){if(Y(s)){o+=uD();return}return un("numeric",c*Number(o))},string:function(){switch(s){case"\\":uD(),o+=function(){switch(uu()){case"b":return uD(),"\b";case"f":return uD(),"\f";case"n":return uD(),"\n";case"r":return uD(),"\r";case"t":return uD()," ";case"v":return uD(),"\v";case"0":if(uD(),Q(uu()))throw uA(uD());return"\0";case"x":return uD(),function(){var u="",D=uu();if(!Y(D)||(u+=uD(),!Y(D=uu())))throw uA(uD());return String.fromCodePoint(parseInt(u+=uD(),16))}();case"u":return uD(),ur();case"\n":case"\u2028":case"\u2029":return uD(),"";case"\r":return uD(),"\n"===uu()&&uD(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw uA(uD())}return uD()}();return;case'"':if(a)return uD(),un("string",o);o+=uD();return;case"'":if(!a)return uD(),un("string",o);o+=uD();return;case"\n":case"\r":case void 0:throw uA(uD());case"\u2028":case"\u2029":console.warn("JSON5: '"+ua(s)+"' in strings is not valid ECMAScript; consider escaping")}o+=uD()},start:function(){switch(s){case"{":case"[":return un("punctuator",uD())}E="value"},beforePropertyName:function(){switch(s){case"$":case"_":o=uD(),E="identifierName";return;case"\\":uD(),E="identifierNameStartEscape";return;case"}":return un("punctuator",uD());case'"':case"'":a='"'===uD(),E="string";return}if(X(s)){o+=uD(),E="identifierName";return}throw uA(uD())},afterPropertyName:function(){if(":"===s)return un("punctuator",uD());throw uA(uD())},beforePropertyValue:function(){E="value"},afterPropertyValue:function(){switch(s){case",":case"}":return un("punctuator",uD())}throw uA(uD())},beforeArrayValue:function(){if("]"===s)return un("punctuator",uD());E="value"},afterArrayValue:function(){switch(s){case",":case"]":return un("punctuator",uD())}throw uA(uD())},end:function(){throw uA(uD())}};function un(u,D){return{type:u,value:D,line:r,column:F}}function ut(u){for(var D=0;D<u.length;D+=1){var e=u[D];if(uu()!==e)throw uA(uD());uD()}}function ur(){for(var u="",D=4;D-- >0;){if(!Y(uu()))throw uA(uD());u+=uD()}return String.fromCodePoint(parseInt(u,16))}var uF={start:function(){if("eof"===C.type)throw uE();uC()},beforePropertyName:function(){switch(C.type){case"identifier":case"string":i=C.value,e="afterPropertyName";return;case"punctuator":ui();return;case"eof":throw uE()}},afterPropertyName:function(){if("eof"===C.type)throw uE();e="beforePropertyValue"},beforePropertyValue:function(){if("eof"===C.type)throw uE();uC()},beforeArrayValue:function(){if("eof"===C.type)throw uE();if("punctuator"===C.type&&"]"===C.value)return void ui();uC()},afterPropertyValue:function(){if("eof"===C.type)throw uE();switch(C.value){case",":e="beforePropertyName";return;case"}":ui()}},afterArrayValue:function(){if("eof"===C.type)throw uE();switch(C.value){case",":e="beforeArrayValue";return;case"]":ui()}},end:function(){}};function uC(){var u;switch(C.type){case"punctuator":switch(C.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=C.value}if(void 0===A)A=u;else{var D=n[n.length-1];Array.isArray(D)?D.push(u):Object.defineProperty(D,i,{value:u,writable:!0,enumerable:!0,configurable:!0})}if(null!==u&&"object"==typeof u)n.push(u),e=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{var t=n[n.length-1];e=null==t?"end":Array.isArray(t)?"afterArrayValue":"afterPropertyValue"}}function ui(){n.pop();var u=n[n.length-1];e=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function uA(u){return void 0===u?uc("JSON5: invalid end of input at "+r+":"+F):uc("JSON5: invalid character '"+ua(u)+"' at "+r+":"+F)}function uE(){return uc("JSON5: invalid end of input at "+r+":"+F)}function uo(){return F-=5,uc("JSON5: invalid identifier character at "+r+":"+F)}function ua(u){var D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){var e=u.charCodeAt(0).toString(16);return"\\x"+("00"+e).substring(e.length)}return u}function uc(u){var D=SyntaxError(u);return D.lineNumber=r,D.columnNumber=F,D}return{parse:function(u,B){D=String(u),e="start",n=[],t=0,r=1,F=0,C=void 0,i=void 0,A=void 0;do C=function(){for(E="default",o="",a=!1,c=1;;){s=uu();var u=ue[E]();if(u)return u}}(),uF[e]();while("eof"!==C.type);return"function"==typeof B?function u(D,e,n){var t=D[e];if(null!=t&&"object"==typeof t)if(Array.isArray(t))for(var r=0;r<t.length;r++){var F=String(r),C=u(t,F,n);void 0===C?delete t[F]:Object.defineProperty(t,F,{value:C,writable:!0,enumerable:!0,configurable:!0})}else for(var i in t){var A=u(t,i,n);void 0===A?delete t[i]:Object.defineProperty(t,i,{value:A,writable:!0,enumerable:!0,configurable:!0})}return n.call(D,e,t)}({"":A},"",B):A},stringify:function(u,D,e){var n,t,r,F=[],C="",i="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,r=D.quote,D=D.replacer),"function"==typeof D)t=D;else if(Array.isArray(D)){n=[];for(var A=0,E=D;A<E.length;A+=1){var o=E[A],a=void 0;"string"==typeof o?a=o:("number"==typeof o||o instanceof String||o instanceof Number)&&(a=String(o)),void 0!==a&&0>n.indexOf(a)&&n.push(a)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),i=" ".substr(0,e)):"string"==typeof e&&(i=e.substr(0,10)),function u(D,e){var r=e[D];switch(null!=r&&("function"==typeof r.toJSON5?r=r.toJSON5(D):"function"==typeof r.toJSON&&(r=r.toJSON(D))),t&&(r=t.call(e,D,r)),r instanceof Number?r=Number(r):r instanceof String?r=String(r):r instanceof Boolean&&(r=r.valueOf()),r){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof r?c(r,!1):"number"==typeof r?String(r):"object"==typeof r?Array.isArray(r)?function(D){if(F.indexOf(D)>=0)throw TypeError("Converting circular structure to JSON5");F.push(D);var e,n=C;C+=i;for(var t=[],r=0;r<D.length;r++){var A=u(String(r),D);t.push(void 0!==A?A:"null")}if(0===t.length)e="[]";else if(""===i)e="["+t.join(",")+"]";else{var E=",\n"+C,o=t.join(E);e="[\n"+C+o+",\n"+n+"]"}return F.pop(),C=n,e}(r):function(D){if(F.indexOf(D)>=0)throw TypeError("Converting circular structure to JSON5");F.push(D);var e,t,r=C;C+=i;for(var A=n||Object.keys(D),E=[],o=0;o<A.length;o+=1){var a=A[o],s=u(a,D);if(void 0!==s){var B=function(u){if(0===u.length)return c(u,!0);var D=String.fromCodePoint(u.codePointAt(0));if(!X(D))return c(u,!0);for(var e=D.length;e<u.length;e++)if(!K(String.fromCodePoint(u.codePointAt(e))))return c(u,!0);return u}(a)+":";""!==i&&(B+=" "),B+=s,E.push(B)}}if(0===E.length)e="{}";else if(""===i)e="{"+(t=E.join(","))+"}";else{var f=",\n"+C;t=E.join(f),e="{\n"+C+t+",\n"+r+"}"}return F.pop(),C=r,e}(r):void 0}("",{"":u});function c(u){for(var D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"},n="",t=0;t<u.length;t++){var F=u[t];switch(F){case"'":case'"':D[F]++,n+=F;continue;case"\0":if(Q(u[t+1])){n+="\\x00";continue}}if(e[F]){n+=e[F];continue}if(F<" "){var C=F.charCodeAt(0).toString(16);n+="\\x"+("00"+C).substring(C.length);continue}n+=F}var i=r||Object.keys(D).reduce(function(u,e){return D[u]<D[e]?u:e});return n=n.replace(RegExp(i,"g"),e[i]),i+n+i}}}}()},25254:function(u,D,e){"use strict";e(67294)},8267:function(u,D,e){"use strict";e(25254)}}]);
+1
assets/js/8689.c103f25a.js
··· 1 + (self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8689"],{89886:function(u,D,e){"use strict";e.d(D,{Z:()=>t}),e(67294);var n=e(85893);function t(u){return(0,n.jsx)("svg",{viewBox:"0 0 12 16",...u,children:(0,n.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}},17200:function(u,D,e){"use strict";e.d(D,{Z:()=>t}),e(67294);var n=e(85893);function t(u){return(0,n.jsx)("svg",{viewBox:"0 0 14 16",...u,children:(0,n.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}},15904:function(u,D,e){"use strict";e.d(D,{Z:()=>t}),e(67294);var n=e(85893);function t(u){return(0,n.jsx)("svg",{viewBox:"0 0 12 16",...u,children:(0,n.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}},21863:function(u,D,e){"use strict";e.d(D,{Z:()=>t}),e(67294);var n=e(85893);function t(u){return(0,n.jsx)("svg",{viewBox:"0 0 16 16",...u,children:(0,n.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}},57682:function(u,D,e){"use strict";e.d(D,{Z:()=>x});var n=e(67294),t=e(85893),r=e(67026),F=e(14709),i=e(34036);function C({type:u,className:D,children:e}){return(0,t.jsx)("div",{className:(0,r.Z)(i.k.common.admonition,i.k.common.admonitionType(u),"admonition_xJq3",D),children:e})}function A({icon:u,title:D}){return(0,t.jsxs)("div",{className:"admonitionHeading_Gvgb",children:[(0,t.jsx)("span",{className:"admonitionIcon_Rf37",children:u}),D]})}function o({children:u}){return u?(0,t.jsx)("div",{className:"admonitionContent_BuS1",children:u}):null}function E(u){let{type:D,icon:e,title:n,children:r,className:F}=u;return(0,t.jsxs)(C,{type:D,className:F,children:[n||e?(0,t.jsx)(A,{title:n,icon:e}):null,(0,t.jsx)(o,{children:r})]})}var a=e(17200);let c={icon:(0,t.jsx)(a.Z,{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function s(u){return(0,t.jsx)(E,{...c,...u,className:(0,r.Z)("alert alert--secondary",u.className),children:u.children})}var B=e(15904);let f={icon:(0,t.jsx)(B.Z,{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function l(u){return(0,t.jsx)(E,{...f,...u,className:(0,r.Z)("alert alert--success",u.className),children:u.children})}let d={icon:(0,t.jsx)(function(u){return(0,t.jsx)("svg",{viewBox:"0 0 14 16",...u,children:(0,t.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})},{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function h(u){return(0,t.jsx)(E,{...d,...u,className:(0,r.Z)("alert alert--info",u.className),children:u.children})}var m=e(21863);let p={icon:(0,t.jsx)(m.Z,{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};var v=e(89886);let g={icon:(0,t.jsx)(v.Z,{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})},y={icon:(0,t.jsx)(m.Z,{}),title:(0,t.jsx)(F.default,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})},w={note:s,tip:l,info:h,warning:function(u){return(0,t.jsx)(E,{...p,...u,className:(0,r.Z)("alert alert--warning",u.className),children:u.children})},danger:function(u){return(0,t.jsx)(E,{...g,...u,className:(0,r.Z)("alert alert--danger",u.className),children:u.children})},secondary:u=>(0,t.jsx)(s,{title:"secondary",...u}),important:u=>(0,t.jsx)(h,{title:"important",...u}),success:u=>(0,t.jsx)(l,{title:"success",...u}),caution:function(u){return(0,t.jsx)(E,{...y,...u,className:(0,r.Z)("alert alert--warning",u.className),children:u.children})}};function x(u){let D=function(u){let{mdxAdmonitionTitle:D,rest:e}=function(u){let D=n.Children.toArray(u),e=D.find(u=>n.isValidElement(u)&&"mdxAdmonitionTitle"===u.type),r=D.filter(u=>u!==e);return{mdxAdmonitionTitle:e?.props.children,rest:r.length>0?(0,t.jsx)(t.Fragment,{children:r}):null}}(u.children),r=u.title??D;return{...u,...r&&{title:r},children:e}}(u),e=function(u){let D=w[u];return D||(console.warn(`No admonition component found for admonition type "${u}". Using Info as fallback.`),w.info)}(D.type);return(0,t.jsx)(e,{...D})}},11142:function(u){u.exports=function(){"use strict";function u(u,D){return u(D={exports:{}},D.exports),D.exports}var D,e,n,t,r,F,i,C,A,o,E,a,c,s,B=u(function(u){var D=u.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=D)}),f=u(function(u){var D=u.exports={version:"2.6.5"};"number"==typeof __e&&(__e=D)});f.version;var l=function(u){return"object"==typeof u?null!==u:"function"==typeof u},d=function(u){if(!l(u))throw TypeError(u+" is not an object!");return u},h=function(u){try{return!!u()}catch(u){return!0}},m=!h(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),p=B.document,v=l(p)&&l(p.createElement),g=!m&&!h(function(){return 7!=Object.defineProperty(v?p.createElement("div"):{},"a",{get:function(){return 7}}).a}),y=function(u,D){var e,n;if(!l(u))return u;if(D&&"function"==typeof(e=u.toString)&&!l(n=e.call(u))||"function"==typeof(e=u.valueOf)&&!l(n=e.call(u))||!D&&"function"==typeof(e=u.toString)&&!l(n=e.call(u)))return n;throw TypeError("Can't convert object to primitive value")},w=Object.defineProperty,x=m?Object.defineProperty:function(u,D,e){if(d(u),D=y(D,!0),d(e),g)try{return w(u,D,e)}catch(u){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(u[D]=e.value),u},b=m?function(u,D,e){return x(u,D,{enumerable:!1,configurable:!0,writable:!0,value:e})}:function(u,D,e){return u[D]=e,u},N={}.hasOwnProperty,j=function(u,D){return N.call(u,D)},S=0,P=Math.random(),O=u(function(u){var D="__core-js_shared__",e=B[D]||(B[D]={});(u.exports=function(u,D){return e[u]||(e[u]=void 0!==D?D:{})})("versions",[]).push({version:f.version,mode:"global",copyright:"\xa9 2019 Denis Pushkarev (zloirock.ru)"})})("native-function-to-string",Function.toString),_=u(function(u){var D="Symbol(".concat("src",")_",(++S+P).toString(36)),e="toString",n=(""+O).split(e);f.inspectSource=function(u){return O.call(u)},(u.exports=function(u,e,t,r){var F="function"==typeof t;F&&(j(t,"name")||b(t,"name",e)),u[e]!==t&&(F&&(j(t,D)||b(t,D,u[e]?""+u[e]:n.join(String(e)))),u===B?u[e]=t:r?u[e]?u[e]=t:b(u,e,t):(delete u[e],b(u,e,t)))})(Function.prototype,e,function(){return"function"==typeof this&&this[D]||O.call(this)})}),M=function(u){if("function"!=typeof u)throw TypeError(u+" is not a function!");return u},z=function(u,D,e){if(M(u),void 0===D)return u;switch(e){case 1:return function(e){return u.call(D,e)};case 2:return function(e,n){return u.call(D,e,n)};case 3:return function(e,n,t){return u.call(D,e,n,t)}}return function(){return u.apply(D,arguments)}},V="prototype",Z=function(u,D,e){var n,t,r,F,i=u&Z.F,C=u&Z.G,A=u&Z.S,o=u&Z.P,E=u&Z.B,a=C?B:A?B[D]||(B[D]={}):(B[D]||{})[V],c=C?f:f[D]||(f[D]={}),s=c[V]||(c[V]={});for(n in C&&(e=D),e)r=((t=!i&&a&&void 0!==a[n])?a:e)[n],F=E&&t?z(r,B):o&&"function"==typeof r?z(Function.call,r):r,a&&_(a,n,r,u&Z.U),c[n]!=r&&b(c,n,F),o&&s[n]!=r&&(s[n]=r)};B.core=f,Z.F=1,Z.G=2,Z.S=4,Z.P=8,Z.B=16,Z.W=32,Z.U=64,Z.R=128;var k=Math.ceil,T=Math.floor,I=function(u){return isNaN(u*=1)?0:(u>0?T:k)(u)},L=function(u){if(void 0==u)throw TypeError("Can't call method on "+u);return u},J=function(u,D){var e,n,t=String(L(u)),r=I(D),F=t.length;return r<0||r>=F?void 0:(e=t.charCodeAt(r))<55296||e>56319||r+1===F||(n=t.charCodeAt(r+1))<56320||n>57343?e:(e-55296<<10)+(n-56320)+65536};Z(Z.P,"String",{codePointAt:function(u){return J(this,u)}}),f.String.codePointAt;var R=Math.max,H=Math.min,$=String.fromCharCode,G=String.fromCodePoint;Z(Z.S+Z.F*(!!G&&1!=G.length),"String",{fromCodePoint:function(u){for(var D,e,n=arguments,t=[],r=arguments.length,F=0;r>F;){if(((D=I(D=e=+n[F++]))<0?R(D+1114111,0):H(D,1114111))!==e)throw RangeError(e+" is not a valid code point");t.push(e<65536?$(e):$(((e-=65536)>>10)+55296,e%1024+56320))}return t.join("")}}),f.String.fromCodePoint;var U=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,q=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,W=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,X=function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||q.test(u))},K=function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"\u200C"===u||"\u200D"===u||W.test(u))},Q=function(u){return"string"==typeof u&&/[0-9]/.test(u)},Y=function(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)};function uu(){if(D[t])return String.fromCodePoint(D.codePointAt(t))}function uD(){var u=uu();return"\n"===u?(r++,F=0):u?F+=u.length:F++,u&&(t+=u.length),u}var ue={default:function(){var u;switch(s){case" ":case"\v":case"\f":case" ":case"\xa0":case"\uFEFF":case"\n":case"\r":case"\u2028":case"\u2029":uD();return;case"/":uD(),o="comment";return;case void 0:return uD(),un("eof")}return"string"==typeof(u=s)&&U.test(u)?void uD():ue[e]()},comment:function(){switch(s){case"*":uD(),o="multiLineComment";return;case"/":uD(),o="singleLineComment";return}throw uA(uD())},multiLineComment:function(){switch(s){case"*":uD(),o="multiLineCommentAsterisk";return;case void 0:throw uA(uD())}uD()},multiLineCommentAsterisk:function(){switch(s){case"*":uD();return;case"/":uD(),o="default";return;case void 0:throw uA(uD())}uD(),o="multiLineComment"},singleLineComment:function(){switch(s){case"\n":case"\r":case"\u2028":case"\u2029":uD(),o="default";return;case void 0:return uD(),un("eof")}uD()},value:function(){switch(s){case"{":case"[":return un("punctuator",uD());case"n":return uD(),ut("ull"),un("null",null);case"t":return uD(),ut("rue"),un("boolean",!0);case"f":return uD(),ut("alse"),un("boolean",!1);case"-":case"+":"-"===uD()&&(c=-1),o="sign";return;case".":E=uD(),o="decimalPointLeading";return;case"0":E=uD(),o="zero";return;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":E=uD(),o="decimalInteger";return;case"I":return uD(),ut("nfinity"),un("numeric",1/0);case"N":return uD(),ut("aN"),un("numeric",NaN);case'"':case"'":a='"'===uD(),E="",o="string";return}throw uA(uD())},identifierNameStartEscape:function(){if("u"!==s)throw uA(uD());uD();var u=ur();switch(u){case"$":case"_":break;default:if(!X(u))throw uE()}E+=u,o="identifierName"},identifierName:function(){switch(s){case"$":case"_":case"\u200C":case"\u200D":E+=uD();return;case"\\":uD(),o="identifierNameEscape";return}if(K(s)){E+=uD();return}return un("identifier",E)},identifierNameEscape:function(){if("u"!==s)throw uA(uD());uD();var u=ur();switch(u){case"$":case"_":case"\u200C":case"\u200D":break;default:if(!K(u))throw uE()}E+=u,o="identifierName"},sign:function(){switch(s){case".":E=uD(),o="decimalPointLeading";return;case"0":E=uD(),o="zero";return;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":E=uD(),o="decimalInteger";return;case"I":return uD(),ut("nfinity"),un("numeric",1/0*c);case"N":return uD(),ut("aN"),un("numeric",NaN)}throw uA(uD())},zero:function(){switch(s){case".":E+=uD(),o="decimalPoint";return;case"e":case"E":E+=uD(),o="decimalExponent";return;case"x":case"X":E+=uD(),o="hexadecimal";return}return un("numeric",0*c)},decimalInteger:function(){switch(s){case".":E+=uD(),o="decimalPoint";return;case"e":case"E":E+=uD(),o="decimalExponent";return}if(Q(s)){E+=uD();return}return un("numeric",c*Number(E))},decimalPointLeading:function(){if(Q(s)){E+=uD(),o="decimalFraction";return}throw uA(uD())},decimalPoint:function(){switch(s){case"e":case"E":E+=uD(),o="decimalExponent";return}if(Q(s)){E+=uD(),o="decimalFraction";return}return un("numeric",c*Number(E))},decimalFraction:function(){switch(s){case"e":case"E":E+=uD(),o="decimalExponent";return}if(Q(s)){E+=uD();return}return un("numeric",c*Number(E))},decimalExponent:function(){switch(s){case"+":case"-":E+=uD(),o="decimalExponentSign";return}if(Q(s)){E+=uD(),o="decimalExponentInteger";return}throw uA(uD())},decimalExponentSign:function(){if(Q(s)){E+=uD(),o="decimalExponentInteger";return}throw uA(uD())},decimalExponentInteger:function(){if(Q(s)){E+=uD();return}return un("numeric",c*Number(E))},hexadecimal:function(){if(Y(s)){E+=uD(),o="hexadecimalInteger";return}throw uA(uD())},hexadecimalInteger:function(){if(Y(s)){E+=uD();return}return un("numeric",c*Number(E))},string:function(){switch(s){case"\\":uD(),E+=function(){switch(uu()){case"b":return uD(),"\b";case"f":return uD(),"\f";case"n":return uD(),"\n";case"r":return uD(),"\r";case"t":return uD()," ";case"v":return uD(),"\v";case"0":if(uD(),Q(uu()))throw uA(uD());return"\0";case"x":return uD(),function(){var u="",D=uu();if(!Y(D)||(u+=uD(),!Y(D=uu())))throw uA(uD());return String.fromCodePoint(parseInt(u+=uD(),16))}();case"u":return uD(),ur();case"\n":case"\u2028":case"\u2029":return uD(),"";case"\r":return uD(),"\n"===uu()&&uD(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw uA(uD())}return uD()}();return;case'"':if(a)return uD(),un("string",E);E+=uD();return;case"'":if(!a)return uD(),un("string",E);E+=uD();return;case"\n":case"\r":case void 0:throw uA(uD());case"\u2028":case"\u2029":console.warn("JSON5: '"+ua(s)+"' in strings is not valid ECMAScript; consider escaping")}E+=uD()},start:function(){switch(s){case"{":case"[":return un("punctuator",uD())}o="value"},beforePropertyName:function(){switch(s){case"$":case"_":E=uD(),o="identifierName";return;case"\\":uD(),o="identifierNameStartEscape";return;case"}":return un("punctuator",uD());case'"':case"'":a='"'===uD(),o="string";return}if(X(s)){E+=uD(),o="identifierName";return}throw uA(uD())},afterPropertyName:function(){if(":"===s)return un("punctuator",uD());throw uA(uD())},beforePropertyValue:function(){o="value"},afterPropertyValue:function(){switch(s){case",":case"}":return un("punctuator",uD())}throw uA(uD())},beforeArrayValue:function(){if("]"===s)return un("punctuator",uD());o="value"},afterArrayValue:function(){switch(s){case",":case"]":return un("punctuator",uD())}throw uA(uD())},end:function(){throw uA(uD())}};function un(u,D){return{type:u,value:D,line:r,column:F}}function ut(u){for(var D=0;D<u.length;D+=1){var e=u[D];if(uu()!==e)throw uA(uD());uD()}}function ur(){for(var u="",D=4;D-- >0;){if(!Y(uu()))throw uA(uD());u+=uD()}return String.fromCodePoint(parseInt(u,16))}var uF={start:function(){if("eof"===i.type)throw uo();ui()},beforePropertyName:function(){switch(i.type){case"identifier":case"string":C=i.value,e="afterPropertyName";return;case"punctuator":uC();return;case"eof":throw uo()}},afterPropertyName:function(){if("eof"===i.type)throw uo();e="beforePropertyValue"},beforePropertyValue:function(){if("eof"===i.type)throw uo();ui()},beforeArrayValue:function(){if("eof"===i.type)throw uo();if("punctuator"===i.type&&"]"===i.value)return void uC();ui()},afterPropertyValue:function(){if("eof"===i.type)throw uo();switch(i.value){case",":e="beforePropertyName";return;case"}":uC()}},afterArrayValue:function(){if("eof"===i.type)throw uo();switch(i.value){case",":e="beforeArrayValue";return;case"]":uC()}},end:function(){}};function ui(){var u;switch(i.type){case"punctuator":switch(i.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=i.value}if(void 0===A)A=u;else{var D=n[n.length-1];Array.isArray(D)?D.push(u):Object.defineProperty(D,C,{value:u,writable:!0,enumerable:!0,configurable:!0})}if(null!==u&&"object"==typeof u)n.push(u),e=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{var t=n[n.length-1];e=null==t?"end":Array.isArray(t)?"afterArrayValue":"afterPropertyValue"}}function uC(){n.pop();var u=n[n.length-1];e=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function uA(u){return void 0===u?uc("JSON5: invalid end of input at "+r+":"+F):uc("JSON5: invalid character '"+ua(u)+"' at "+r+":"+F)}function uo(){return uc("JSON5: invalid end of input at "+r+":"+F)}function uE(){return F-=5,uc("JSON5: invalid identifier character at "+r+":"+F)}function ua(u){var D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){var e=u.charCodeAt(0).toString(16);return"\\x"+("00"+e).substring(e.length)}return u}function uc(u){var D=SyntaxError(u);return D.lineNumber=r,D.columnNumber=F,D}return{parse:function(u,B){D=String(u),e="start",n=[],t=0,r=1,F=0,i=void 0,C=void 0,A=void 0;do i=function(){for(o="default",E="",a=!1,c=1;;){s=uu();var u=ue[o]();if(u)return u}}(),uF[e]();while("eof"!==i.type);return"function"==typeof B?function u(D,e,n){var t=D[e];if(null!=t&&"object"==typeof t)if(Array.isArray(t))for(var r=0;r<t.length;r++){var F=String(r),i=u(t,F,n);void 0===i?delete t[F]:Object.defineProperty(t,F,{value:i,writable:!0,enumerable:!0,configurable:!0})}else for(var C in t){var A=u(t,C,n);void 0===A?delete t[C]:Object.defineProperty(t,C,{value:A,writable:!0,enumerable:!0,configurable:!0})}return n.call(D,e,t)}({"":A},"",B):A},stringify:function(u,D,e){var n,t,r,F=[],i="",C="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,r=D.quote,D=D.replacer),"function"==typeof D)t=D;else if(Array.isArray(D)){n=[];for(var A=0,o=D;A<o.length;A+=1){var E=o[A],a=void 0;"string"==typeof E?a=E:("number"==typeof E||E instanceof String||E instanceof Number)&&(a=String(E)),void 0!==a&&0>n.indexOf(a)&&n.push(a)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),C=" ".substr(0,e)):"string"==typeof e&&(C=e.substr(0,10)),function u(D,e){var r=e[D];switch(null!=r&&("function"==typeof r.toJSON5?r=r.toJSON5(D):"function"==typeof r.toJSON&&(r=r.toJSON(D))),t&&(r=t.call(e,D,r)),r instanceof Number?r=Number(r):r instanceof String?r=String(r):r instanceof Boolean&&(r=r.valueOf()),r){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof r?c(r,!1):"number"==typeof r?String(r):"object"==typeof r?Array.isArray(r)?function(D){if(F.indexOf(D)>=0)throw TypeError("Converting circular structure to JSON5");F.push(D);var e,n=i;i+=C;for(var t=[],r=0;r<D.length;r++){var A=u(String(r),D);t.push(void 0!==A?A:"null")}if(0===t.length)e="[]";else if(""===C)e="["+t.join(",")+"]";else{var o=",\n"+i,E=t.join(o);e="[\n"+i+E+",\n"+n+"]"}return F.pop(),i=n,e}(r):function(D){if(F.indexOf(D)>=0)throw TypeError("Converting circular structure to JSON5");F.push(D);var e,t,r=i;i+=C;for(var A=n||Object.keys(D),o=[],E=0;E<A.length;E+=1){var a=A[E],s=u(a,D);if(void 0!==s){var B=function(u){if(0===u.length)return c(u,!0);var D=String.fromCodePoint(u.codePointAt(0));if(!X(D))return c(u,!0);for(var e=D.length;e<u.length;e++)if(!K(String.fromCodePoint(u.codePointAt(e))))return c(u,!0);return u}(a)+":";""!==C&&(B+=" "),B+=s,o.push(B)}}if(0===o.length)e="{}";else if(""===C)e="{"+(t=o.join(","))+"}";else{var f=",\n"+i;t=o.join(f),e="{\n"+i+t+",\n"+r+"}"}return F.pop(),i=r,e}(r):void 0}("",{"":u});function c(u){for(var D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"},n="",t=0;t<u.length;t++){var F=u[t];switch(F){case"'":case'"':D[F]++,n+=F;continue;case"\0":if(Q(u[t+1])){n+="\\x00";continue}}if(e[F]){n+=e[F];continue}if(F<" "){var i=F.charCodeAt(0).toString(16);n+="\\x"+("00"+i).substring(i.length);continue}n+=F}var C=r||Object.keys(D).reduce(function(u,e){return D[u]<D[e]?u:e});return n=n.replace(RegExp(C,"g"),e[C]),C+n+C}}}}()},25254:function(u,D,e){"use strict";e(67294)},8267:function(u,D,e){"use strict";e(25254)}}]);
-12
assets/js/8b39be93.2b927db5.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["4330"],{76574:function(e,t,s){s.d(t,{ZP:()=>l,d$:()=>r});var n=s(85893),a=s(50065),o=s(75752),i=s.n(o);let r=[];function c(e){let t={a:"a",code:"code",p:"p",strong:"strong",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["This ",(0,n.jsx)(t.strong,{children:"Source"})," supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to ",(0,n.jsx)(t.strong,{children:"Should Scrobble"})," found in each Source's status card."]}),"\n",(0,n.jsxs)(t.p,{children:["Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source's ",(0,n.jsx)(t.code,{children:"options"})," in ",(0,n.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,n.jsx)(i(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 - "data": { 3 - // ... 4 - }, 5 - "options": { 6 - // highlight-start 7 - // set to true to always scrobble automatically 8 - // set to false to never scrobble automatically 9 - "systemScrobble": true 10 - // highlight-end 11 - } 12 - }}`})]})}function l(e={}){let{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},67676:function(e,t,s){s.r(t),s.d(t,{frontMatter:()=>h,default:()=>g,toc:()=>f,metadata:()=>n,assets:()=>m,contentTitle:()=>u});var n=JSON.parse('{"id":"configuration/sources/icecast","title":"Icecast","description":"Parse metadata from any Icecast Station (streams) to use for scrobbling.","source":"@site/docs/configuration/sources/icecast.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/icecast","permalink":"/multi-scrobbler/configuration/sources/icecast","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/icecast.mdx","tags":[],"version":"current","frontMatter":{"title":"Icecast","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Google Cast (Chromecast)","permalink":"/multi-scrobbler/configuration/sources/google-cast"},"next":{"title":"Jellyfin","permalink":"/multi-scrobbler/configuration/sources/jellyfin"}}'),a=s(85893),o=s(50065),i=s(703),r=s(73752),c=s(75752),l=s.n(c);let d='[\n {\n "name": "myIcy",\n "enable": true,\n "data": {\n "url": "http://myIcecast.com/radio"\n }\n }\n ]\n ';s(76574);let h={title:"Icecast",toc_min_heading_level:2,toc_max_heading_level:5},u=void 0,m={},f=[{value:"URL and Sources",id:"url-and-sources",level:4},{value:"Configuration",id:"configuration",level:2}];function b(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components},{AIOExample:s,Details:n,SchemaLink:c}=t;return s||x("AIOExample",!0),n||x("Details",!0),c||x("SchemaLink",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"Parse metadata from any Icecast Station (streams) to use for scrobbling."}),"\n",(0,a.jsxs)(t.admonition,{type:"note",children:[(0,a.jsxs)(t.p,{children:["There is no standard format for presenting track information in an Icecast stream and the majority of streams that do include metadata only use a single string (",(0,a.jsx)(t.code,{children:"StreamTitle"}),") from which metadata can be parsed."]}),(0,a.jsx)(t.p,{children:"Multi-scrobbler will do its best to parse Artist/Album/Track information from this data but the quality and consistency for this is solely based on how the Icecast broadcaster chooses to format their tracks."})]}),"\n",(0,a.jsxs)(t.admonition,{title:"Scrobbling Behavior",type:"note",children:[(0,a.jsxs)(t.p,{children:["Multi-scrobbler cannot automatically determine if you are listening to a Station. Therefore, ",(0,a.jsx)(t.strong,{children:"automatic scrobbling for Icecast Sources is off by default."})]}),(0,a.jsxs)(t.p,{children:["Use ",(0,a.jsx)(t.a,{href:"/configuration/sources#should-scrobble-behavior",children:"Should Scrobble Behavior"})," to initiate scrobbling or configure automatic scrobble."]})]}),"\n",(0,a.jsx)(t.admonition,{title:"Scrobbling Threshold",type:"tip",children:(0,a.jsxs)(t.p,{children:['Icecast does not report track lengths so multi-scrobbler cannot determine if it should scrobble based on percent played. You should instead set a shorter "listened to" ',(0,a.jsx)(t.strong,{children:"duration"})," using ",(0,a.jsx)(t.a,{href:"/configuration/sources#scrobble-thresholds",children:"Scrobble Thresholds."})]})}),"\n",(0,a.jsx)(t.h4,{id:"url-and-sources",children:"URL and Sources"}),"\n",(0,a.jsx)(t.p,{children:"The URL should be the URL you would use to stream audio."}),"\n",(0,a.jsxs)(t.p,{children:["Additional sources are supported based on those found in ",(0,a.jsx)(t.a,{href:"https://github.com/eshaz/icecast-metadata-js/tree/main/src/icecast-metadata-stats#supported-status-apis",children:(0,a.jsx)(t.code,{children:"icecast-metadata-stats"})}),". To use these with automatic parsing ",(0,a.jsx)(t.a,{href:"https://github.com/eshaz/icecast-metadata-js/tree/main/src/icecast-metadata-stats#options",children:"based on the regular URL"})," include a ",(0,a.jsx)(t.code,{children:"sources"})," array in your config the same way as shown in ",(0,a.jsx)(t.code,{children:"icecast-metadata-stats"}),":"]}),"\n",(0,a.jsxs)(n,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-json5",metastring:'title="config.json"',children:'[\n {\n "name": "myIcy",\n "enable": true,\n "data": {\n "url": "http://myIcecast.com/radio",\n "sources": ["icy", "ogg", "sevenhtml"]\n }\n }\n ]\n \n'})})]}),"\n",(0,a.jsxs)(t.p,{children:["To manually set these sources include the same ",(0,a.jsxs)(t.a,{href:"https://github.com/eshaz/icecast-metadata-js/tree/main/src/icecast-metadata-stats#options",children:[(0,a.jsx)(t.code,{children:"*Endpoint"})," options"]})," found in ",(0,a.jsx)(t.code,{children:"icecast-metadata-stats"}),"."]}),"\n",(0,a.jsxs)(t.p,{children:["If no ",(0,a.jsx)(t.code,{children:"sources"})," are configured for multi-scrobbler it will automatically try to use ",(0,a.jsx)(t.code,{children:"icy"})," and ",(0,a.jsx)(t.code,{children:"ogg"}),"."]}),"\n",(0,a.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(i.default,{groupId:"configType",queryString:!0,children:[(0,a.jsx)(r.default,{value:"env",label:"ENV",children:(0,a.jsxs)(t.table,{children:[(0,a.jsx)(t.thead,{children:(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,a.jsx)(t.th,{style:{textAlign:"left"},children:"Required?"}),(0,a.jsx)(t.th,{style:{textAlign:"left"},children:"Default"}),(0,a.jsx)(t.th,{children:"Description"})]})}),(0,a.jsx)(t.tbody,{children:(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{style:{textAlign:"left"},children:(0,a.jsx)(t.code,{children:"ICECAST_URL"})}),(0,a.jsx)(t.td,{style:{textAlign:"left"},children:"Yes"}),(0,a.jsx)(t.td,{style:{textAlign:"left"}}),(0,a.jsx)(t.td,{children:"Icecast URL"})]})})]})}),(0,a.jsxs)(r.default,{value:"file",label:"File",children:[(0,a.jsxs)(n,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(l(),{title:"CONFIG_DIR/icecast.json",language:"json5",children:d})]}),(0,a.jsxs)(t.p,{children:["or ",(0,a.jsx)(c,{lower:!0,objectName:"IcecastSourceConfig"})]})]}),(0,a.jsxs)(r.default,{value:"aio",label:"AIO",children:[(0,a.jsxs)(n,{children:[(0,a.jsx)("summary",{children:"Example"}),(0,a.jsx)(s,{data:d,name:"icecast"})]}),(0,a.jsxs)(t.p,{children:["or ",(0,a.jsx)(c,{lower:!0,objectName:"IcecastSourceConfig"})]})]})]})]})}function g(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(b,{...e})}):b(e)}function x(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+12
assets/js/8b39be93.ec2aa37b.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["4330"],{26687:function(e,t,s){s.d(t,{d$:()=>l,ZP:()=>h});var n=s(85893),o=s(50065),a=s(75752),r=s.n(a);function i(e){let t={a:"a",code:"code",p:"p",strong:"strong",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["This ",(0,n.jsx)(t.strong,{children:"Source"})," supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to ",(0,n.jsx)(t.strong,{children:"Should Scrobble"})," found in each Source's status card."]}),"\n",(0,n.jsxs)(t.p,{children:["Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source's ",(0,n.jsx)(t.code,{children:"options"})," in ",(0,n.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,n.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 + "data": { 3 + // ... 4 + }, 5 + "options": { 6 + // highlight-start 7 + // set to true to always scrobble automatically 8 + // set to false to never scrobble automatically 9 + "systemScrobble": true 10 + // highlight-end 11 + } 12 + }}`})]})}function c(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}let l=[];function d(e){let{DetailsAdmo:t}={...(0,o.a)(),...e.components};return t||function(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("DetailsAdmo",!0),(0,n.jsx)(t,{type:"note",summary:"Should Scrobble Behavior",children:(0,n.jsx)(c,{...e})})}function h(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},67676:function(e,t,s){s.r(t),s.d(t,{frontMatter:()=>u,default:()=>g,toc:()=>x,metadata:()=>n,assets:()=>f,contentTitle:()=>m});var n=JSON.parse('{"id":"configuration/sources/icecast","title":"Icecast","description":"Parse metadata from any Icecast Station (streams) to use for scrobbling.","source":"@site/docs/configuration/sources/icecast.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/icecast","permalink":"/multi-scrobbler/configuration/sources/icecast","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/icecast.mdx","tags":[],"version":"current","frontMatter":{"title":"Icecast","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Google Cast (Chromecast)","permalink":"/multi-scrobbler/configuration/sources/google-cast"},"next":{"title":"Jellyfin","permalink":"/multi-scrobbler/configuration/sources/jellyfin"}}'),o=s(85893),a=s(50065),r=s(703),i=s(73752),c=s(75752),l=s.n(c);let d='[\n {\n "name": "myIcy",\n "enable": true,\n "data": {\n "url": "http://myIcecast.com/radio"\n }\n }\n ]\n ';var h=s(26687);let u={title:"Icecast",toc_min_heading_level:2,toc_max_heading_level:5},m=void 0,f={},x=[...h.d$,{value:"URL and Sources",id:"url-and-sources",level:4},{value:"Configuration",id:"configuration",level:2}];function b(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components},{AIOExample:s,Details:n,SchemaLink:c}=t;return s||j("AIOExample",!0),n||j("Details",!0),c||j("SchemaLink",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"Parse metadata from any Icecast Station (streams) to use for scrobbling."}),"\n",(0,o.jsxs)(t.admonition,{type:"note",children:[(0,o.jsxs)(t.p,{children:["There is no standard format for presenting track information in an Icecast stream and the majority of streams that do include metadata only use a single string (",(0,o.jsx)(t.code,{children:"StreamTitle"}),") from which metadata can be parsed."]}),(0,o.jsx)(t.p,{children:"Multi-scrobbler will do its best to parse Artist/Album/Track information from this data but the quality and consistency for this is solely based on how the Icecast broadcaster chooses to format their tracks."})]}),"\n",(0,o.jsxs)(t.p,{children:["Multi-scrobbler cannot automatically determine if you are listening to a Station. Therefore, ",(0,o.jsx)(t.strong,{children:"automatic scrobbling for Icecast Sources is off by default."})," Use ",(0,o.jsx)(t.strong,{children:"Should Scrobble Behavior"})," to initiate scrobbling or configure automatic scrobble."]}),"\n",(0,o.jsx)(h.ZP,{filename:"icecast"}),"\n",(0,o.jsx)(t.admonition,{title:"Scrobbling Threshold",type:"tip",children:(0,o.jsxs)(t.p,{children:['Icecast does not report track lengths so multi-scrobbler cannot determine if it should scrobble based on percent played. You should instead set a shorter "listened to" ',(0,o.jsx)(t.strong,{children:"duration"})," using ",(0,o.jsx)(t.a,{href:"/configuration/sources#scrobble-thresholds",children:"Scrobble Thresholds."})]})}),"\n",(0,o.jsx)(t.h4,{id:"url-and-sources",children:"URL and Sources"}),"\n",(0,o.jsx)(t.p,{children:"The URL should be the URL you would use to stream audio."}),"\n",(0,o.jsxs)(t.p,{children:["Additional sources are supported based on those found in ",(0,o.jsx)(t.a,{href:"https://github.com/eshaz/icecast-metadata-js/tree/main/src/icecast-metadata-stats#supported-status-apis",children:(0,o.jsx)(t.code,{children:"icecast-metadata-stats"})}),". To use these with automatic parsing ",(0,o.jsx)(t.a,{href:"https://github.com/eshaz/icecast-metadata-js/tree/main/src/icecast-metadata-stats#options",children:"based on the regular URL"})," include a ",(0,o.jsx)(t.code,{children:"sources"})," array in your config the same way as shown in ",(0,o.jsx)(t.code,{children:"icecast-metadata-stats"}),":"]}),"\n",(0,o.jsxs)(n,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-json5",metastring:'title="config.json"',children:'[\n {\n "name": "myIcy",\n "enable": true,\n "data": {\n "url": "http://myIcecast.com/radio",\n "sources": ["icy", "ogg", "sevenhtml"]\n }\n }\n ]\n \n'})})]}),"\n",(0,o.jsxs)(t.p,{children:["To manually set these sources include the same ",(0,o.jsxs)(t.a,{href:"https://github.com/eshaz/icecast-metadata-js/tree/main/src/icecast-metadata-stats#options",children:[(0,o.jsx)(t.code,{children:"*Endpoint"})," options"]})," found in ",(0,o.jsx)(t.code,{children:"icecast-metadata-stats"}),"."]}),"\n",(0,o.jsxs)(t.p,{children:["If no ",(0,o.jsx)(t.code,{children:"sources"})," are configured for multi-scrobbler it will automatically try to use ",(0,o.jsx)(t.code,{children:"icy"})," and ",(0,o.jsx)(t.code,{children:"ogg"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(r.default,{groupId:"configType",queryString:!0,children:[(0,o.jsx)(i.default,{value:"env",label:"ENV",children:(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,o.jsx)(t.th,{style:{textAlign:"left"},children:"Required?"}),(0,o.jsx)(t.th,{style:{textAlign:"left"},children:"Default"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsx)(t.tbody,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{style:{textAlign:"left"},children:(0,o.jsx)(t.code,{children:"ICECAST_URL"})}),(0,o.jsx)(t.td,{style:{textAlign:"left"},children:"Yes"}),(0,o.jsx)(t.td,{style:{textAlign:"left"}}),(0,o.jsx)(t.td,{children:"Icecast URL"})]})})]})}),(0,o.jsxs)(i.default,{value:"file",label:"File",children:[(0,o.jsxs)(n,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(l(),{title:"CONFIG_DIR/icecast.json",language:"json5",children:d})]}),(0,o.jsxs)(t.p,{children:["or ",(0,o.jsx)(c,{lower:!0,objectName:"IcecastSourceConfig"})]})]}),(0,o.jsxs)(i.default,{value:"aio",label:"AIO",children:[(0,o.jsxs)(n,{children:[(0,o.jsx)("summary",{children:"Example"}),(0,o.jsx)(s,{data:d,name:"icecast"})]}),(0,o.jsxs)(t.p,{children:["or ",(0,o.jsx)(c,{lower:!0,objectName:"IcecastSourceConfig"})]})]})]})]})}function g(e={}){let{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(b,{...e})}):b(e)}function j(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+1
assets/js/9151.159fcd78.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["9151"],{11753:function(e,t,n){n.d(t,{Z:()=>a}),n(67294);var s=n(85893);function a(e){return(0,s.jsx)("code",{...e})}},81996:function(e,t,n){n.r(t),n.d(t,{default:()=>u});var s=n(67294),a=n(67026),i=n(66575),l=n(87039),r=n(98441),o=n(85893);function c(e){return!!e&&("SUMMARY"===e.tagName||c(e.parentElement))}function d({summary:e,children:t,...n}){(0,i.Z)().collectAnchor(n.id);let d=(0,l.Z)(),u=(0,s.useRef)(null),{collapsed:h,setCollapsed:m}=(0,r.u)({initialState:!n.open}),[f,x]=(0,s.useState)(n.open),j=s.isValidElement(e)?e:(0,o.jsx)("summary",{children:e??"Details"});return(0,o.jsxs)("details",{...n,ref:u,open:f,"data-collapsed":h,className:(0,a.Z)("details_lb9f",d&&"isBrowser_bmU9",n.className),onMouseDown:e=>{c(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();let t=e.target;c(t)&&function e(t,n){return!!t&&(t===n||e(t.parentElement,n))}(t,u.current)&&(e.preventDefault(),h?(m(!1),x(!0)):m(!0))},children:[j,(0,o.jsx)(r.z,{lazy:!1,collapsed:h,onCollapseTransitionEnd:e=>{m(e),x(!e)},children:(0,o.jsx)("div",{className:"collapsibleContent_i85q",children:t})})]})}function u({...e}){return(0,o.jsx)(d,{...e,className:(0,a.Z)("alert alert--info","details_b_Ee",e.className)})}},97774:function(e,t,n){n.d(t,{Z:()=>p}),n(67294);var s=n(67026),a=n(34036),i=n(7035),l=n(27765),r=n(50436),o=n(14709),c=n(8043),d=n(85893);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}function h(){let e=(0,c.ZP)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(r.Z,{"aria-label":(0,o.translate)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:"breadcrumbHomeIcon_YNFT"})})})}var m=n(34903),f=n(72442);function x(e){let t=function({breadcrumbs:e}){let{siteConfig:t}=(0,f.default)();return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.filter(e=>e.href).map((e,n)=>({"@type":"ListItem",position:n+1,name:e.label,item:`${t.url}${e.href}`}))}}({breadcrumbs:e.breadcrumbs});return(0,d.jsx)(m.Z,{children:(0,d.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function j({children:e,href:t,isLast:n}){let s="breadcrumbs__link";return n?(0,d.jsx)("span",{className:s,children:e}):t?(0,d.jsx)(r.Z,{className:s,href:t,children:(0,d.jsx)("span",{children:e})}):(0,d.jsx)("span",{className:s,children:e})}function b({children:e,active:t}){return(0,d.jsx)("li",{className:(0,s.Z)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:e})}function p(){let e=(0,i.s1)(),t=(0,l.Ns)();return e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(x,{breadcrumbs:e}),(0,d.jsx)("nav",{className:(0,s.Z)(a.k.docs.docBreadcrumbs,"breadcrumbsContainer_Z_bl"),"aria-label":(0,o.translate)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",children:[t&&(0,d.jsx)(h,{}),e.map((t,n)=>{let s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(b,{active:s,children:(0,d.jsx)(j,{href:a,isLast:s,children:t.label})},n)})]})})]}):null}},49971:function(e,t,n){n.r(t),n.d(t,{default:()=>ea});var s=n(67294),a=n(64994),i=n(73436),l=n(85893);let r=s.createContext(null);function o({children:e,content:t}){let n=(0,s.useMemo)(()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,contentTitle:t.contentTitle,toc:t.toc}),[t]);return(0,l.jsx)(r.Provider,{value:n,children:e})}function c(){let e=(0,s.useContext)(r);if(null===e)throw new i.i6("DocProvider");return e}function d(){let{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(67026),h=n(1868),m=n(15726);function f(){let{metadata:e}=c();return(0,l.jsx)(m.Z,{className:"docusaurus-mt-lg",previous:e.previous,next:e.next})}var x=n(72049),j=n(95251),b=n(34036),p=n(14709),v=n(50436);function g({permalink:e,label:t,count:n,description:s}){return(0,l.jsxs)(v.Z,{rel:"tag",href:e,title:s,className:(0,u.Z)("tag_zVej",n?"tagWithCount_h2kH":"tagRegular_sFm0"),children:[t,n&&(0,l.jsx)("span",{children:n})]})}function _({tags:e}){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(p.default,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,u.Z)("tags_jXut","padding--none","margin-left--sm"),children:e.map(e=>(0,l.jsx)("li",{className:"tag_QGVx",children:(0,l.jsx)(g,{...e})},e.permalink))})]})}function N({className:e,...t}){return(0,l.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.Z)("iconEdit_Z9Sw",e),"aria-hidden":"true",...t,children:(0,l.jsx)("g",{children:(0,l.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function Z({editUrl:e}){return(0,l.jsxs)(v.Z,{to:e,className:b.k.common.editThisPage,children:[(0,l.jsx)(N,{}),(0,l.jsx)(p.default,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var k=n(72442);function y({lastUpdatedAt:e}){let t=new Date(e),n=(function(e={}){let{i18n:{currentLocale:t}}=(0,k.default)(),n=function(){let{i18n:{currentLocale:e,localeConfigs:t}}=(0,k.default)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})})({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(t);return(0,l.jsx)(p.default,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:t.toISOString(),itemProp:"dateModified",children:n})})},children:" on {date}"})}function L({lastUpdatedBy:e}){return(0,l.jsx)(p.default,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:e})},children:" by {user}"})}function T({lastUpdatedAt:e,lastUpdatedBy:t}){return(0,l.jsxs)("span",{className:b.k.common.lastUpdated,children:[(0,l.jsx)(p.default,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:e?(0,l.jsx)(y,{lastUpdatedAt:e}):"",byUser:t?(0,l.jsx)(L,{lastUpdatedBy:t}):""},children:"Last updated{atDate}{byUser}"}),!1]})}function C({className:e,editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s}){return(0,l.jsxs)("div",{className:(0,u.Z)("row",e),children:[(0,l.jsx)("div",{className:"col",children:t&&(0,l.jsx)(Z,{editUrl:t})}),(0,l.jsx)("div",{className:(0,u.Z)("col","lastUpdated_JAkA"),children:(n||s)&&(0,l.jsx)(T,{lastUpdatedAt:n,lastUpdatedBy:s})})]})}function w(){let{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,r=!!(t||n||s);return i||r?(0,l.jsxs)("footer",{className:(0,u.Z)(b.k.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.Z)("row margin-top--sm",b.k.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(_,{tags:a})})}),r&&(0,l.jsx)(C,{className:(0,u.Z)("margin-top--sm",b.k.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var E=n(98441),A=n(21641);function B(e){let t=e.getBoundingClientRect();return t.top===t.bottom?B(e.parentNode):t}let U=s.memo(function e({toc:t,className:n,linkClassName:s,isChild:a}){return t.length?(0,l.jsx)("ul",{className:a?void 0:n,children:t.map(t=>(0,l.jsxs)("li",{children:[(0,l.jsx)(v.Z,{to:`#${t.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:t.value}}),(0,l.jsx)(e,{isChild:!0,toc:t.children,className:n,linkClassName:s})]},t.id))}):null});function M({toc:e,className:t="table-of-contents table-of-contents__left-border",linkClassName:n="table-of-contents__link",linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:r,...o}){let c=(0,A.L)(),d=i??c.tableOfContents.minHeadingLevel,u=r??c.tableOfContents.maxHeadingLevel,h=function({toc:e,minHeadingLevel:t,maxHeadingLevel:n}){return(0,s.useMemo)(()=>(function e({toc:t,minHeadingLevel:n,maxHeadingLevel:s}){return t.flatMap(t=>{let a=e({toc:t.children,minHeadingLevel:n,maxHeadingLevel:s});return t.level>=n&&t.level<=s?[{...t,children:a}]:a})})({toc:function(e){let t=e.map(e=>({...e,parentIndex:-1,children:[]})),n=Array(7).fill(-1);t.forEach((e,t)=>{let s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t});let s=[];return t.forEach(e=>{let{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)}),s}(e),minHeadingLevel:t,maxHeadingLevel:n}),[e,t,n])}({toc:e,minHeadingLevel:d,maxHeadingLevel:u});var m=(0,s.useMemo)(()=>{if(n&&a)return{linkClassName:n,linkActiveClassName:a,minHeadingLevel:d,maxHeadingLevel:u}},[n,a,d,u]);let f=(0,s.useRef)(void 0),x=function(){let e=(0,s.useRef)(0),{navbar:{hideOnScroll:t}}=(0,A.L)();return(0,s.useEffect)(()=>{e.current=t?0:document.querySelector(".navbar").clientHeight},[t]),e}();return(0,s.useEffect)(()=>{if(!m)return()=>{};let{linkClassName:e,linkActiveClassName:t,minHeadingLevel:n,maxHeadingLevel:s}=m;function a(){let a=Array.from(document.getElementsByClassName(e)),i=function(e,{anchorTopOffset:t}){let n=e.find(e=>B(e).top>=t);if(n){var s;return(s=B(n)).top>0&&s.bottom<window.innerHeight/2?n:e[e.indexOf(n)-1]??null}return e[e.length-1]??null}(function({minHeadingLevel:e,maxHeadingLevel:t}){let n=[];for(let s=e;s<=t;s+=1)n.push(`h${s}.anchor`);return Array.from(document.querySelectorAll(n.join()))}({minHeadingLevel:n,maxHeadingLevel:s}),{anchorTopOffset:x.current}),l=a.find(e=>i&&i.id===decodeURIComponent(e.href.substring(e.href.indexOf("#")+1)));a.forEach(e=>{e===l?(f.current&&f.current!==e&&f.current.classList.remove(t),e.classList.add(t),f.current=e):e.classList.remove(t)})}return document.addEventListener("scroll",a),document.addEventListener("resize",a),a(),()=>{document.removeEventListener("scroll",a),document.removeEventListener("resize",a)}},[m,x]),(0,l.jsx)(U,{toc:h,className:t,linkClassName:n,...o})}function V({collapsed:e,...t}){return(0,l.jsx)("button",{type:"button",...t,className:(0,u.Z)("clean-btn","tocCollapsibleButton_TO0P",!e&&"tocCollapsibleButtonExpanded_MG3E",t.className),children:(0,l.jsx)(p.default,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}function H({toc:e,className:t,minHeadingLevel:n,maxHeadingLevel:s}){let{collapsed:a,toggleCollapsed:i}=(0,E.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.Z)("tocCollapsible_ETCw",!a&&"tocCollapsibleExpanded_sAul",t),children:[(0,l.jsx)(V,{collapsed:a,onClick:i}),(0,l.jsx)(E.z,{lazy:!0,className:"tocCollapsibleContent_vkbj",collapsed:a,children:(0,l.jsx)(M,{toc:e,minHeadingLevel:n,maxHeadingLevel:s})})]})}function D(){let{toc:e,frontMatter:t}=c();return(0,l.jsx)(H,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.Z)(b.k.docs.docTocMobile,"tocMobile_ITEo")})}function I({className:e,...t}){return(0,l.jsx)("div",{className:(0,u.Z)("tableOfContents_bqdL","thin-scrollbar",e),children:(0,l.jsx)(M,{...t,linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})})}function F(){let{toc:e,frontMatter:t}=c();return(0,l.jsx)(I,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:b.k.docs.docTocDesktop})}var O=n(57509),S=n(50065),R=n(29540);function z({children:e}){return(0,l.jsx)(S.Z,{components:R.Z,children:e})}function P({children:e}){let t=function(){let{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.Z)(b.k.docs.docMarkdown,"markdown"),children:[t&&(0,l.jsx)("header",{children:(0,l.jsx)(O.Z,{as:"h1",children:t})}),(0,l.jsx)(z,{children:e})]})}var q=n(97774),$=n(34903);function J(){return(0,l.jsx)(p.default,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function G(){return(0,l.jsx)(p.default,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function Y(){return(0,l.jsx)($.Z,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Q(){return(0,l.jsx)(p.default,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function W(){return(0,l.jsx)(p.default,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}var X=n(57682);function K({className:e}){return(0,l.jsx)(X.Z,{type:"caution",title:(0,l.jsx)(Q,{}),className:(0,u.Z)(e,b.k.common.draftBanner),children:(0,l.jsx)(W,{})})}function ee({className:e}){return(0,l.jsx)(X.Z,{type:"caution",title:(0,l.jsx)(J,{}),className:(0,u.Z)(e,b.k.common.unlistedBanner),children:(0,l.jsx)(G,{})})}function et(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Y,{}),(0,l.jsx)(ee,{...e})]})}function en({metadata:e}){let{unlisted:t,frontMatter:n}=e;return(0,l.jsxs)(l.Fragment,{children:[(t||n.unlisted)&&(0,l.jsx)(et,{}),n.draft&&(0,l.jsx)(K,{})]})}function es({children:e}){let t=function(){let{frontMatter:e,toc:t}=c(),n=(0,h.i)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(D,{}):void 0,desktop:a&&("desktop"===n||"ssr"===n)?(0,l.jsx)(F,{}):void 0}}(),{metadata:n}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.Z)("col",!t.hidden&&"docItemCol_VOVn"),children:[(0,l.jsx)(en,{metadata:n}),(0,l.jsx)(x.Z,{}),(0,l.jsxs)("div",{className:"docItemContainer_Djhp",children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(q.Z,{}),(0,l.jsx)(j.Z,{}),t.mobile,(0,l.jsx)(P,{children:e}),(0,l.jsx)(w,{})]}),(0,l.jsx)(f,{})]})]}),t.desktop&&(0,l.jsx)("div",{className:"col col--3",children:t.desktop})]})}function ea(e){let t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(o,{content:e.content,children:(0,l.jsxs)(a.FG,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(es,{children:(0,l.jsx)(n,{})})]})})}},15726:function(e,t,n){n.d(t,{Z:()=>o}),n(67294);var s=n(67026),a=n(14709),i=n(50436),l=n(85893);function r(e){let{permalink:t,title:n,subLabel:a,isNext:r}=e;return(0,l.jsxs)(i.Z,{className:(0,s.Z)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[a&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,l.jsx)("div",{className:"pagination-nav__label",children:n})]})}function o(e){let{className:t,previous:n,next:i}=e;return(0,l.jsxs)("nav",{className:(0,s.Z)(t,"pagination-nav"),"aria-label":(0,a.translate)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,l.jsx)(r,{...n,subLabel:(0,l.jsx)(a.default,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),i&&(0,l.jsx)(r,{...i,subLabel:(0,l.jsx)(a.default,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},95251:function(e,t,n){n.d(t,{Z:()=>o}),n(67294);var s=n(67026),a=n(14709),i=n(34036),l=n(60464),r=n(85893);function o({className:e}){let t=(0,l.E)();return t.badge?(0,r.jsx)("span",{className:(0,s.Z)(e,i.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,r.jsx)(a.default,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}},72049:function(e,t,n){n.d(t,{Z:()=>j}),n(67294);var s=n(67026),a=n(72442),i=n(50436),l=n(14709),r=n(86055),o=n(34036),c=n(49758),d=n(60464),u=n(85893);let h={unreleased:function({siteTitle:e,versionMetadata:t}){return(0,u.jsx)(l.default,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:e,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function({siteTitle:e,versionMetadata:t}){return(0,u.jsx)(l.default,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:e,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function m(e){let t=h[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function f({versionLabel:e,to:t,onClick:n}){return(0,u.jsx)(l.default,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:e,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.Z,{to:t,onClick:n,children:(0,u.jsx)(l.default,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function x({className:e,versionMetadata:t}){let{siteConfig:{title:n}}=(0,a.default)(),{pluginId:i}=(0,r.gA)({failfast:!0}),{savePreferredVersionName:l}=(0,c.J)(i),{latestDocSuggestion:d,latestVersionSuggestion:h}=(0,r.Jo)(i),x=d??h.docs.find(e=>e.id===h.mainDocId);return(0,u.jsxs)("div",{className:(0,s.Z)(e,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(m,{siteTitle:n,versionMetadata:t})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(f,{versionLabel:h.label,to:x.path,onClick:()=>l(h.name)})})]})}function j({className:e}){let t=(0,d.E)();return t.banner?(0,u.jsx)(x,{className:e,versionMetadata:t}):null}},13580:function(e,t,n){n.d(t,{Z:()=>b});var s=n(67294),a=n(34903),i=n(75752),l=n.n(i),r=n(11753),o=n(85893),c=n(50436),d=n(81996);function u(e){let t=s.Children.toArray(e.children),n=t.find(e=>s.isValidElement(e)&&"summary"===e.type),a=(0,o.jsx)(o.Fragment,{children:t.filter(e=>e!==n)});return(0,o.jsx)(d.default,{...e,summary:n,children:a})}var h=n(57509);function m(e){return(0,o.jsx)(h.Z,{...e})}var f=n(67026),x=n(66575),j=n(57682);let b={Head:a.Z,details:u,Details:u,code:function(e){return void 0!==e.children&&s.Children.toArray(e.children).every(e=>"string"==typeof e&&!e.includes("\n"))?(0,o.jsx)(r.Z,{...e}):(0,o.jsx)(l(),{...e})},a:function(e){return(0,o.jsx)(c.Z,{...e})},pre:function(e){return(0,o.jsx)(o.Fragment,{children:e.children})},ul:function(e){return(0,o.jsx)("ul",{...e,className:function(e){if(void 0!==e)return(0,f.Z)(e,e?.includes("contains-task-list")&&"containsTaskList_mC6p")}(e.className)})},li:function(e){return(0,x.Z)().collectAnchor(e.id),(0,o.jsx)("li",{...e})},img:function(e){var t;return(0,o.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,f.Z)(t,"img_ev3q"))})},h1:e=>(0,o.jsx)(m,{as:"h1",...e}),h2:e=>(0,o.jsx)(m,{as:"h2",...e}),h3:e=>(0,o.jsx)(m,{as:"h3",...e}),h4:e=>(0,o.jsx)(m,{as:"h4",...e}),h5:e=>(0,o.jsx)(m,{as:"h5",...e}),h6:e=>(0,o.jsx)(m,{as:"h6",...e}),admonition:j.Z,mermaid:()=>null}}}]);
-1
assets/js/9151.a330ab2d.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["9151"],{11753:function(e,t,n){n.d(t,{Z:()=>a}),n(67294);var s=n(85893);function a(e){return(0,s.jsx)("code",{...e})}},81996:function(e,t,n){n.r(t),n.d(t,{default:()=>u});var s=n(67294),a=n(67026),i=n(66575),l=n(87039),r=n(98441),o=n(85893);function c(e){return!!e&&("SUMMARY"===e.tagName||c(e.parentElement))}function d({summary:e,children:t,...n}){(0,i.Z)().collectAnchor(n.id);let d=(0,l.Z)(),u=(0,s.useRef)(null),{collapsed:h,setCollapsed:m}=(0,r.u)({initialState:!n.open}),[f,x]=(0,s.useState)(n.open),j=s.isValidElement(e)?e:(0,o.jsx)("summary",{children:e??"Details"});return(0,o.jsxs)("details",{...n,ref:u,open:f,"data-collapsed":h,className:(0,a.Z)("details_lb9f",d&&"isBrowser_bmU9",n.className),onMouseDown:e=>{c(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();let t=e.target;c(t)&&function e(t,n){return!!t&&(t===n||e(t.parentElement,n))}(t,u.current)&&(e.preventDefault(),h?(m(!1),x(!0)):m(!0))},children:[j,(0,o.jsx)(r.z,{lazy:!1,collapsed:h,onCollapseTransitionEnd:e=>{m(e),x(!e)},children:(0,o.jsx)("div",{className:"collapsibleContent_i85q",children:t})})]})}function u({...e}){return(0,o.jsx)(d,{...e,className:(0,a.Z)("alert alert--info","details_b_Ee",e.className)})}},97774:function(e,t,n){n.d(t,{Z:()=>p}),n(67294);var s=n(67026),a=n(34036),i=n(7035),l=n(27765),r=n(50436),o=n(14709),c=n(8043),d=n(85893);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}function h(){let e=(0,c.ZP)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(r.Z,{"aria-label":(0,o.translate)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:"breadcrumbHomeIcon_YNFT"})})})}var m=n(34903),f=n(72442);function x(e){let t=function({breadcrumbs:e}){let{siteConfig:t}=(0,f.default)();return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.filter(e=>e.href).map((e,n)=>({"@type":"ListItem",position:n+1,name:e.label,item:`${t.url}${e.href}`}))}}({breadcrumbs:e.breadcrumbs});return(0,d.jsx)(m.Z,{children:(0,d.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function j({children:e,href:t,isLast:n}){let s="breadcrumbs__link";return n?(0,d.jsx)("span",{className:s,children:e}):t?(0,d.jsx)(r.Z,{className:s,href:t,children:(0,d.jsx)("span",{children:e})}):(0,d.jsx)("span",{className:s,children:e})}function b({children:e,active:t}){return(0,d.jsx)("li",{className:(0,s.Z)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:e})}function p(){let e=(0,i.s1)(),t=(0,l.Ns)();return e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(x,{breadcrumbs:e}),(0,d.jsx)("nav",{className:(0,s.Z)(a.k.docs.docBreadcrumbs,"breadcrumbsContainer_Z_bl"),"aria-label":(0,o.translate)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",children:[t&&(0,d.jsx)(h,{}),e.map((t,n)=>{let s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(b,{active:s,children:(0,d.jsx)(j,{href:a,isLast:s,children:t.label})},n)})]})})]}):null}},49971:function(e,t,n){n.r(t),n.d(t,{default:()=>ea});var s=n(67294),a=n(64994),i=n(73436),l=n(85893);let r=s.createContext(null);function o({children:e,content:t}){let n=(0,s.useMemo)(()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,contentTitle:t.contentTitle,toc:t.toc}),[t]);return(0,l.jsx)(r.Provider,{value:n,children:e})}function c(){let e=(0,s.useContext)(r);if(null===e)throw new i.i6("DocProvider");return e}function d(){let{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(67026),h=n(1868),m=n(15726);function f(){let{metadata:e}=c();return(0,l.jsx)(m.Z,{className:"docusaurus-mt-lg",previous:e.previous,next:e.next})}var x=n(72049),j=n(95251),b=n(34036),p=n(14709),v=n(50436);function g({permalink:e,label:t,count:n,description:s}){return(0,l.jsxs)(v.Z,{rel:"tag",href:e,title:s,className:(0,u.Z)("tag_zVej",n?"tagWithCount_h2kH":"tagRegular_sFm0"),children:[t,n&&(0,l.jsx)("span",{children:n})]})}function _({tags:e}){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(p.default,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,u.Z)("tags_jXut","padding--none","margin-left--sm"),children:e.map(e=>(0,l.jsx)("li",{className:"tag_QGVx",children:(0,l.jsx)(g,{...e})},e.permalink))})]})}function N({className:e,...t}){return(0,l.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.Z)("iconEdit_Z9Sw",e),"aria-hidden":"true",...t,children:(0,l.jsx)("g",{children:(0,l.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function Z({editUrl:e}){return(0,l.jsxs)(v.Z,{to:e,className:b.k.common.editThisPage,children:[(0,l.jsx)(N,{}),(0,l.jsx)(p.default,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var k=n(72442);function y({lastUpdatedAt:e}){let t=new Date(e),n=(function(e={}){let{i18n:{currentLocale:t}}=(0,k.default)(),n=function(){let{i18n:{currentLocale:e,localeConfigs:t}}=(0,k.default)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})})({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(t);return(0,l.jsx)(p.default,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:t.toISOString(),itemProp:"dateModified",children:n})})},children:" on {date}"})}function L({lastUpdatedBy:e}){return(0,l.jsx)(p.default,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:e})},children:" by {user}"})}function T({lastUpdatedAt:e,lastUpdatedBy:t}){return(0,l.jsxs)("span",{className:b.k.common.lastUpdated,children:[(0,l.jsx)(p.default,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:e?(0,l.jsx)(y,{lastUpdatedAt:e}):"",byUser:t?(0,l.jsx)(L,{lastUpdatedBy:t}):""},children:"Last updated{atDate}{byUser}"}),!1]})}function C({className:e,editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s}){return(0,l.jsxs)("div",{className:(0,u.Z)("row",e),children:[(0,l.jsx)("div",{className:"col",children:t&&(0,l.jsx)(Z,{editUrl:t})}),(0,l.jsx)("div",{className:(0,u.Z)("col","lastUpdated_JAkA"),children:(n||s)&&(0,l.jsx)(T,{lastUpdatedAt:n,lastUpdatedBy:s})})]})}function w(){let{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,r=!!(t||n||s);return i||r?(0,l.jsxs)("footer",{className:(0,u.Z)(b.k.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.Z)("row margin-top--sm",b.k.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(_,{tags:a})})}),r&&(0,l.jsx)(C,{className:(0,u.Z)("margin-top--sm",b.k.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var E=n(98441),A=n(21641);function B(e){let t=e.getBoundingClientRect();return t.top===t.bottom?B(e.parentNode):t}let U=s.memo(function e({toc:t,className:n,linkClassName:s,isChild:a}){return t.length?(0,l.jsx)("ul",{className:a?void 0:n,children:t.map(t=>(0,l.jsxs)("li",{children:[(0,l.jsx)(v.Z,{to:`#${t.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:t.value}}),(0,l.jsx)(e,{isChild:!0,toc:t.children,className:n,linkClassName:s})]},t.id))}):null});function M({toc:e,className:t="table-of-contents table-of-contents__left-border",linkClassName:n="table-of-contents__link",linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:r,...o}){let c=(0,A.L)(),d=i??c.tableOfContents.minHeadingLevel,u=r??c.tableOfContents.maxHeadingLevel,h=function({toc:e,minHeadingLevel:t,maxHeadingLevel:n}){return(0,s.useMemo)(()=>(function e({toc:t,minHeadingLevel:n,maxHeadingLevel:s}){return t.flatMap(t=>{let a=e({toc:t.children,minHeadingLevel:n,maxHeadingLevel:s});return t.level>=n&&t.level<=s?[{...t,children:a}]:a})})({toc:function(e){let t=e.map(e=>({...e,parentIndex:-1,children:[]})),n=Array(7).fill(-1);t.forEach((e,t)=>{let s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t});let s=[];return t.forEach(e=>{let{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)}),s}(e),minHeadingLevel:t,maxHeadingLevel:n}),[e,t,n])}({toc:e,minHeadingLevel:d,maxHeadingLevel:u});var m=(0,s.useMemo)(()=>{if(n&&a)return{linkClassName:n,linkActiveClassName:a,minHeadingLevel:d,maxHeadingLevel:u}},[n,a,d,u]);let f=(0,s.useRef)(void 0),x=function(){let e=(0,s.useRef)(0),{navbar:{hideOnScroll:t}}=(0,A.L)();return(0,s.useEffect)(()=>{e.current=t?0:document.querySelector(".navbar").clientHeight},[t]),e}();return(0,s.useEffect)(()=>{if(!m)return()=>{};let{linkClassName:e,linkActiveClassName:t,minHeadingLevel:n,maxHeadingLevel:s}=m;function a(){let a=Array.from(document.getElementsByClassName(e)),i=function(e,{anchorTopOffset:t}){let n=e.find(e=>B(e).top>=t);if(n){var s;return(s=B(n)).top>0&&s.bottom<window.innerHeight/2?n:e[e.indexOf(n)-1]??null}return e[e.length-1]??null}(function({minHeadingLevel:e,maxHeadingLevel:t}){let n=[];for(let s=e;s<=t;s+=1)n.push(`h${s}.anchor`);return Array.from(document.querySelectorAll(n.join()))}({minHeadingLevel:n,maxHeadingLevel:s}),{anchorTopOffset:x.current}),l=a.find(e=>i&&i.id===decodeURIComponent(e.href.substring(e.href.indexOf("#")+1)));a.forEach(e=>{e===l?(f.current&&f.current!==e&&f.current.classList.remove(t),e.classList.add(t),f.current=e):e.classList.remove(t)})}return document.addEventListener("scroll",a),document.addEventListener("resize",a),a(),()=>{document.removeEventListener("scroll",a),document.removeEventListener("resize",a)}},[m,x]),(0,l.jsx)(U,{toc:h,className:t,linkClassName:n,...o})}function V({collapsed:e,...t}){return(0,l.jsx)("button",{type:"button",...t,className:(0,u.Z)("clean-btn","tocCollapsibleButton_TO0P",!e&&"tocCollapsibleButtonExpanded_MG3E",t.className),children:(0,l.jsx)(p.default,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}function H({toc:e,className:t,minHeadingLevel:n,maxHeadingLevel:s}){let{collapsed:a,toggleCollapsed:i}=(0,E.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.Z)("tocCollapsible_ETCw",!a&&"tocCollapsibleExpanded_sAul",t),children:[(0,l.jsx)(V,{collapsed:a,onClick:i}),(0,l.jsx)(E.z,{lazy:!0,className:"tocCollapsibleContent_vkbj",collapsed:a,children:(0,l.jsx)(M,{toc:e,minHeadingLevel:n,maxHeadingLevel:s})})]})}function D(){let{toc:e,frontMatter:t}=c();return(0,l.jsx)(H,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.Z)(b.k.docs.docTocMobile,"tocMobile_ITEo")})}function I({className:e,...t}){return(0,l.jsx)("div",{className:(0,u.Z)("tableOfContents_bqdL","thin-scrollbar",e),children:(0,l.jsx)(M,{...t,linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})})}function F(){let{toc:e,frontMatter:t}=c();return(0,l.jsx)(I,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:b.k.docs.docTocDesktop})}var O=n(57509),S=n(50065),R=n(5780);function z({children:e}){return(0,l.jsx)(S.Z,{components:R.Z,children:e})}function P({children:e}){let t=function(){let{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.Z)(b.k.docs.docMarkdown,"markdown"),children:[t&&(0,l.jsx)("header",{children:(0,l.jsx)(O.Z,{as:"h1",children:t})}),(0,l.jsx)(z,{children:e})]})}var q=n(97774),$=n(34903);function J(){return(0,l.jsx)(p.default,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function G(){return(0,l.jsx)(p.default,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function Y(){return(0,l.jsx)($.Z,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Q(){return(0,l.jsx)(p.default,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function W(){return(0,l.jsx)(p.default,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}var X=n(29097);function K({className:e}){return(0,l.jsx)(X.Z,{type:"caution",title:(0,l.jsx)(Q,{}),className:(0,u.Z)(e,b.k.common.draftBanner),children:(0,l.jsx)(W,{})})}function ee({className:e}){return(0,l.jsx)(X.Z,{type:"caution",title:(0,l.jsx)(J,{}),className:(0,u.Z)(e,b.k.common.unlistedBanner),children:(0,l.jsx)(G,{})})}function et(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Y,{}),(0,l.jsx)(ee,{...e})]})}function en({metadata:e}){let{unlisted:t,frontMatter:n}=e;return(0,l.jsxs)(l.Fragment,{children:[(t||n.unlisted)&&(0,l.jsx)(et,{}),n.draft&&(0,l.jsx)(K,{})]})}function es({children:e}){let t=function(){let{frontMatter:e,toc:t}=c(),n=(0,h.i)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(D,{}):void 0,desktop:a&&("desktop"===n||"ssr"===n)?(0,l.jsx)(F,{}):void 0}}(),{metadata:n}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.Z)("col",!t.hidden&&"docItemCol_VOVn"),children:[(0,l.jsx)(en,{metadata:n}),(0,l.jsx)(x.Z,{}),(0,l.jsxs)("div",{className:"docItemContainer_Djhp",children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(q.Z,{}),(0,l.jsx)(j.Z,{}),t.mobile,(0,l.jsx)(P,{children:e}),(0,l.jsx)(w,{})]}),(0,l.jsx)(f,{})]})]}),t.desktop&&(0,l.jsx)("div",{className:"col col--3",children:t.desktop})]})}function ea(e){let t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(o,{content:e.content,children:(0,l.jsxs)(a.FG,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(es,{children:(0,l.jsx)(n,{})})]})})}},15726:function(e,t,n){n.d(t,{Z:()=>o}),n(67294);var s=n(67026),a=n(14709),i=n(50436),l=n(85893);function r(e){let{permalink:t,title:n,subLabel:a,isNext:r}=e;return(0,l.jsxs)(i.Z,{className:(0,s.Z)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[a&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,l.jsx)("div",{className:"pagination-nav__label",children:n})]})}function o(e){let{className:t,previous:n,next:i}=e;return(0,l.jsxs)("nav",{className:(0,s.Z)(t,"pagination-nav"),"aria-label":(0,a.translate)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,l.jsx)(r,{...n,subLabel:(0,l.jsx)(a.default,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),i&&(0,l.jsx)(r,{...i,subLabel:(0,l.jsx)(a.default,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},95251:function(e,t,n){n.d(t,{Z:()=>o}),n(67294);var s=n(67026),a=n(14709),i=n(34036),l=n(60464),r=n(85893);function o({className:e}){let t=(0,l.E)();return t.badge?(0,r.jsx)("span",{className:(0,s.Z)(e,i.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,r.jsx)(a.default,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}},72049:function(e,t,n){n.d(t,{Z:()=>j}),n(67294);var s=n(67026),a=n(72442),i=n(50436),l=n(14709),r=n(86055),o=n(34036),c=n(49758),d=n(60464),u=n(85893);let h={unreleased:function({siteTitle:e,versionMetadata:t}){return(0,u.jsx)(l.default,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:e,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function({siteTitle:e,versionMetadata:t}){return(0,u.jsx)(l.default,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:e,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function m(e){let t=h[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function f({versionLabel:e,to:t,onClick:n}){return(0,u.jsx)(l.default,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:e,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.Z,{to:t,onClick:n,children:(0,u.jsx)(l.default,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function x({className:e,versionMetadata:t}){let{siteConfig:{title:n}}=(0,a.default)(),{pluginId:i}=(0,r.gA)({failfast:!0}),{savePreferredVersionName:l}=(0,c.J)(i),{latestDocSuggestion:d,latestVersionSuggestion:h}=(0,r.Jo)(i),x=d??h.docs.find(e=>e.id===h.mainDocId);return(0,u.jsxs)("div",{className:(0,s.Z)(e,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(m,{siteTitle:n,versionMetadata:t})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(f,{versionLabel:h.label,to:x.path,onClick:()=>l(h.name)})})]})}function j({className:e}){let t=(0,d.E)();return t.banner?(0,u.jsx)(x,{className:e,versionMetadata:t}):null}},13580:function(e,t,n){n.d(t,{Z:()=>b});var s=n(67294),a=n(34903),i=n(75752),l=n.n(i),r=n(11753),o=n(85893),c=n(50436),d=n(81996);function u(e){let t=s.Children.toArray(e.children),n=t.find(e=>s.isValidElement(e)&&"summary"===e.type),a=(0,o.jsx)(o.Fragment,{children:t.filter(e=>e!==n)});return(0,o.jsx)(d.default,{...e,summary:n,children:a})}var h=n(57509);function m(e){return(0,o.jsx)(h.Z,{...e})}var f=n(67026),x=n(66575),j=n(29097);let b={Head:a.Z,details:u,Details:u,code:function(e){return void 0!==e.children&&s.Children.toArray(e.children).every(e=>"string"==typeof e&&!e.includes("\n"))?(0,o.jsx)(r.Z,{...e}):(0,o.jsx)(l(),{...e})},a:function(e){return(0,o.jsx)(c.Z,{...e})},pre:function(e){return(0,o.jsx)(o.Fragment,{children:e.children})},ul:function(e){return(0,o.jsx)("ul",{...e,className:function(e){if(void 0!==e)return(0,f.Z)(e,e?.includes("contains-task-list")&&"containsTaskList_mC6p")}(e.className)})},li:function(e){return(0,x.Z)().collectAnchor(e.id),(0,o.jsx)("li",{...e})},img:function(e){var t;return(0,o.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,f.Z)(t,"img_ev3q"))})},h1:e=>(0,o.jsx)(m,{as:"h1",...e}),h2:e=>(0,o.jsx)(m,{as:"h2",...e}),h3:e=>(0,o.jsx)(m,{as:"h3",...e}),h4:e=>(0,o.jsx)(m,{as:"h4",...e}),h5:e=>(0,o.jsx)(m,{as:"h5",...e}),h6:e=>(0,o.jsx)(m,{as:"h6",...e}),admonition:j.Z,mermaid:()=>null}}}]);
+1
assets/js/9bcab3db.2c75e141.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6374"],{19946:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>a,default:()=>d,toc:()=>u,metadata:()=>i,assets:()=>l,contentTitle:()=>c});var i=JSON.parse('{"id":"configuration/sources/lastfm-source","title":"Last.fm","description":"This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients.","source":"@site/docs/configuration/sources/lastfm-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/lastfm-source","permalink":"/multi-scrobbler/configuration/sources/lastfm-source","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/lastfm-source.mdx","tags":[],"version":"current","frontMatter":{"title":"Last.fm","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Lastfm (Endpoint)","permalink":"/multi-scrobbler/configuration/sources/lastfm-endpoint"},"next":{"title":"Libre.fm","permalink":"/multi-scrobbler/configuration/sources/librefm-source"}}'),o=n(85893),s=n(50065);n(703),n(73752),n(75752);var r=n(55293);let a={title:"Last.fm",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,l={},u=[{value:"Configuration",id:"configuration",level:2}];function f(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Config:n}=t;return n||function(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["This Source ",(0,o.jsx)(t.strong,{children:"monitors your Last.fm scrobble history"})," and re-scrobbles new activity to configured ",(0,o.jsx)(t.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,o.jsx)(t.admonition,{title:"Other Uses",type:"tip",children:(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["To ",(0,o.jsx)(t.strong,{children:"scrobble to"})," Last.fm/Libre.fm, create a ",(0,o.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})]}),"\n",(0,o.jsxs)(t.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a ",(0,o.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})]}),"\n"]})}),"\n",(0,o.jsxs)(t.p,{children:["To configure this Source use the same registration instructions and configuration data shown in ",(0,o.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})," with the difference being ",(0,o.jsx)(t.code,{children:'"configureAs": "source"'})," defined in the File/AIO configuration below."]}),"\n",(0,o.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsx)(n,{config:"LastfmSourceConfig",fileContent:r.Z,name:"lastfm",children:(0,o.jsx)(t.admonition,{type:"note",children:(0,o.jsxs)(t.p,{children:["You cannot use ENV variables shown in the ",(0,o.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm Client config"})," -- multi-scrobbler assumes Last.fm ENVs are always used for the ",(0,o.jsx)(t.strong,{children:"client"})," configuration. You must use the ",(0,o.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO"})," config to setup Last.fm as a Source."]})})})]})}function d(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(f,{...e})}):f(e)}},55293:function(e,t,n){n.d(t,{Z:()=>i});let i='[\n {\n "name": "myLastFmClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "name": "myLastFmSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'}}]);
-1
assets/js/9bcab3db.b6e1bd94.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6374"],{19946:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>a,default:()=>d,toc:()=>u,metadata:()=>i,assets:()=>l,contentTitle:()=>c});var i=JSON.parse('{"id":"configuration/sources/lastfm-source","title":"Lastfm","description":"This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients.","source":"@site/docs/configuration/sources/lastfm-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/lastfm-source","permalink":"/multi-scrobbler/configuration/sources/lastfm-source","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/lastfm-source.mdx","tags":[],"version":"current","frontMatter":{"title":"Lastfm","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Lastfm (Endpoint)","permalink":"/multi-scrobbler/configuration/sources/lastfm-endpoint"},"next":{"title":"Listenbrainz (Endpoint)","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint"}}'),o=t(85893),s=t(50065);t(703),t(73752),t(75752);var r=t(55293);let a={title:"Lastfm",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,l={},u=[{value:"Configuration",id:"configuration",level:2}];function f(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components},{Config:t}=n;return t||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Config",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["This Source ",(0,o.jsx)(n.strong,{children:"monitors your Last.fm scrobble history"})," and re-scrobbles new activity to configured ",(0,o.jsx)(n.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,o.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["To ",(0,o.jsx)(n.strong,{children:"scrobble to"})," Last.fm, create a ",(0,o.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})]}),"\n",(0,o.jsxs)(n.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a ",(0,o.jsx)(n.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})]}),"\n"]})}),"\n",(0,o.jsxs)(n.p,{children:["To configure this Source use the same registration instructions and configuration data shown in ",(0,o.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})," with the difference being ",(0,o.jsx)(n.code,{children:'"configureAs": "source"'})," defined in the File/AIO configuration below."]}),"\n",(0,o.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsx)(t,{config:"LastfmSourceConfig",fileContent:r.Z,name:"lastfm",children:(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["You cannot use ENV variables shown in the ",(0,o.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"Last.fm Client config"})," -- multi-scrobbler assumes Last.fm ENVs are always used for the ",(0,o.jsx)(n.strong,{children:"client"})," configuration. You must use the ",(0,o.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO"})," config to setup Last.fm as a Source."]})})})]})}function d(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(f,{...e})}):f(e)}},55293:function(e,n,t){t.d(n,{Z:()=>i});let i='[\n {\n "name": "myLastFmClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "name": "myLastFmSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'}}]);
+1
assets/js/9fd2a592.6c00e264.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6658"],{14396:function(e,s,n){n.r(s),n.d(s,{frontMatter:()=>i,default:()=>h,toc:()=>d,metadata:()=>r,assets:()=>c,contentTitle:()=>l});var r=JSON.parse('{"id":"configuration/sources/webscrobbler","title":"Webscrobbler","description":"After installing the Webscrobbler extension open the preferences/settings for it:","source":"@site/docs/configuration/sources/webscrobbler.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/webscrobbler","permalink":"/multi-scrobbler/configuration/sources/webscrobbler","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/webscrobbler.mdx","tags":[],"version":"current","frontMatter":{"title":"Webscrobbler","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"VLC","permalink":"/multi-scrobbler/configuration/sources/vlc"},"next":{"title":"Yamaha MusicCast","permalink":"/multi-scrobbler/configuration/sources/yamaha-musiccast"}}'),t=n(85893),o=n(50065);n(703),n(73752),n(75752);let i={title:"Webscrobbler",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,c={},d=[{value:"Multiple Users",id:"multiple-users",level:3},{value:"Connectors Black/Whitelist",id:"connectors-blackwhitelist",level:3},{value:"Configuration",id:"configuration",level:2}];function a(e){let s={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components},{Config:n,Details:r,DetailsAdmo:i}=s;return n||b("Config",!0),r||b("Details",!0),i||b("DetailsAdmo",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.p,{children:["After installing the ",(0,t.jsx)(s.a,{href:"https://web-scrobbler.com/",children:"Webscrobbler extension"})," open the preferences/settings for it:"]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Under ",(0,t.jsx)(s.strong,{children:"Accounts"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Add Webhook"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["API URL: ",(0,t.jsx)(s.code,{children:"[YourMultiScrobblerInstance]/api/webscrobbler"})," EX ",(0,t.jsx)(s.code,{children:"http://localhost:9078/api/webscrobbler"})]}),"\n",(0,t.jsxs)(s.li,{children:["Application name: ",(0,t.jsx)(s.code,{children:"(whatever you want)"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Reload the extension after adding the webhook."}),"\n",(0,t.jsx)(i,{type:"note",summary:"URL Types Supported by Webscrobbler",children:(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"On Firefox"})," - Only FQNs (domain.tld), ",(0,t.jsx)(s.code,{children:"localhost"}),", and ",(0,t.jsx)(s.code,{children:"127.0.0.1"})," are supported for API URL due to ",(0,t.jsx)(s.a,{href:"https://github.com/web-scrobbler/web-scrobbler/issues/4183#issuecomment-1749222006",children:"firefox requiring https"})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"On Chromium-based Browsers"})," - Any domain will work for API URL"]}),"\n",(0,t.jsx)(s.li,{children:"All other browsers are untested"}),"\n"]})}),"\n",(0,t.jsx)(i,{type:"warning",summary:"Public-Facing Usage",children:(0,t.jsxs)(s.p,{children:["Multi-scrobbler is ",(0,t.jsx)(s.strong,{children:"not"})," designed to be publicly accessible from the internet. To use Webscrobbler outside your local network you should be accessing MS through a VPN or through a reverse proxy with some kind of authentication (though this is still not recommended)."]})}),"\n",(0,t.jsx)(s.h3,{id:"multiple-users",children:"Multiple Users"}),"\n",(0,t.jsxs)(s.p,{children:["If you would like use multiple WebScrobbler sources they can be matched using a ",(0,t.jsx)(s.strong,{children:"slug"})," at the end of the ",(0,t.jsx)(s.strong,{children:"API URL."})," This requires using ",(0,t.jsx)(s.a,{href:"/configuration?configType=file#configuration-types",children:"a file-based config."})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",metastring:'title="webscrobbler.json"',children:'[\n {\n "name": "aUserWS",\n "clients": [\n "client1Maloja"\n ],\n "data": {\n "slug": "usera"\n }\n },\n {\n "name": "bUserWS",\n "clients": [\n "client2Maloja"\n ],\n "data": {\n "slug": "userb"\n }\n }\n]\n'})}),(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To use ",(0,t.jsx)(s.code,{children:"aUserWS"})," source set ",(0,t.jsx)(s.strong,{children:"API URL"})," to ",(0,t.jsx)(s.code,{children:"http://localhost:9078/api/webscrobbler/usera"})]}),"\n",(0,t.jsxs)(s.li,{children:["To use ",(0,t.jsx)(s.code,{children:"bUserWS"})," source set ",(0,t.jsx)(s.strong,{children:"API URL"})," to ",(0,t.jsx)(s.code,{children:"http://localhost:9078/api/webscrobbler/userb"})]}),"\n"]}),(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"http://localhost:9078/api/webscrobbler"})," is matched with the first source that ",(0,t.jsx)(s.em,{children:"that does not have a slug defined."})]})})]}),"\n",(0,t.jsx)(s.h3,{id:"connectors-blackwhitelist",children:"Connectors Black/Whitelist"}),"\n",(0,t.jsxs)(s.p,{children:["MS can be configured to only scrobble, or NOT scrobble, from some WS connectors. Use the name of the website from the ",(0,t.jsx)(s.a,{href:"https://web-scrobbler.com/",children:"supported websites"})," or from the ",(0,t.jsx)(s.strong,{children:"Connectors"})," tab in the extension."]}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsxs)(s.p,{children:["This affects ",(0,t.jsx)(s.strong,{children:"only"})," MS's behavior and does not affect the general connector behavior you have configured within the WebScrobbler extension."]})}),"\n",(0,t.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(n,{config:"WebscrobblerSourceConfig",fileContent:'[\n {\n "name": "MyWebScrobbler",\n "data": {\n "slug": "MyOptionalSlug",\n "whitelist": [],\n "blacklist": []\n }\n }\n]\n',name:"webscrobbler",children:(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Environmental Variable"}),(0,t.jsx)(s.th,{children:"Required?"}),(0,t.jsx)(s.th,{children:"Default"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WS_ENABLE"}),(0,t.jsx)(s.td,{children:"No"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Set to 'true' to enable WS without needing to define other ENVs"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WS_WHITELIST"}),(0,t.jsx)(s.td,{children:"No"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Only scrobble from these WebScrobbler Connectors. Comma-delimited list"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WS_BLACKLIST"}),(0,t.jsx)(s.td,{children:"No"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Do not scrobble from these WebScrobbler Connectors. Comma-delimited list"})]})]})]})})]})}function h(e={}){let{wrapper:s}={...(0,o.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}function b(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
-1
assets/js/9fd2a592.f0eeb381.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6658"],{14396:function(e,n,s){s.r(n),s.d(n,{frontMatter:()=>i,default:()=>a,toc:()=>d,metadata:()=>r,assets:()=>c,contentTitle:()=>l});var r=JSON.parse('{"id":"configuration/sources/webscrobbler","title":"Webscrobbler","description":"After installing the Webscrobbler extension open the preferences/settings for it:","source":"@site/docs/configuration/sources/webscrobbler.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/webscrobbler","permalink":"/multi-scrobbler/configuration/sources/webscrobbler","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/webscrobbler.mdx","tags":[],"version":"current","frontMatter":{"title":"Webscrobbler","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"VLC","permalink":"/multi-scrobbler/configuration/sources/vlc"},"next":{"title":"Yamaha MusicCast","permalink":"/multi-scrobbler/configuration/sources/yamaha-musiccast"}}'),t=s(85893),o=s(50065);s(703),s(73752),s(75752);let i={title:"Webscrobbler",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,c={},d=[{value:"Multiple Users",id:"multiple-users",level:3},{value:"Connectors Black/Whitelist",id:"connectors-blackwhitelist",level:3},{value:"Configuration",id:"configuration",level:2}];function h(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components},{Config:s,Details:r}=n;return s||b("Config",!0),r||b("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["After installing the ",(0,t.jsx)(n.a,{href:"https://web-scrobbler.com/",children:"Webscrobbler extension"})," open the preferences/settings for it:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Under ",(0,t.jsx)(n.strong,{children:"Accounts"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Add Webhook"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["API URL: ",(0,t.jsx)(n.code,{children:"[YourMultiScrobblerInstance]/api/webscrobbler"})," EX ",(0,t.jsx)(n.code,{children:"http://localhost:9078/api/webscrobbler"})]}),"\n",(0,t.jsxs)(n.li,{children:["Application name: ",(0,t.jsx)(n.code,{children:"(whatever you want)"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Reload the extension after adding the webhook."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"On Firefox"})," - Only FQNs (domain.tld), ",(0,t.jsx)(n.code,{children:"localhost"}),", and ",(0,t.jsx)(n.code,{children:"127.0.0.1"})," are supported for API URL due to ",(0,t.jsx)(n.a,{href:"https://github.com/web-scrobbler/web-scrobbler/issues/4183#issuecomment-1749222006",children:"firefox requiring https"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"On Chromium-based Browsers"})," - Any domain will work for API URL"]}),"\n",(0,t.jsx)(n.li,{children:"All other browsers are untested"}),"\n"]})}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsxs)(n.p,{children:["Multi-scrobbler is ",(0,t.jsx)(n.strong,{children:"not"})," designed to be publicly accessible from the internet. To use Webscrobbler outside your local network you should be accessing MS through a VPN or through a reverse proxy with some kind of authentication (though this is still not recommended)."]})}),"\n",(0,t.jsx)(n.h3,{id:"multiple-users",children:"Multiple Users"}),"\n",(0,t.jsxs)(n.p,{children:["If you would like use multiple WebScrobbler sources they can be matched using a ",(0,t.jsx)(n.strong,{children:"slug"})," at the end of the ",(0,t.jsx)(n.strong,{children:"API URL."})," This requires using ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"a file-based config."})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",metastring:'title="webscrobbler.json"',children:'[\n {\n "name": "aUserWS",\n "clients": [\n "client1Maloja"\n ],\n "data": {\n "slug": "usera"\n }\n },\n {\n "name": "bUserWS",\n "clients": [\n "client2Maloja"\n ],\n "data": {\n "slug": "userb"\n }\n }\n]\n'})}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["To use ",(0,t.jsx)(n.code,{children:"aUserWS"})," source set ",(0,t.jsx)(n.strong,{children:"API URL"})," to ",(0,t.jsx)(n.code,{children:"http://localhost:9078/api/webscrobbler/usera"})]}),"\n",(0,t.jsxs)(n.li,{children:["To use ",(0,t.jsx)(n.code,{children:"bUserWS"})," source set ",(0,t.jsx)(n.strong,{children:"API URL"})," to ",(0,t.jsx)(n.code,{children:"http://localhost:9078/api/webscrobbler/userb"})]}),"\n"]}),(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"http://localhost:9078/api/webscrobbler"})," is matched with the first source that ",(0,t.jsx)(n.em,{children:"that does not have a slug defined."})]})})]}),"\n",(0,t.jsx)(n.h3,{id:"connectors-blackwhitelist",children:"Connectors Black/Whitelist"}),"\n",(0,t.jsxs)(n.p,{children:["MS can be configured to only scrobble, or NOT scrobble, from some WS connectors. Use the name of the website from the ",(0,t.jsx)(n.a,{href:"https://web-scrobbler.com/",children:"supported websites"})," or from the ",(0,t.jsx)(n.strong,{children:"Connectors"})," tab in the extension."]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["This affects ",(0,t.jsx)(n.strong,{children:"only"})," MS's behavior and does not affect the general connector behavior you have configured within the WebScrobbler extension."]})}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(s,{config:"WebscrobblerSourceConfig",fileContent:'[\n {\n "name": "MyWebScrobbler",\n "data": {\n "slug": "MyOptionalSlug",\n "whitelist": [],\n "blacklist": []\n }\n }\n]\n',name:"webscrobbler",children:(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Environmental Variable"}),(0,t.jsx)(n.th,{children:"Required?"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"WS_ENABLE"}),(0,t.jsx)(n.td,{children:"No"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Set to 'true' to enable WS without needing to define other ENVs"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"WS_WHITELIST"}),(0,t.jsx)(n.td,{children:"No"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Only scrobble from these WebScrobbler Connectors. Comma-delimited list"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"WS_BLACKLIST"}),(0,t.jsx)(n.td,{children:"No"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Do not scrobble from these WebScrobbler Connectors. Comma-delimited list"})]})]})]})})]})}function a(e={}){let{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}function b(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+13
assets/js/a16703cd.244bd985.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["4328"],{70003:function(e,t,n){n.d(t,{ZP:()=>c,d$:()=>o});var i=n(85893),s=n(50065),l=n(75752),r=n.n(l);let o=[];function a(e){let t={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.strong,{children:"Source"})," that monitors active listening uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,i.jsxs)(t.li,{children:["or amount of time (",(0,i.jsx)(t.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["These default values are based on ",(0,i.jsx)(t.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,i.jsxs)(t.p,{children:["These values can be customized in the ",(0,i.jsx)(t.code,{children:"options"})," of Source's ",(0,i.jsx)(t.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,i.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 + "data": { 3 + // ... 4 + }, 5 + "options": { 6 + // highlight-start 7 + "scrobbleThresholds": { 8 + "duration": 40, // scrobbable if listened to for 40 seconds or more 9 + "percent": 20 // scrobbable if listened to for 20% or more of the track's length 10 + } 11 + // highlight-end 12 + } 13 + }`})]})}function c(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},69918:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>r,default:()=>h,toc:()=>c,metadata:()=>i,assets:()=>a,contentTitle:()=>o});var i=JSON.parse('{"id":"configuration/clients/clients","title":"Overview","description":"A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz...","source":"@site/docs/configuration/clients/clients.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/","permalink":"/multi-scrobbler/configuration/clients/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/clients.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/"},"next":{"title":"Koito","permalink":"/multi-scrobbler/configuration/clients/koito"}}'),s=n(85893),l=n(50065);n(70003);let r={sidebar_position:2,title:"Overview",toc_max_heading_level:4},o=void 0,a={},c=[{value:"Clients",id:"clients",level:2},{value:"Features",id:"features",level:2},{value:"Dead Scrobbles",id:"dead-scrobbles",level:3},{value:"Now Playing",id:"now-playing",level:3}];function d(e){let t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["A ",(0,s.jsx)(t.strong,{children:"Client"})," is an application that stores the historical information about what songs you have played (scrobbles). Examples are ",(0,s.jsx)(t.strong,{children:"Maloja, Last.fm, Listenbrainz"}),"..."]}),"\n",(0,s.jsx)(t.h2,{id:"clients",children:"Clients"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Now Playing"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/librefm",children:"Libre.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/koito",children:"Koito"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/maloja",children:"Maloja"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/rocksky",children:"Rocksky"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/tealfm",children:"Teal.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,s.jsx)(t.h3,{id:"dead-scrobbles",children:"Dead Scrobbles"}),"\n",(0,s.jsx)(t.p,{children:"If multi-scrobbler is unable to submit a scrobble to a Client then it places the scrobble into a queue which is retried every 5 minutes for a number of times before it gives up."}),"\n",(0,s.jsxs)(t.p,{children:["After it stops ",(0,s.jsx)(t.em,{children:"automatically"})," retrying the scrobble still exists and can be retried from the dashboard. Dead scrobbles persist between restart so you will never lose a scrobble that hasn't been successfully submitted yet."]}),"\n",(0,s.jsx)(t.h3,{id:"now-playing",children:"Now Playing"}),"\n",(0,s.jsxs)(t.p,{children:["Multi-scrobbler can report the currently ",(0,s.jsx)(t.strong,{children:"playing"})," tracks it is monitoring to some Scrobble Clients via their individual ",(0,s.jsx)(t.strong,{children:"Now Playing"})," functionality."]}),"\n",(0,s.jsxs)(t.p,{children:["Now Playing is ",(0,s.jsx)(t.strong,{children:"default enabled"})," for all Clients that support it."]}),"\n",(0,s.jsx)(t.p,{children:"The behavior multi-scrobbler uses for determining Now Playing reporting:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Now Playing can be explicitly enabled or disabled globally using ENV ",(0,s.jsx)(t.code,{children:"NOW_PLAYING=true"})," or ",(0,s.jsx)(t.code,{children:"NOW_PLAYING=false"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"This only affects Clients that don't have behavior set via File/AIO (below)"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.li,{children:"Now Playing will be only be reported to the same Clients a Source is configured to scrobble to"}),"\n",(0,s.jsxs)(t.li,{children:["A Source's Player status must be ",(0,s.jsx)(t.strong,{children:"Playing"}),", IE ",(0,s.jsx)(t.strong,{children:"active"}),", for reporting to occur","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"This status can be verified via Player UI on the Dashboard"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["If multiple Sources having active Players then the scrobble Client will default to reporting the track based on Source ",(0,s.jsx)(t.strong,{children:"configuration"})," name, alphabetically","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["This is the ",(0,s.jsx)(t.code,{children:"name"})," property set in ",(0,s.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO source configs"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Clients can customize the Now Playing behavior individually using ",(0,s.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO source configs:"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json5",metastring:'title="CONFIG_DIR/lastfm.json"',children:'[\n {\n "name": "myLastFmClient",\n "configureAs": "client",\n "data": {\n // ...\n },\n "options": {\n // disable or enable\n //"nowPlaying": true\n //\n // OR define a list of Source *config* names that should be allowed to report Now Playing\n // order of the list determines priority for reporting Now Playing\n //"nowPlaying": ["mySpotify1","myJellyfin2"]\n }\n },\n]\n'})})]})}function h(e={}){let{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]);
-13
assets/js/a16703cd.8973c8af.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["4328"],{70003:function(e,t,n){n.d(t,{ZP:()=>c,d$:()=>o});var i=n(85893),s=n(50065),l=n(75752),r=n.n(l);let o=[];function a(e){let t={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.strong,{children:"Source"})," that monitors active listening uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,i.jsxs)(t.li,{children:["or amount of time (",(0,i.jsx)(t.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["These default values are based on ",(0,i.jsx)(t.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,i.jsxs)(t.p,{children:["These values can be customized in the ",(0,i.jsx)(t.code,{children:"options"})," of Source's ",(0,i.jsx)(t.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,i.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ 2 - "data": { 3 - // ... 4 - }, 5 - "options": { 6 - // highlight-start 7 - "scrobbleThresholds": { 8 - "duration": 40, // scrobbable if listened to for 40 seconds or more 9 - "percent": 20 // scrobbable if listened to for 20% or more of the track's length 10 - } 11 - // highlight-end 12 - } 13 - }`})]})}function c(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},69918:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>r,default:()=>h,toc:()=>c,metadata:()=>i,assets:()=>a,contentTitle:()=>o});var i=JSON.parse('{"id":"configuration/clients/clients","title":"Overview","description":"A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz...","source":"@site/docs/configuration/clients/clients.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/","permalink":"/multi-scrobbler/configuration/clients/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/clients.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/"},"next":{"title":"Koito","permalink":"/multi-scrobbler/configuration/clients/koito"}}'),s=n(85893),l=n(50065);n(70003);let r={sidebar_position:2,title:"Overview",toc_max_heading_level:4},o=void 0,a={},c=[{value:"Clients",id:"clients",level:2},{value:"Features",id:"features",level:2},{value:"Dead Scrobbles",id:"dead-scrobbles",level:3},{value:"Now Playing",id:"now-playing",level:3}];function d(e){let t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["A ",(0,s.jsx)(t.strong,{children:"Client"})," is an application that stores the historical information about what songs you have played (scrobbles). Examples are ",(0,s.jsx)(t.strong,{children:"Maloja, Last.fm, Listenbrainz"}),"..."]}),"\n",(0,s.jsx)(t.h2,{id:"clients",children:"Clients"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Now Playing"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/koito",children:"Koito"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/maloja",children:"Maloja"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/rocksky",children:"Rocksky"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.a,{href:"/configuration/clients/tealfm",children:"Teal.fm"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,s.jsx)(t.h3,{id:"dead-scrobbles",children:"Dead Scrobbles"}),"\n",(0,s.jsx)(t.p,{children:"If multi-scrobbler is unable to submit a scrobble to a Client then it places the scrobble into a queue which is retried every 5 minutes for a number of times before it gives up."}),"\n",(0,s.jsxs)(t.p,{children:["After it stops ",(0,s.jsx)(t.em,{children:"automatically"})," retrying the scrobble still exists and can be retried from the dashboard. Dead scrobbles persist between restart so you will never lose a scrobble that hasn't been successfully submitted yet."]}),"\n",(0,s.jsx)(t.h3,{id:"now-playing",children:"Now Playing"}),"\n",(0,s.jsxs)(t.p,{children:["Multi-scrobbler can report the currently ",(0,s.jsx)(t.strong,{children:"playing"})," tracks it is monitoring to some Scrobble Clients via their individual ",(0,s.jsx)(t.strong,{children:"Now Playing"})," functionality."]}),"\n",(0,s.jsxs)(t.p,{children:["Now Playing is ",(0,s.jsx)(t.strong,{children:"default enabled"})," for all Clients that support it."]}),"\n",(0,s.jsx)(t.p,{children:"The behavior multi-scrobbler uses for determining Now Playing reporting:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Now Playing can be explicitly enabled or disabled globally using ENV ",(0,s.jsx)(t.code,{children:"NOW_PLAYING=true"})," or ",(0,s.jsx)(t.code,{children:"NOW_PLAYING=false"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"This only affects Clients that don't have behavior set via File/AIO (below)"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.li,{children:"Now Playing will be only be reported to the same Clients a Source is configured to scrobble to"}),"\n",(0,s.jsxs)(t.li,{children:["A Source's Player status must be ",(0,s.jsx)(t.strong,{children:"Playing"}),", IE ",(0,s.jsx)(t.strong,{children:"active"}),", for reporting to occur","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"This status can be verified via Player UI on the Dashboard"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["If multiple Sources having active Players then the scrobble Client will default to reporting the track based on Source ",(0,s.jsx)(t.strong,{children:"configuration"})," name, alphabetically","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["This is the ",(0,s.jsx)(t.code,{children:"name"})," property set in ",(0,s.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO source configs"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Clients can customize the Now Playing behavior individually using ",(0,s.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO source configs:"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json5",metastring:'title="CONFIG_DIR/lastfm.json"',children:'[\n {\n "name": "myLastFmClient",\n "configureAs": "client",\n "data": {\n // ...\n },\n "options": {\n // disable or enable\n //"nowPlaying": true\n //\n // OR define a list of Source *config* names that should be allowed to report Now Playing\n // order of the list determines priority for reporting Now Playing\n //"nowPlaying": ["mySpotify1","myJellyfin2"]\n }\n },\n]\n'})})]})}function h(e={}){let{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]);
-1
assets/js/a93ae359.3bd41c66.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8881"],{4042:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>o,default:()=>u,toc:()=>a,metadata:()=>i,assets:()=>c,contentTitle:()=>l});var i=JSON.parse('{"id":"configuration/sources/listenbrainz-endpoint","title":"Listenbrainz (Endpoint)","description":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server.","source":"@site/docs/configuration/sources/listenbrainz-endpoint.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/listenbrainz-endpoint","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/listenbrainz-endpoint.mdx","tags":[],"version":"current","frontMatter":{"title":"Listenbrainz (Endpoint)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Lastfm","permalink":"/multi-scrobbler/configuration/sources/lastfm-source"},"next":{"title":"Listenbrainz","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-source"}}'),r=t(85893),s=t(50065);t(703),t(73752),t(75752);let o={title:"Listenbrainz (Endpoint)",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,c={},a=[{value:"URL",id:"url",level:3},{value:"Navidrome",id:"navidrome",level:5},{value:"Token",id:"token",level:3},{value:"Configuration",id:"configuration",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Config:t,Details:i}=n;return t||h("Config",!0),i||h("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server."}),"\n",(0,r.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To ",(0,r.jsx)(n.strong,{children:"scrobble to"})," Listenbrainz, create a ",(0,r.jsx)(n.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz (Client)"})]}),"\n",(0,r.jsxs)(n.li,{children:["To monitor and re-scrobble activity from your Listenbrainz account, create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/listenbrainz-source",children:"Listenbrainz (Source)"})]}),"\n"]})}),"\n",(0,r.jsx)(n.h3,{id:"url",children:"URL"}),"\n",(0,r.jsxs)(n.p,{children:["If a ",(0,r.jsx)(n.strong,{children:"slug"})," is ",(0,r.jsx)(n.strong,{children:"not"})," provided in configuration then multi-scrobbler will accept Listenbrainz scrobbles at"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/1/submit-listens\n"})}),"\n",(0,r.jsx)(n.p,{children:'which is the "standard" Listenbrainz server path for scrobbling.'}),"\n",(0,r.jsxs)(n.p,{children:["In general, you should use ",(0,r.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/1/"})," as the ",(0,r.jsx)(n.strong,{children:"base path"})," when configuring your application to scrobble to multi-scrobbler."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"URL Setup for Popular Apps"}),(0,r.jsx)(n.h5,{id:"navidrome",children:"Navidrome"}),(0,r.jsxs)(n.p,{children:["Set the ",(0,r.jsx)(n.a,{href:"https://www.navidrome.org/docs/usage/configuration-options/#advanced-configuration",children:(0,r.jsx)(n.strong,{children:"ListenBrainz.BaseURL"})})," (env ",(0,r.jsx)(n.code,{children:"ND_LISTENBRAINZ_BASEURL"}),") to ",(0,r.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/1/"})]})]}),"\n",(0,r.jsx)(n.p,{children:"Use a slug only if you need to setup multiple Listenbrainz Endpoint sources and cannot use different tokens."}),"\n",(0,r.jsx)(n.p,{children:"If a slug is used then the URL will be:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/api/listenbrainz/mySlug\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Some Listenbrainz applications may require custom Listenbrainz URLs to be a real domain (",(0,r.jsx)(n.code,{children:"example.com"}),") and/or use SSL (",(0,r.jsx)(n.code,{children:"https://"}),"). In this case you should setup multi-scrobbler behind a reverse proxy to support this functionality. It is out of the scope of this project to do this solely within multi-scrobbler."]})}),"\n",(0,r.jsx)(n.h3,{id:"token",children:"Token"}),"\n",(0,r.jsxs)(n.p,{children:["Most Listenbrainz clients require a token (Authentication Token) to be provided during setup. This value can be anything you want, just make sure to use the same value for ",(0,r.jsx)(n.code,{children:"token"})," in your multi-scrobbler configuration for the endpoint."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(t,{config:"ListenbrainzEndpointSourceConfig",fileContent:'[\n {\n "name": "myLz",\n "enable": true,\n "data": {\n "token": "myToken"\n }\n }\n]\n',name:"endpointlz",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"LZENDPOINT_ENABLE"})}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Use LZ Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"LZE_TOKEN"})}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:'LZ "Authentication Token" you provided to the scrobbling application'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"LZE_SLUG"})}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"(Optional) The URL suffix to use for accepting LZ scrobbles"})]})]})]})})]})}function u(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}function h(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+1
assets/js/a93ae359.4e98bff1.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["8881"],{4042:function(e,n,i){i.r(n),i.d(n,{frontMatter:()=>o,default:()=>u,toc:()=>a,metadata:()=>t,assets:()=>c,contentTitle:()=>l});var t=JSON.parse('{"id":"configuration/sources/listenbrainz-endpoint","title":"Listenbrainz (Endpoint)","description":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server.","source":"@site/docs/configuration/sources/listenbrainz-endpoint.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/listenbrainz-endpoint","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/listenbrainz-endpoint.mdx","tags":[],"version":"current","frontMatter":{"title":"Listenbrainz (Endpoint)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Libre.fm","permalink":"/multi-scrobbler/configuration/sources/librefm-source"},"next":{"title":"Listenbrainz","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-source"}}'),r=i(85893),s=i(50065);i(703),i(73752),i(75752);let o={title:"Listenbrainz (Endpoint)",toc_min_heading_level:2,toc_max_heading_level:5},l=void 0,c={},a=[{value:"URL",id:"url",level:3},{value:"Navidrome",id:"navidrome",level:5},{value:"Token",id:"token",level:3},{value:"Configuration",id:"configuration",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components},{Config:i,Details:t}=n;return i||h("Config",!0),t||h("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server."}),"\n",(0,r.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To ",(0,r.jsx)(n.strong,{children:"scrobble to"})," Listenbrainz, create a ",(0,r.jsx)(n.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz (Client)"})]}),"\n",(0,r.jsxs)(n.li,{children:["To monitor and re-scrobble activity from your Listenbrainz account, create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/listenbrainz-source",children:"Listenbrainz (Source)"})]}),"\n"]})}),"\n",(0,r.jsx)(n.h3,{id:"url",children:"URL"}),"\n",(0,r.jsxs)(n.p,{children:["If a ",(0,r.jsx)(n.strong,{children:"slug"})," is ",(0,r.jsx)(n.strong,{children:"not"})," provided in configuration then multi-scrobbler will accept Listenbrainz scrobbles at"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/1/submit-listens\n"})}),"\n",(0,r.jsx)(n.p,{children:'which is the "standard" Listenbrainz server path for scrobbling.'}),"\n",(0,r.jsxs)(n.p,{children:["In general, you should use ",(0,r.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/1/"})," as the ",(0,r.jsx)(n.strong,{children:"base path"})," when configuring your application to scrobble to multi-scrobbler."]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"URL Setup for Popular Apps"}),(0,r.jsx)(n.h5,{id:"navidrome",children:"Navidrome"}),(0,r.jsxs)(n.p,{children:["Set the ",(0,r.jsx)(n.a,{href:"https://www.navidrome.org/docs/usage/configuration-options/#advanced-configuration",children:(0,r.jsx)(n.strong,{children:"ListenBrainz.BaseURL"})})," (env ",(0,r.jsx)(n.code,{children:"ND_LISTENBRAINZ_BASEURL"}),") to ",(0,r.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/1/"})]})]}),"\n",(0,r.jsx)(n.p,{children:"Use a slug only if you need to setup multiple Listenbrainz Endpoint sources and cannot use different tokens."}),"\n",(0,r.jsx)(n.p,{children:"If a slug is used then the URL will be:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/api/listenbrainz/mySlug\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Some Listenbrainz applications may require custom Listenbrainz URLs to be a real domain (",(0,r.jsx)(n.code,{children:"example.com"}),") and/or use SSL (",(0,r.jsx)(n.code,{children:"https://"}),"). In this case you should setup multi-scrobbler behind a reverse proxy to support this functionality. It is out of the scope of this project to do this solely within multi-scrobbler."]})}),"\n",(0,r.jsx)(n.h3,{id:"token",children:"Token"}),"\n",(0,r.jsxs)(n.p,{children:["Most Listenbrainz clients require a token (Authentication Token) to be provided during setup. This value can be anything you want, just make sure to use the same value for ",(0,r.jsx)(n.code,{children:"token"})," in your multi-scrobbler configuration for the endpoint."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i,{config:"ListenbrainzEndpointSourceConfig",fileContent:'[\n {\n "name": "myLz",\n "enable": true,\n "data": {\n "token": "myToken"\n }\n }\n]\n',name:"endpointlz",children:(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,r.jsx)(n.th,{style:{textAlign:"left"},children:"Required?"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"LZENDPOINT_ENABLE"})}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Use LZ Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"LZE_TOKEN"})}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:'LZ "Authentication Token" you provided to the scrobbling application'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"LZE_SLUG"})}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"No"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"(Optional) The URL suffix to use for accepting LZ scrobbles"})]})]})]})})]})}function u(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}function h(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+1
assets/js/bf69edfb.8b21fae5.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6286"],{49639:function(e,n,r){r.r(n),r.d(n,{frontMatter:()=>d,default:()=>x,toc:()=>m,metadata:()=>s,assets:()=>u,contentTitle:()=>h});var s=JSON.parse('{"id":"installation/installation","title":"Overview","description":"For the difference between ENV and File examples in this document see Configuration Types.","source":"@site/docs/installation/installation.mdx","sourceDirName":"installation","slug":"/installation/","permalink":"/multi-scrobbler/installation/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/installation/installation.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Overview"},"sidebar":"tutorialSidebar","previous":{"title":"Quickstart","permalink":"/multi-scrobbler/quickstart"},"next":{"title":"As a Service","permalink":"/multi-scrobbler/installation/service"}}'),i=r(85893),o=r(50065),l=r(703),t=r(73752),c=r(75752),a=r.n(c);let d={sidebar_position:1,title:"Overview"},h=void 0,u={},m=[{value:"Docker",id:"docker",level:2},{value:"Storage",id:"storage",level:4},{value:"Networking",id:"networking",level:4},{value:"Base URL",id:"base-url",level:5},{value:"Other",id:"other",level:4},{value:"Linux Host",id:"linux-host",level:4},{value:"Read Only",id:"read-only",level:4},{value:"Docker Usage Example",id:"docker-usage-example",level:3},{value:"Local Installation",id:"local-installation",level:2},{value:"Nodejs",id:"nodejs",level:3},{value:"Rollup build error",id:"rollup-build-error",level:4},{value:"Usage Examples",id:"usage-examples",level:4},{value:"Flatpak",id:"flatpak",level:3}];function p(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components},{Details:r}=n;return r||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["For the difference between ",(0,i.jsx)(n.strong,{children:"ENV"})," and ",(0,i.jsx)(n.strong,{children:"File"})," examples in this document see ",(0,i.jsx)(n.a,{href:"/multi-scrobbler/configuration/#configuration-types",children:"Configuration Types"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,i.jsx)(n.p,{children:"Cross-platform images are built for x86 (Intel/AMD) and ARM64 (IE Raspberry Pi)"}),"\n",(0,i.jsx)(n.admonition,{title:"Available Images",type:"info",children:(0,i.jsxs)(l.default,{children:[(0,i.jsxs)(t.default,{value:"docker",label:"Dockerhub",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://hub.docker.com/r/foxxmd/multi-scrobbler",children:"Repository Page"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"docker.io/foxxmd/multi-scrobbler:latest\n"})})]}),(0,i.jsxs)(t.default,{value:"ghcr",label:"Github Packages",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pkgs/container/multi-scrobbler",children:"Repository Page"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"ghcr.io/foxxmd/multi-scrobbler:latest\n"})})]})]})}),"\n",(0,i.jsxs)(n.p,{children:["Or use the example ",(0,i.jsx)(n.code,{children:"docker-compose.yml"}),", found in the repo, after modifying it to fit your configuration:"]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)(n.code,{children:"docker-compose.yml"})}),(0,i.jsx)(a(),{language:"yaml",children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n #- JELLYFIN_APIKEY=\n #- JELLYFIN_URL=\n #- JELLYFIN_USER=\n #- MALOJA_URL=http://maloja:42010\n #- MALOJA_API_KEY=\n #- PUID=1000 # required if running docker on linux host, see main README Docker setup instructions\n #- PGID=1000 # required if running docker on linux host, see main README Docker setup instructions\n\n # set if using a source/client with redirect URI that you have not explicitly set and MS is NOT running on the same machine that you will view the dashboard from\n # EX: You will view MS dashboard at 'http://192.168.0.101:9078' -> set BASE_URL=http://192.168.0.101:9078\n #- BASE_URL=http://MyHostIP:9078\n volumes:\n - \"./config:/config\"\n #networks:\n # - (optional to add container to the same bridge network that maloja is inside to be able to use docker internal networking & dns to resolve and connect to maloja URL via http://maloja:port)\n ports:\n - 9078:9078 # first port is the HOST port multi-scrobbler will serve UI and API on\n restart: unless-stopped\n"})]}),"\n",(0,i.jsx)(n.p,{children:"Recommended configuration steps for docker or docker-compose usage:"}),"\n",(0,i.jsx)(n.h4,{id:"storage",children:"Storage"}),"\n",(0,i.jsx)(n.p,{children:"You should bind a host directory into the container for storing configurations and credentials. Otherwise, these will be lost when the container is updated."}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsxs)(l.default,{groupId:"runType",queryString:!0,children:[(0,i.jsxs)(t.default,{value:"docker",label:"Docker",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.a,{href:"https://docs.docker.com/storage/bind-mounts/#start-a-container-with-a-bind-mount",children:["Using ",(0,i.jsx)(n.code,{children:"-v"})," method for docker"]}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'docker run ... -v "$(pwd)/config:/config" foxxmd/multi-scrobbler\n'})})]}),(0,i.jsxs)(t.default,{value:"docker-compose",label:"Docker Compose",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/compose-file/compose-file-v3/#short-syntax-3",children:"Using docker-compose"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n volumes:\n - "./config:/config"\n'})})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"networking",children:"Networking"}),"\n",(0,i.jsxs)(n.p,{children:["If you are using a ",(0,i.jsx)(n.a,{href:"https://www.appsdeveloperblog.com/docker-networking-bridging-host-and-overlay/",children:"bridge network"})," (default docker setup) you must map a port to the container in order to access the dashboard and use MS with some sources (Webscrobbler, LFM/LZ Endpoints). The default container port is ",(0,i.jsx)(n.code,{children:"9078"}),"."]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsxs)(l.default,{groupId:"runType",queryString:!0,children:[(0,i.jsxs)(t.default,{value:"docker",label:"Docker",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/run/#publish",children:["Docker ",(0,i.jsx)(n.code,{children:"run"})," publish options"]}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"docker run ... -p 9078:9078 foxxmd/multi-scrobbler\n"})})]}),(0,i.jsxs)(t.default,{value:"docker-compose",label:"Docker Compose",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/compose-file/compose-file-v3/#short-syntax-1",children:"docker-compose"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n ports:\n - "9078:9078"\n'})})]})]})]}),"\n",(0,i.jsx)(n.h5,{id:"base-url",children:"Base URL"}),"\n",(0,i.jsx)(n.p,{children:"Optionally, when"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["using a ",(0,i.jsx)(n.a,{href:"/multi-scrobbler/configuration/",children:"Source or Client"}),' that has a "Redirect URI" that you have not explicitly defined']}),"\n",(0,i.jsxs)(n.li,{children:["and","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"using a bridge network or"}),"\n",(0,i.jsx)(n.li,{children:"installing MS on a different machine than the one used to view the dashboard"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["set the ",(0,i.jsx)(n.a,{href:"/multi-scrobbler/configuration/#base-url",children:"Base URL"})," as the IP of the host machine. (This is the IP you would use to view the dashboard in a browser)"]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsxs)(l.default,{groupId:"runType",queryString:!0,children:[(0,i.jsx)(t.default,{value:"docker",label:"Docker",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'docker run ... -e BASE_URL="http://hostMachineIP" foxxmd/multi-scrobbler\n'})})}),(0,i.jsxs)(t.default,{value:"docker-compose",label:"Docker Compose",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/compose-file/compose-file-v3/#short-syntax-1",children:"docker-compose"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n - BASE_URL=http://hostMachineIP\n"})})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"other",children:"Other"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["(Optionally) set the ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones",children:"timezone"})," for the container using the environmental variable ",(0,i.jsx)(n.code,{children:"TZ"})," (",(0,i.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/run/#env",children:"docker"}),") (",(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/compose-file/compose-file-v3/#environment",children:"docker-compose"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"linux-host",children:"Linux Host"}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["If you are running this container with ",(0,i.jsx)(n.strong,{children:"Docker"})," on a ",(0,i.jsx)(n.strong,{children:"Linux Host"})," you must specify ",(0,i.jsx)(n.code,{children:"user:group"})," permissions of the user who owns the ",(0,i.jsx)(n.strong,{children:"configuration directory"})," on the host to avoid ",(0,i.jsx)(n.a,{href:"https://ikriv.com/blog/?p=4698",children:"docker file permission problems."})," These can be specified using the ",(0,i.jsxs)(n.a,{href:"https://docs.linuxserver.io/general/understanding-puid-and-pgid",children:["environmental variables ",(0,i.jsx)(n.strong,{children:"PUID"})," and ",(0,i.jsx)(n.strong,{children:"PGID"}),"."]})]}),(0,i.jsx)(n.p,{children:"To get the UID and GID for the current user run these commands from a terminal:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"id -u"})," -- prints UID"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"id -g"})," -- prints GID"]}),"\n"]})]}),"\n",(0,i.jsx)(n.h4,{id:"read-only",children:"Read Only"}),"\n",(0,i.jsxs)(n.p,{children:["MS can be hardended by setting the file system as read only with ",(0,i.jsx)(n.a,{href:"https://docs.docker.com/reference/compose-file/services/#read_only",children:(0,i.jsx)(n.code,{children:"read_only"})}),", with a few exceptions:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n # ...\n read_only: true\n tmpfs:\n - /run:exec\n - /tmp:noexec \n"})}),"\n",(0,i.jsx)(n.h3,{id:"docker-usage-example",children:"Docker Usage Example"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["See the ",(0,i.jsx)(n.a,{href:"/quickstart",children:(0,i.jsx)(n.strong,{children:"Quick Start Guide"})})," for another guided docker-compose example"]})}),"\n",(0,i.jsx)(n.p,{children:"The example scenario:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsxs)(n.a,{href:"/configuration/sources/jellyfin",children:["Jellyfin ",(0,i.jsx)(n.strong,{children:"Source"})]})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsxs)(n.a,{href:"/configuration/sources/maloja",children:["Maloja ",(0,i.jsx)(n.strong,{children:"Client"})]})}),"\n",(0,i.jsxs)(n.li,{children:["Serving app on port ",(0,i.jsx)(n.code,{children:"9078"})]}),"\n",(0,i.jsxs)(n.li,{children:["Docker container located on a different IP (",(0,i.jsx)(n.code,{children:"192.168.0.100"}),") so use ",(0,i.jsx)(n.a,{href:"/configuration#base-url",children:"Base URL"})]}),"\n",(0,i.jsxs)(n.li,{children:["Config/data directory on host machine in a directory next to ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})]}),"\n",(0,i.jsxs)(n.li,{children:["Linux uid/gid is ",(0,i.jsx)(n.code,{children:"1000:1000"})]}),"\n"]}),"\n",(0,i.jsxs)(l.default,{groupId:"runType",queryString:!0,children:[(0,i.jsx)(t.default,{value:"docker",label:"Docker",children:(0,i.jsxs)(l.default,{groupId:"configType",queryString:!0,children:[(0,i.jsx)(t.default,{value:"env",label:"ENV",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'docker run --name multi-scrobbler -e "JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c" -e "JELLYFIN_URL=192.168.0.101:8096" -e "JELLYFIN_USER=MyUser" -e "BASE_URL=192.168.0.100" -e "MALOJA_URL=http://domain.tld" -e "MALOJA_API_KEY=1234" -e "PUID=1000" -e "PGID=1000" -p 9078:9078 -v /home/myUser/ms:/config foxxmd/multi-scrobbler\n'})})}),(0,i.jsx)(t.default,{value:"file",label:"File",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'docker run --name multi-scrobbler -e "PUID=1000" -e "PGID=1000" -e "BASE_URL=192.168.0.100" -p 9078:9078 -v "$(pwd)/config:/config" foxxmd/multi-scrobbler\n'})})})]})}),(0,i.jsxs)(t.default,{value:"docker-compose",label:"Docker Compose",children:[(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"#docker",children:(0,i.jsx)(n.code,{children:"docker-compose.yml"})})," sample above for more options and annotations."]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c\n - JELLYFIN_URL=192.168.0.101:8096\n - JELLYFIN_USER=MyUser\n - BASE_URL=http://192.168.0.100:9078\n - MALOJA_URL=http://domain.tld:42010\n - MALOJA_API_KEY=1234\n - PUID=1000\n - PGID=1000\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"local-installation",children:"Local Installation"}),"\n",(0,i.jsxs)(n.p,{children:["After installation see ",(0,i.jsx)(n.a,{href:"/multi-scrobbler/installation/service",children:"service.md"})," to configure multi-scrobbler to run automatically in the background."]}),"\n",(0,i.jsx)(n.h3,{id:"nodejs",children:"Nodejs"}),"\n",(0,i.jsx)(n.p,{children:"Clone this repository somewhere and then install from the working directory"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"git clone https://github.com/FoxxMD/multi-scrobbler.git .\ncd multi-scrobbler\nnvm use # optional, to set correct Node version\nnpm install\nnpm run docs:install && npm run build\nnpm run start\n"})}),"\n",(0,i.jsx)(n.h4,{id:"rollup-build-error",children:"Rollup build error"}),"\n",(0,i.jsxs)(n.p,{children:["During building if you encounter an error like: ",(0,i.jsx)(n.code,{children:'Your current platform "XXX" and architecture "XXX" combination is not yet supported by the native Rollup build.'})]}),"\n",(0,i.jsxs)(n.p,{children:["Modify ",(0,i.jsx)(n.code,{children:"overrides"})," in ",(0,i.jsx)(n.code,{children:"package.json"})," to use ",(0,i.jsx)(n.code,{children:"@rollup/wasm-node"})," as a drop-in replacement for rollup:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'"overrides": {\n "spotify-web-api-node": {\n "superagent": "$superagent"\n }\n "vite": {\n "rollup": "npm:@rollup/wasm-node@^4.9.6"\n }\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/135#issuecomment-1927080260",children:"this issue"})," for more detail."]}),"\n",(0,i.jsx)(n.h4,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,i.jsxs)(l.default,{groupId:"configType",queryString:!0,children:[(0,i.jsx)(t.default,{value:"env",label:"ENV",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c JELLYFIN_URL=192.168.0.101:8096 JELLYFIN_USER=MyUser MALOJA_URL="http://domain.tld" node src/index.js\n'})})}),(0,i.jsxs)(t.default,{value:"file",label:"File",children:[(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)(n.code,{children:"./config/config.json"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="./config/config.json"',children:'{\n "sources": [\n {\n "type": "jellyfin",\n "clients": ["myConfig"],\n "name": "myJellyfinSource",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "url": "http://192.168.0.101:8096",\n "user": "MyUser"\n }\n }\n ],\n "clients": [\n {\n "type": "maloja",\n "name": "myConfig",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n }\n ],\n}\n'})})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"npm run start\n"})})]})]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The web UI and API is served on port ",(0,i.jsx)(n.code,{children:"9078"}),". This can be modified using the ",(0,i.jsx)(n.code,{children:"PORT"})," environmental variable."]})}),"\n",(0,i.jsx)(n.h3,{id:"flatpak",children:"Flatpak"}),"\n",(0,i.jsx)(n.admonition,{title:"Unsupported",type:"warning",children:(0,i.jsxs)(n.p,{children:["Flatpak/Flathub installs are no longer supported. You can still build MS as a ",(0,i.jsx)(n.a,{href:"../development/flatpak",children:"Flatpak app from source."})," See more information about ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/287",children:"Flatpak EOL."})]})})]})}function x(e={}){let{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}}}]);
-1
assets/js/bf69edfb.9ed17f23.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6286"],{49639:function(e,n,r){r.r(n),r.d(n,{frontMatter:()=>d,default:()=>x,toc:()=>p,metadata:()=>s,assets:()=>u,contentTitle:()=>h});var s=JSON.parse('{"id":"installation/installation","title":"Overview","description":"For the difference between ENV and File examples in this document see Configuration Types.","source":"@site/docs/installation/installation.mdx","sourceDirName":"installation","slug":"/installation/","permalink":"/multi-scrobbler/installation/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/installation/installation.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Overview"},"sidebar":"tutorialSidebar","previous":{"title":"Quickstart","permalink":"/multi-scrobbler/quickstart"},"next":{"title":"As a Service","permalink":"/multi-scrobbler/installation/service"}}'),i=r(85893),o=r(50065),l=r(703),t=r(73752),c=r(75752),a=r.n(c);let d={sidebar_position:1,title:"Overview"},h=void 0,u={},p=[{value:"Docker",id:"docker",level:2},{value:"Storage",id:"storage",level:4},{value:"Networking",id:"networking",level:4},{value:"Base URL",id:"base-url",level:5},{value:"Other",id:"other",level:4},{value:"Linux Host",id:"linux-host",level:4},{value:"Docker Usage Example",id:"docker-usage-example",level:3},{value:"Local Installation",id:"local-installation",level:2},{value:"Nodejs",id:"nodejs",level:3},{value:"Rollup build error",id:"rollup-build-error",level:4},{value:"Usage Examples",id:"usage-examples",level:4},{value:"Flatpak",id:"flatpak",level:3}];function m(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components},{Details:r}=n;return r||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["For the difference between ",(0,i.jsx)(n.strong,{children:"ENV"})," and ",(0,i.jsx)(n.strong,{children:"File"})," examples in this document see ",(0,i.jsx)(n.a,{href:"/multi-scrobbler/configuration/#configuration-types",children:"Configuration Types"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,i.jsx)(n.p,{children:"Cross-platform images are built for x86 (Intel/AMD) and ARM64 (IE Raspberry Pi)"}),"\n",(0,i.jsx)(n.admonition,{title:"Available Images",type:"info",children:(0,i.jsxs)(l.default,{children:[(0,i.jsxs)(t.default,{value:"docker",label:"Dockerhub",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://hub.docker.com/r/foxxmd/multi-scrobbler",children:"Repository Page"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"docker.io/foxxmd/multi-scrobbler:latest\n"})})]}),(0,i.jsxs)(t.default,{value:"ghcr",label:"Github Packages",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pkgs/container/multi-scrobbler",children:"Repository Page"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"ghcr.io/foxxmd/multi-scrobbler:latest\n"})})]})]})}),"\n",(0,i.jsxs)(n.p,{children:["Or use the example ",(0,i.jsx)(n.code,{children:"docker-compose.yml"}),", found in the repo, after modifying it to fit your configuration:"]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)(n.code,{children:"docker-compose.yml"})}),(0,i.jsx)(a(),{language:"yaml",children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n #- JELLYFIN_APIKEY=\n #- JELLYFIN_URL=\n #- JELLYFIN_USER=\n #- MALOJA_URL=http://maloja:42010\n #- MALOJA_API_KEY=\n #- PUID=1000 # required if running docker on linux host, see main README Docker setup instructions\n #- PGID=1000 # required if running docker on linux host, see main README Docker setup instructions\n\n # set if using a source/client with redirect URI that you have not explicitly set and MS is NOT running on the same machine that you will view the dashboard from\n # EX: You will view MS dashboard at 'http://192.168.0.101:9078' -> set BASE_URL=http://192.168.0.101:9078\n #- BASE_URL=http://MyHostIP:9078\n volumes:\n - \"./config:/config\"\n #networks:\n # - (optional to add container to the same bridge network that maloja is inside to be able to use docker internal networking & dns to resolve and connect to maloja URL via http://maloja:port)\n ports:\n - 9078:9078 # first port is the HOST port multi-scrobbler will serve UI and API on\n restart: unless-stopped\n"})]}),"\n",(0,i.jsx)(n.p,{children:"Recommended configuration steps for docker or docker-compose usage:"}),"\n",(0,i.jsx)(n.h4,{id:"storage",children:"Storage"}),"\n",(0,i.jsx)(n.p,{children:"You should bind a host directory into the container for storing configurations and credentials. Otherwise, these will be lost when the container is updated."}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsxs)(l.default,{groupId:"runType",queryString:!0,children:[(0,i.jsxs)(t.default,{value:"docker",label:"Docker",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.a,{href:"https://docs.docker.com/storage/bind-mounts/#start-a-container-with-a-bind-mount",children:["Using ",(0,i.jsx)(n.code,{children:"-v"})," method for docker"]}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'docker run ... -v "$(pwd)/config:/config" foxxmd/multi-scrobbler\n'})})]}),(0,i.jsxs)(t.default,{value:"docker-compose",label:"Docker Compose",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/compose-file/compose-file-v3/#short-syntax-3",children:"Using docker-compose"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n volumes:\n - "./config:/config"\n'})})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"networking",children:"Networking"}),"\n",(0,i.jsxs)(n.p,{children:["If you are using a ",(0,i.jsx)(n.a,{href:"https://www.appsdeveloperblog.com/docker-networking-bridging-host-and-overlay/",children:"bridge network"})," (default docker setup) you must map a port to the container in order to access the dashboard and use MS with some sources (Webscrobbler, LFM/LZ Endpoints). The default container port is ",(0,i.jsx)(n.code,{children:"9078"}),"."]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsxs)(l.default,{groupId:"runType",queryString:!0,children:[(0,i.jsxs)(t.default,{value:"docker",label:"Docker",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/run/#publish",children:["Docker ",(0,i.jsx)(n.code,{children:"run"})," publish options"]}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"docker run ... -p 9078:9078 foxxmd/multi-scrobbler\n"})})]}),(0,i.jsxs)(t.default,{value:"docker-compose",label:"Docker Compose",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/compose-file/compose-file-v3/#short-syntax-1",children:"docker-compose"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n ports:\n - "9078:9078"\n'})})]})]})]}),"\n",(0,i.jsx)(n.h5,{id:"base-url",children:"Base URL"}),"\n",(0,i.jsx)(n.p,{children:"Optionally, when"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["using a ",(0,i.jsx)(n.a,{href:"/multi-scrobbler/configuration/",children:"Source or Client"}),' that has a "Redirect URI" that you have not explicitly defined']}),"\n",(0,i.jsxs)(n.li,{children:["and","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"using a bridge network or"}),"\n",(0,i.jsx)(n.li,{children:"installing MS on a different machine than the one used to view the dashboard"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["set the ",(0,i.jsx)(n.a,{href:"/multi-scrobbler/configuration/#base-url",children:"Base URL"})," as the IP of the host machine. (This is the IP you would use to view the dashboard in a browser)"]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsxs)(l.default,{groupId:"runType",queryString:!0,children:[(0,i.jsx)(t.default,{value:"docker",label:"Docker",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'docker run ... -e BASE_URL="http://hostMachineIP" foxxmd/multi-scrobbler\n'})})}),(0,i.jsxs)(t.default,{value:"docker-compose",label:"Docker Compose",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/compose-file/compose-file-v3/#short-syntax-1",children:"docker-compose"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n - BASE_URL=http://hostMachineIP\n"})})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"other",children:"Other"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["(Optionally) set the ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones",children:"timezone"})," for the container using the environmental variable ",(0,i.jsx)(n.code,{children:"TZ"})," (",(0,i.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/run/#env",children:"docker"}),") (",(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/compose-file/compose-file-v3/#environment",children:"docker-compose"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"linux-host",children:"Linux Host"}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["If you are running this container with ",(0,i.jsx)(n.strong,{children:"Docker"})," on a ",(0,i.jsx)(n.strong,{children:"Linux Host"})," you must specify ",(0,i.jsx)(n.code,{children:"user:group"})," permissions of the user who owns the ",(0,i.jsx)(n.strong,{children:"configuration directory"})," on the host to avoid ",(0,i.jsx)(n.a,{href:"https://ikriv.com/blog/?p=4698",children:"docker file permission problems."})," These can be specified using the ",(0,i.jsxs)(n.a,{href:"https://docs.linuxserver.io/general/understanding-puid-and-pgid",children:["environmental variables ",(0,i.jsx)(n.strong,{children:"PUID"})," and ",(0,i.jsx)(n.strong,{children:"PGID"}),"."]})]}),(0,i.jsx)(n.p,{children:"To get the UID and GID for the current user run these commands from a terminal:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"id -u"})," -- prints UID"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"id -g"})," -- prints GID"]}),"\n"]})]}),"\n",(0,i.jsx)(n.h3,{id:"docker-usage-example",children:"Docker Usage Example"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["See the ",(0,i.jsx)(n.a,{href:"/quickstart",children:(0,i.jsx)(n.strong,{children:"Quick Start Guide"})})," for another guided docker-compose example"]})}),"\n",(0,i.jsx)(n.p,{children:"The example scenario:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsxs)(n.a,{href:"/configuration/sources/jellyfin",children:["Jellyfin ",(0,i.jsx)(n.strong,{children:"Source"})]})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsxs)(n.a,{href:"/configuration/sources/maloja",children:["Maloja ",(0,i.jsx)(n.strong,{children:"Client"})]})}),"\n",(0,i.jsxs)(n.li,{children:["Serving app on port ",(0,i.jsx)(n.code,{children:"9078"})]}),"\n",(0,i.jsxs)(n.li,{children:["Docker container located on a different IP (",(0,i.jsx)(n.code,{children:"192.168.0.100"}),") so use ",(0,i.jsx)(n.a,{href:"/configuration#base-url",children:"Base URL"})]}),"\n",(0,i.jsxs)(n.li,{children:["Config/data directory on host machine in a directory next to ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})]}),"\n",(0,i.jsxs)(n.li,{children:["Linux uid/gid is ",(0,i.jsx)(n.code,{children:"1000:1000"})]}),"\n"]}),"\n",(0,i.jsxs)(l.default,{groupId:"runType",queryString:!0,children:[(0,i.jsx)(t.default,{value:"docker",label:"Docker",children:(0,i.jsxs)(l.default,{groupId:"configType",queryString:!0,children:[(0,i.jsx)(t.default,{value:"env",label:"ENV",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'docker run --name multi-scrobbler -e "JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c" -e "JELLYFIN_URL=192.168.0.101:8096" -e "JELLYFIN_USER=MyUser" -e "BASE_URL=192.168.0.100" -e "MALOJA_URL=http://domain.tld" -e "MALOJA_API_KEY=1234" -e "PUID=1000" -e "PGID=1000" -p 9078:9078 -v /home/myUser/ms:/config foxxmd/multi-scrobbler\n'})})}),(0,i.jsx)(t.default,{value:"file",label:"File",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'docker run --name multi-scrobbler -e "PUID=1000" -e "PGID=1000" -e "BASE_URL=192.168.0.100" -p 9078:9078 -v "$(pwd)/config:/config" foxxmd/multi-scrobbler\n'})})})]})}),(0,i.jsxs)(t.default,{value:"docker-compose",label:"Docker Compose",children:[(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"#docker",children:(0,i.jsx)(n.code,{children:"docker-compose.yml"})})," sample above for more options and annotations."]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c\n - JELLYFIN_URL=192.168.0.101:8096\n - JELLYFIN_USER=MyUser\n - BASE_URL=http://192.168.0.100:9078\n - MALOJA_URL=http://domain.tld:42010\n - MALOJA_API_KEY=1234\n - PUID=1000\n - PGID=1000\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"local-installation",children:"Local Installation"}),"\n",(0,i.jsxs)(n.p,{children:["After installation see ",(0,i.jsx)(n.a,{href:"/multi-scrobbler/installation/service",children:"service.md"})," to configure multi-scrobbler to run automatically in the background."]}),"\n",(0,i.jsx)(n.h3,{id:"nodejs",children:"Nodejs"}),"\n",(0,i.jsx)(n.p,{children:"Clone this repository somewhere and then install from the working directory"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"git clone https://github.com/FoxxMD/multi-scrobbler.git .\ncd multi-scrobbler\nnvm use # optional, to set correct Node version\nnpm install\nnpm run docs:install && npm run build\nnpm run start\n"})}),"\n",(0,i.jsx)(n.h4,{id:"rollup-build-error",children:"Rollup build error"}),"\n",(0,i.jsxs)(n.p,{children:["During building if you encounter an error like: ",(0,i.jsx)(n.code,{children:'Your current platform "XXX" and architecture "XXX" combination is not yet supported by the native Rollup build.'})]}),"\n",(0,i.jsxs)(n.p,{children:["Modify ",(0,i.jsx)(n.code,{children:"overrides"})," in ",(0,i.jsx)(n.code,{children:"package.json"})," to use ",(0,i.jsx)(n.code,{children:"@rollup/wasm-node"})," as a drop-in replacement for rollup:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'"overrides": {\n "spotify-web-api-node": {\n "superagent": "$superagent"\n }\n "vite": {\n "rollup": "npm:@rollup/wasm-node@^4.9.6"\n }\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/135#issuecomment-1927080260",children:"this issue"})," for more detail."]}),"\n",(0,i.jsx)(n.h4,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,i.jsxs)(l.default,{groupId:"configType",queryString:!0,children:[(0,i.jsx)(t.default,{value:"env",label:"ENV",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c JELLYFIN_URL=192.168.0.101:8096 JELLYFIN_USER=MyUser MALOJA_URL="http://domain.tld" node src/index.js\n'})})}),(0,i.jsxs)(t.default,{value:"file",label:"File",children:[(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:(0,i.jsx)(n.code,{children:"./config/config.json"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="./config/config.json"',children:'{\n "sources": [\n {\n "type": "jellyfin",\n "clients": ["myConfig"],\n "name": "myJellyfinSource",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "url": "http://192.168.0.101:8096",\n "user": "MyUser"\n }\n }\n ],\n "clients": [\n {\n "type": "maloja",\n "name": "myConfig",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n }\n ],\n}\n'})})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"npm run start\n"})})]})]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The web UI and API is served on port ",(0,i.jsx)(n.code,{children:"9078"}),". This can be modified using the ",(0,i.jsx)(n.code,{children:"PORT"})," environmental variable."]})}),"\n",(0,i.jsx)(n.h3,{id:"flatpak",children:"Flatpak"}),"\n",(0,i.jsx)(n.admonition,{title:"Unsupported",type:"warning",children:(0,i.jsxs)(n.p,{children:["Flatpak/Flathub installs are no longer supported. You can still build MS as a ",(0,i.jsx)(n.a,{href:"../development/flatpak",children:"Flatpak app from source."})," See more information about ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/287",children:"Flatpak EOL."})]})})]})}function x(e={}){let{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}}}]);
-1
assets/js/e6ac3f64.1c34ed75.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6922"],{90481:function(e,n,i){i.r(n),i.d(n,{frontMatter:()=>o,default:()=>f,toc:()=>d,metadata:()=>s,assets:()=>h,contentTitle:()=>c});var s=JSON.parse('{"id":"configuration/transforms/musicbrainz","title":"Musicbrainz Stage","description":"The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data.","source":"@site/docs/configuration/transforms/musicbrainz.mdx","sourceDirName":"configuration/transforms","slug":"/configuration/transforms/musicbrainz","permalink":"/multi-scrobbler/configuration/transforms/musicbrainz","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/transforms/musicbrainz.mdx","tags":[],"version":"current","frontMatter":{"title":"Musicbrainz Stage","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Enhancing Scrobbles","permalink":"/multi-scrobbler/configuration/transforms/"},"next":{"title":"Native Stage","permalink":"/multi-scrobbler/configuration/transforms/native"}}'),r=i(85893),a=i(50065),t=i(703),l=i(73752);let o={title:"Musicbrainz Stage",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,h={},d=[{value:"Configuration",id:"configuration",level:2},{value:"API Setup",id:"api-setup",level:3},{value:"Stage Configuration",id:"stage-configuration",level:3},{value:"Rules",id:"rules",level:3},{value:"ENV Configuration",id:"env-configuration",level:2},{value:"Matching with Musicbrainz",id:"matching-with-musicbrainz",level:2},{value:"Searching",id:"searching",level:3},{value:"Retrying Search",id:"retrying-search",level:4},{value:"Refining",id:"refining",level:3},{value:"Score",id:"score",level:3},{value:"Filtering",id:"filtering",level:3},{value:"Release Attributes",id:"release-attributes",level:5},{value:"Empty Releases",id:"empty-releases",level:4},{value:"Sorting",id:"sorting",level:3},{value:"Best Practices",id:"best-practices",level:2},{value:"Sensible Default",id:"sensible-default",level:3},{value:"Filter Considerations",id:"filter-considerations",level:3},{value:"Using Partial Match",id:"using-partial-match",level:3},{value:"Logging",id:"logging",level:2},{value:"Examples",id:"examples",level:2},{value:"Minimal",id:"minimal",level:3},{value:"Sensible Default",id:"sensible-default-1",level:3},{value:"Add Metadata Only (No Scrobble Modification)",id:"add-metadata-only-no-scrobble-modification",level:3},{value:"Use Native Stage if no Musicbrainz Matches",id:"use-native-stage-if-no-musicbrainz-matches",level:3}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components},{Details:i}=n;return i||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Musicbrainz"})," ",(0,r.jsx)(n.a,{href:"/configuration/transforms#stage",children:"Stage"})," matches your Play data with the ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/",children:"MusicBrainz"})," database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"This Stage is useful for standardizing your Scrobble's Play data, regardless of the Source it is coming from."})}),"\n",(0,r.jsxs)(n.p,{children:["Even if you have have strong opinions about the way your existing music is already tagged/organized you should consider adding the Musicbrainz Stage to your Sources, if only to benefit from adding ",(0,r.jsx)(n.a,{href:"#using-partial-match",children:"MBIDs to scrobbled metadata."})]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Why Should I Prefer MusicBrainz?"}),(0,r.jsx)("h3",{children:"More Than Mainstream Data"}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/statistics",children:"MusicBrainz database contains"})]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"37 million+ tracks"}),"\n",(0,r.jsx)(n.li,{children:"5 million+ albums"}),"\n",(0,r.jsx)(n.li,{children:"2.7 million+ artists"}),"\n"]}),(0,r.jsx)(n.p,{children:"in over 200 languages, contributed by 10,000+ editors each year with many more users voting on edits."}),(0,r.jsx)(n.p,{children:"The database covers a much wider range of music than most commercial services since it isn't restricted by licensing or incentivized to prioritize mainstream music due to business interests. You are much more likely to find data for obscure, indie, and international artists."}),(0,r.jsx)("h3",{children:"As The Artist Intended"}),(0,r.jsx)(n.p,{children:'While some large services (Spotify) may be more consistent in data structure, the MusicBrainz equivalent data is likely to be more true to the way the Artist originally intended since individuals can devote effort to individual artists. A fan of an artist is much more likely to "get it right" for their favorite band than a corporate business trying to do the least amount of work for the largest result.'})]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If you are using ",(0,r.jsx)(n.a,{href:"/configuration?config-type=env#configuration-types",children:"ENV Config"})," for multi-scrobbler and just want a quick and easy setup, skip to ",(0,r.jsx)(n.a,{href:"#env-configuration",children:(0,r.jsx)(n.strong,{children:"ENV Configuration"})}),"."]})}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Set up ",(0,r.jsx)(n.a,{href:"/configuration?cachedThings=metadata#caching",children:"Valkey Caching"})," to cache Musicbrainz API calls for faster processing."]})}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n.h3,{id:"api-setup",children:"API Setup"}),"\n",(0,r.jsxs)(n.p,{children:["To avoid rate limiting, MusicBrainz requires API users to identify themself using a ",(0,r.jsx)(n.a,{href:"https://wiki.musicbrainz.org/MusicBrainz_API/Rate_Limiting#How_can_I_be_a_good_citizen_and_be_smart_about_using_the_Web_Service?",children:"User-Agent that contains an email or URL."})," You must set this in the ",(0,r.jsx)(n.code,{children:"data"})," for your ",(0,r.jsx)(n.a,{href:"http://localhost:3000/docs/configuration/transforms/#configuring-stages",children:"stage configuration"})," in your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n }\n ]\n}\n'})}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Additional Musicbrainz Servers"}),(0,r.jsx)(n.p,{children:"Other, or additional, Musicbrainz Servers/Mirrors can be added to the API configuration. If more than one server is defined then multi-scrobbler will round-robin load balance API calls."}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.code,{children:"url"})," to define the base URL of the Musicbrainz server to use. If ",(0,r.jsx)(n.code,{children:"url"})," is not defined multi-scrobbler assumes it is the primary Musicbrainz server, ",(0,r.jsx)(n.code,{children:"https://musicbrainz.org"}),"."]}),(0,r.jsx)(n.p,{children:"Example of multiple servers:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n // uses default Musicbrainz server https://musicbrainz.org\n },\n // additional server\n {\n "contact": "contact@mydomain.com",\n "url": "https://my.mb.mirror.domain.com"\n }\n ]\n },\n }\n ]\n}\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"stage-configuration",children:"Stage Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["All of the properties found in ",(0,r.jsx)(n.a,{href:"#matching-with-musicbrainz",children:(0,r.jsx)(n.strong,{children:"Matching with Musicbrainz"})})," section are configured in ",(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," as ",(0,r.jsx)(n.code,{children:"defaults"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ],\n "defaults": {\n "releaseStatusPriority": ["official"],\n "fallbackArtistSearch": "native",\n "releaseAllowEmpty": true\n }\n },\n }\n ]\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"rules",children:"Rules"}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.jsx)(n.a,{href:"/configuration/transforms#stage-rules",children:"Rule"})," should be either a boolean, specifying if the transformed data should be used for this field, or a ",(0,r.jsxs)(n.a,{href:"/configuration/transforms#conditional-moditication",children:[(0,r.jsx)(n.code,{children:"when"})," condition"]}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n "type": "musicbrainz",\n "name": "MyMB"\n // ...\n "title": false, // will not apply any changes to Play title\n "artists": {\n "when": {/* ... */}, // will only apply changes to Play artists if "when" is satisfied\n /* ... */\n },\n "album": true // will always apply changes to Play album\n "meta": true // adds MusicBrainz MBIDs to scrobble data\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"env-configuration",children:"ENV Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["The general configuration shown above can also be configured from a selection of ",(0,r.jsx)(n.em,{children:"presets"})," using ",(0,r.jsx)(n.a,{href:"/configuration?configType=env#configuration-types",children:"ENV Config"})," for individual Sources/Clients."]}),"\n",(0,r.jsxs)(n.p,{children:["You must ",(0,r.jsx)(n.strong,{children:"always"})," include the ",(0,r.jsx)(n.code,{children:"MB_CONTACT"})," ENV to ",(0,r.jsx)(n.a,{href:"#api-setup",children:"identify your application"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ini",children:"MB_CONTACT=contact@mydomain.com\n"})}),"\n",(0,r.jsxs)(n.p,{children:["To configure ",(0,r.jsx)(n.a,{href:"#stage-configuration",children:"stage defaults"})," use ",(0,r.jsx)(n.code,{children:"MB_PRESETS"})," with a comma-delimited list of presets you wish to apply. More than one preset can be applied, in which case they combine. You must choose at least one of the presets below:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"default"})," - Applies no defaults. This is the same as using no options from ",(0,r.jsx)(n.a,{href:"#matching-with-musicbrainz",children:"Matching With Musicbrainz"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"sensible"})," - Applies the ",(0,r.jsx)(n.a,{href:"#sensible-default",children:"Sensible Default"})," configuration for sorting releases"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"native"})," - Applies ",(0,r.jsx)(n.code,{children:"fallbackArtistSearch: native"})," for ",(0,r.jsx)(n.a,{href:"#artist-extraction",children:"Artist Extraction"})," if the first search fails to find matches"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggressive"})," - Applies ",(0,r.jsx)(n.a,{href:"#free-text",children:"Free Text Search"})," ",(0,r.jsx)(n.code,{children:"fallbackFreeTextSearch: true"})," if all other searches fail"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Finally, use ENV ",(0,r.jsx)(n.code,{children:"*_TRANSFORMS=musicbrainz"})," on each Source/Client you wish to apply this stage to. This applies the stage in the ",(0,r.jsxs)(n.a,{href:"/configuration/transforms#lifecycle-hooks",children:[(0,r.jsx)(n.code,{children:"preTransform"})," Hook"]})," with all ",(0,r.jsx)(n.a,{href:"#rules",children:"Rules"})," enabled."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"*"})," stands for the prefix used for each Source/Client's ENV keys. Refer to the individual Source/Client Configuration sections to find this. Example:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["All ",(0,r.jsx)(n.a,{href:"http://localhost:3000/docs/configuration/sources/subsonic/",children:"Subsonic Source"})," ENVs look like ",(0,r.jsx)(n.code,{children:"SUBSONIC_USER=myuser"})," etc..."]}),"\n",(0,r.jsxs)(n.li,{children:["Use ",(0,r.jsx)(n.code,{children:"SUBSONIC_TRANSFORMS=musicbrainz"})]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example Full Docker Deploy with ENV Configuration"}),(0,r.jsxs)(n.p,{children:["Using ",(0,r.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"Jellyfin + Maloja"})," example from Quickstart:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n // highlight-start\n - MB_CONTACT=contact@mydomain.com\n - MB_PRESETS=sensible,native # creates sensible defaults with native fallback searching\n // highlight-end\n - JELLYFIN_URL=192.168.0.110:8096\n - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b\n - JELLYFIN_USER=MyUser\n // highlight-start\n - JELLYFIN_TRANSFORMS=musicbrainz # applies musicbrainz Stage to preTransform of Jellyfin source\n // highlight-end\n\n - MALOJA_URL=http://192.168.0.100:42010 # maloja receives enhanced scrobble from Jellyfin\n - MALOJA_API_KEY=myApiKey\n\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})})]}),"\n",(0,r.jsx)(n.h2,{id:"matching-with-musicbrainz",children:"Matching with Musicbrainz"}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"All properties found in this section are optional."})}),(0,r.jsxs)(n.p,{children:["If you just want a sensible default for configuraion refer to the ",(0,r.jsx)(n.a,{href:"#best-practices",children:"Best Practices"})," section."]})]}),"\n",(0,r.jsx)(n.p,{children:"Matching your Scrobble's Play data with a result from Musicbrainz is comprised of two steps:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#searching",children:(0,r.jsx)(n.strong,{children:"Searching"})})," Musicbrainz using parts of your Scrobble as queries"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#refining",children:(0,r.jsx)(n.strong,{children:"Refining"})})," matched results to select the desired/allowed match"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Both steps have separate configuration."}),"\n",(0,r.jsx)(n.h3,{id:"searching",children:"Searching"}),"\n",(0,r.jsx)(n.p,{children:"Before MS begins a search it checks Scrobble data it checks if your data already contains:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/MusicBrainz_Identifier",children:"MBIDs"})," for ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Artist",children:"artists"}),", ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Release",children:"album"}),", and specific ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Recording",children:"track/recording"})]}),"\n",(0,r.jsx)(n.li,{children:"and duration"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["If it already has all required data types then the entire Musicbrainz Stage ",(0,r.jsxs)(n.a,{href:"/configuration/transforms/#flow-control",children:["is ",(0,r.jsx)(n.strong,{children:"skipped"}),"."]})," If any are missing then a search is performed."]}),"\n",(0,r.jsx)(n.p,{children:"Define which data types are required using:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"searchWhenMissing"})," (defaults to all) - A list containing any of: ",(0,r.jsx)(n.code,{children:"artists"})," ",(0,r.jsx)(n.code,{children:"title"})," ",(0,r.jsx)(n.code,{children:"album"})," ",(0,r.jsx)(n.code,{children:"duration"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"forceSearch"})," (default ",(0,r.jsx)(n.code,{children:"false"}),") - Force searching even if all required data is present"]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:"// ...\n\"defaults\": {\n // only search if MBIDs for artists or album is missing\n \"searchWithMissing\": ['artists', 'album']\n\n // uncomment to make the stage always search, even if above data is present\n //forceSearch: true\n }\n"})})]}),"\n",(0,r.jsxs)(n.p,{children:["If required data is missing then the next step is making ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/MusicBrainz_API/Search",children:"search queries to the Musicbrainz database"})," to try to get potential candidates. Multi-scrobbler uses the ",(0,r.jsx)(n.strong,{children:"title, artist(s), and album"})," from your Scrobble data to query for matches."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["If your Scrobble data contains an ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/ISRC",children:"ISRC"})," (usually from Spotify) then Multi-scrobbler will search using this ID first, before the above criteria. If no match is found with the ISRC then it automatically retries with the title, artist(s), and album."]})}),"\n",(0,r.jsxs)(n.p,{children:["Musicbrainz agressively normalizes these fields in its database which means that if your Scrobble data contains major innaccuracies or phrases fields in a non-normal way, it's possible Musicbrainz won't find any matches. This is a more common occurrence when trying to match Scrobble data from Sources that don't support multiple artist data, like ",(0,r.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," and ",(0,r.jsx)(n.a,{href:"/configuration/sources/lastfm",children:"Last.fm"}),"."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Examples of Bad Data"}),(0,r.jsx)(n.p,{children:"Last.fm Scrobble returns an Artist in the title and combines two artists into one string:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup & Punk Rock Factory"]\n}\n'})}),(0,r.jsxs)(n.p,{children:["The corresponding ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/release/85bf284b-8b39-414e-8ad9-61f593072588",children:"Musicbrainz Recording"})," has all artists separated and no artist in the title:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility",\n "artists": ["Bowling For Soup", "Punk Rock Factory", "Wheatus"]\n}\n'})})]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["If the initial search(es), and any ",(0,r.jsx)(n.a,{href:"#retrying-search",children:"retried searches"}),", do not return any results then the stage is marked as ",(0,r.jsxs)(n.a,{href:"/configuration/transforms/#flow-control",children:[(0,r.jsx)(n.strong,{children:"failed"})," (",(0,r.jsx)(n.code,{children:"onFailure"}),") for ",(0,r.jsx)(n.strong,{children:"Flow Control"})]}),"."]})}),"\n",(0,r.jsx)(n.h4,{id:"retrying-search",children:"Retrying Search"}),"\n",(0,r.jsx)(n.p,{children:"If normal searches using all the fields mentioned above does not return any matches Multi-scrobbler can try additional searches with modified queries."}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Album Only"}),(0,r.jsxs)(n.p,{children:["If your Scrobble data contains a title, artist(s), and an album (all three fields) then Multi-scrobbler can retry the search using only title and album, if ",(0,r.jsx)(n.code,{children:"fallbackAlbumSearch"})," is set in ",(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"}),":"]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will try an additional search using only title + album name\n "fallbackAlbumSearch": "true"\n }\n'})})]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Artist Extraction"}),(0,r.jsx)(n.p,{children:"If..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#album-only",children:"Album Only"})," returns no results or did not run"]}),"\n",(0,r.jsxs)(n.li,{children:["Your scrobble data contains only ",(0,r.jsx)(n.strong,{children:"one"})," artist string"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fallbackArtistSearch"})," is set in ",(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Then Multi-scrobbler will attempt to extract multiple artists from your artist and track string. ",(0,r.jsxs)(n.strong,{children:["This is not automatic. You must set ",(0,r.jsx)(n.code,{children:"fallbackArtistSearch"})," to enable this additional search."]})]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"fallbackArtistSearch"})," can be set to ",(0,r.jsx)(n.strong,{children:"Native"})," or ",(0,r.jsx)(n.strong,{children:"Naive"})," mode:"]}),(0,r.jsxs)(t.default,{groupId:"fallbackArtist",queryString:!0,children:[(0,r.jsxs)(l.default,{value:"native",label:"Native (Recommended)",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Native"})," (",(0,r.jsx)(n.code,{children:"native"}),") mode uses an aggressive configuration of the ",(0,r.jsx)(n.a,{href:"/configuration/transforms/native",children:"Native Stage"}),' to extract artists using common delimiters and common "joined" artist patterns from the artist and title string of your Scrobble data.']}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"If you already have a Native Stage configured you should use that instead, running it before the Musicbrainz stage."})}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Native Mode Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup & Punk Rock Factory, My Cool Band"]\n}\n'})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Extracts ",(0,r.jsx)(n.code,{children:"Bowling For Soup"})," ",(0,r.jsx)(n.code,{children:"Punk Rock Factory"})," ",(0,r.jsx)(n.code,{children:"My Cool Band"})," from artist string"]}),"\n",(0,r.jsxs)(n.li,{children:["Extracts ",(0,r.jsx)(n.code,{children:"Wheatus"})," from title string","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Removes ",(0,r.jsx)(n.code,{children:"(feat. Wheatus)"})," from title string because it found an artist there"]}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsx)(n.p,{children:"Resulting data used for Musicbrainz search:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility",\n "artists": ["Bowling For Soup", "Punk Rock Factory", "My Cool Band", "Wheatus"]\n}\n'})})]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // ...\n "fallbackArtistSearch": "native"\n }\n'})})]}),(0,r.jsxs)(l.default,{value:"naive",label:"Naive",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Naive"})," (",(0,r.jsx)(n.code,{children:"naive"}),") mode looks for the first found common delimiter in the artist string. If it finds one then it uses the preceding value as the only artist in the Musicbrainz search. It does not try to extract additional artists from the artist string, or extract anything from the title string."]}),(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Naive Mode Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup, Punk Rock Factory & Wheatus"]\n}\n'})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Finds ",(0,r.jsx)(n.code,{children:"&"}),' as first common delimiter, extracts "Bowling For Soup"']}),"\n"]}),(0,r.jsx)(n.p,{children:"Resulting data used for Musicbrainz search:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup"]\n}\n'})})]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // ...\n "fallbackArtistSearch": "naive"\n }\n'})})]})]})]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Free Text"}),(0,r.jsxs)(n.p,{children:["If both ",(0,r.jsx)(n.a,{href:"#album-only",children:"Album Only"})," and ",(0,r.jsx)(n.a,{href:"#artist-extraction",children:"Artist Extraction"})," searches fail to return results, or were not run, you can additionally enable ",(0,r.jsx)(n.strong,{children:"Free Text"})," search. This will search Musicbrainz for ",(0,r.jsx)(n.strong,{children:"all"})," text of your Scrobble data artist/title/album, without constraint."]}),(0,r.jsxs)(n.admonition,{type:"warning",children:[(0,r.jsxs)(n.p,{children:["Free text search is ",(0,r.jsx)(n.strong,{children:"unconstrained"})," which means that Musicbrainz will match text in ",(0,r.jsx)(n.strong,{children:"any"})," part of a Recording (artist, release, or recording field), regardless of where it is found. This may lead to results that are unexpected and undesired."]}),(0,r.jsxs)(n.p,{children:["If you know your Source's Play data is well organized you ",(0,r.jsx)(n.strong,{children:"should not"})," enable this. Free Text search should only be used if:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"your music is not well organized or"}),"\n",(0,r.jsxs)(n.li,{children:["there may be many alternative titles/artists for the music you listen to (such as with ",(0,r.jsx)(n.a,{href:"https://wiki.musicbrainz.org/Release#Status",children:"psuedo-releases"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["you can tolerate that matches may not be accurate for releases.","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Generally, if you keep ",(0,r.jsx)(n.a,{href:"#score",children:"score"})," high then matched releases should ",(0,r.jsx)(n.em,{children:"at least"}),' be the right artist or what you would expect within a reason, as a match. The release may not be the one you actually listened to but it would be "close enough".']}),"\n"]}),"\n"]}),"\n"]})]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // ...\n "fallbackFreeTextSearch": true\n }\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"refining",children:"Refining"}),"\n",(0,r.jsx)(n.h3,{id:"score",children:"Score"}),"\n",(0,r.jsxs)(n.p,{children:["Each match returned by MusicBrainz contains a numeric score representing how close it was to the search parameters. Set ",(0,r.jsx)(n.code,{children:"score"})," in configuration to set a minimum score that must be met by matches. Default is ",(0,r.jsx)(n.code,{children:"90"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n // ...\n "score": 90 // matches must score 90 or higher to be considered\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"filtering",children:"Filtering"}),"\n",(0,r.jsxs)(n.p,{children:["There are several attributes associated with the ",(0,r.jsx)(n.a,{href:"https://wiki.musicbrainz.org/Release",children:"Release"})," a ",(0,r.jsx)(n.a,{href:"https://wiki.musicbrainz.org/Recording",children:"Recording"})," (individual Track/song) belongs to that you may be interested in controlling. MS can use these attributes to filter what the final Recording selected to match against your Play data is."]}),"\n",(0,r.jsx)(n.p,{children:"An easy way to think about this:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Do you prefer Albums, Singles, or EPs?"}),"\n",(0,r.jsx)(n.li,{children:"Do you always want to use an official album release, or are bootleg or cancelled albums okay to use?"}),"\n",(0,r.jsx)(n.li,{children:"Should a track that belongs to a Compilation album be allowed to match?"}),"\n",(0,r.jsx)(n.li,{children:"What country do you prefer an album release to be from?"}),"\n"]}),"\n",(0,r.jsx)(n.h5,{id:"release-attributes",children:"Release Attributes"}),"\n",(0,r.jsxs)(n.p,{children:["These attributes (",(0,r.jsx)(n.code,{children:"attribute_name"})," in config) are:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.a,{href:"https://wiki.musicbrainz.org/Release#Status",children:["Release ",(0,r.jsx)(n.strong,{children:"Status"})]})," (",(0,r.jsx)(n.code,{children:"releaseStatus"}),") - Is this release/album/ep official, promotional, bootleg, etc..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.a,{href:"https://wiki.musicbrainz.org/Release_Group/Type#Primary_types",children:["Release Group ",(0,r.jsx)(n.strong,{children:"Primary Type"})]})," (",(0,r.jsx)(n.code,{children:"releaseGroupPrimaryType"}),") - Is this release an Album, Single, EP, etc..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.a,{href:"https://wiki.musicbrainz.org/Release_Group/Type#Secondary_types",children:["Release Group ",(0,r.jsx)(n.strong,{children:"Secondary Type"})]})," (",(0,r.jsx)(n.code,{children:"releaseGroupSecondaryType"}),") - Is this release a compilation, soundtrack, remix, etc..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.a,{href:"https://beta.musicbrainz.org/doc/Release/Country",children:["Release ",(0,r.jsx)(n.strong,{children:"Country"})]})," (",(0,r.jsx)(n.code,{children:"releaseCountry"}),") - What ISO2 country was this released in? US, GB, MX, etc...","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["MusicBrainz uses the special code ",(0,r.jsx)(n.code,{children:"XW"}),' to represent a "Worldwide" release AKA release not made specifically for a country']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Each of the above attributes can be used to ",(0,r.jsx)(n.strong,{children:"filter"})," matches using ",(0,r.jsx)(n.code,{children:"allow"})," (explicitly include) or ",(0,r.jsx)(n.code,{children:"deny"})," (exclude) terms. The correct property name for each is like so:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'[attribute_name]Allow = [...]\n[attribute_name]Deny\n\nEX to explicitly allow only release status "official"\n\n"releaseStatusAllow": ["official"]\n\nEX to exclude compilations\n\n"releaseGroupSecondaryTypeDeny": ["compilation"]\n'})}),"\n",(0,r.jsx)(n.h4,{id:"empty-releases",children:"Empty Releases"}),"\n",(0,r.jsx)(n.p,{children:"Sometimes a Recording may not have any associated Releases. This may be because there is not enough information about the Recording yet, or it was never included on an actual Release."}),"\n",(0,r.jsxs)(n.p,{children:["You may want to filter the majority of your matches by releases but allow matching a Recording that has no releases to begin with. To allow this set ",(0,r.jsx)(n.code,{children:"releaseAllowEmpty"})," to ",(0,r.jsx)(n.code,{children:"true"})," in configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // ...\n "releaseAllowEmpty": true // don\'t remove a match during filtering just because it has no releases\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"sorting",children:"Sorting"}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.jsx)(n.a,{href:"#release-attribute",children:"Release Attribute"})," has one additional property that can be used to ",(0,r.jsx)(n.strong,{children:"rank"})," releases based on the order of the values you give it. This is the ",(0,r.jsx)(n.code,{children:"priority"})," property."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"After"})," matches have been ",(0,r.jsx)(n.a,{href:"#filtering",children:"filtered"}),", the remaining matches will have their releases sorted. Release with an attribute that does not match are ",(0,r.jsx)(n.strong,{children:"not"})," removed, but they are sorted lower than releases that do match."]}),"\n",(0,r.jsxs)(n.p,{children:["Sorting can be a good alternative to filtering: with filters there is a possibility your filters may eliminate all matches; if you want to ensure that ",(0,r.jsx)(n.strong,{children:"some"})," match will be used then sorting can ensure that the ",(0,r.jsx)(n.strong,{children:"best choice"})," out of those given will always be used, without accidentally ending up with ",(0,r.jsx)(n.strong,{children:"no choice"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Sorting can be used instead of filters, or in conjunction with filters, it's your choice."}),"\n",(0,r.jsx)(n.p,{children:"In configuration:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'[attribute_name]Priority = [...]\n\nEX to prefer "official" releases over everything else\n\n"releaseStatusPriority": ["official"]\n\nEX to prefer albums, then singles, over everything else\n\n"releaseGroupPrimaryTypePriority": ["album", "single"]\n'})}),"\n",(0,r.jsxs)(n.p,{children:["If a rule is not present then multi-scrobbler defaults it to ",(0,r.jsx)(n.code,{children:"true"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,r.jsx)(n.h3,{id:"sensible-default",children:"Sensible Default"}),"\n",(0,r.jsxs)(n.p,{children:["Generally, the Musicbrainz Stage can be used without any of the ",(0,r.jsx)(n.a,{href:"#configuration",children:"optional configuration"})," and you should still see good results from matches. The top ",(0,r.jsx)(n.a,{href:"#score",children:"scored"})," match is, anecdotally, good enough for correcting and filling in surface-level play data like Title and Artist names."]}),"\n",(0,r.jsx)(n.p,{children:"For a more opinionated match that will mirror what you would expect from data from large music services:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n // use official release over anything else\n "releaseStatusPriority": ["official"],\n // prefer album, then single, then ep\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n // prefer worldwide release\n "releaseCountryPriority": ["XW"]\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Consider adding ",(0,r.jsx)(n.a,{href:"./?fallbackArtist=native#artist-extraction",children:"Artist Extraction"})," in ",(0,r.jsx)(n.strong,{children:"Native Mode"})," if any of your Sources do not support multiple artists or your music collection is not tagged well."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n // add the line below to the sensible defaults above\n // (don\'t forget commas)\n "fallbackArtistSearch": "native"\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"filter-considerations",children:"Filter Considerations"}),"\n",(0,r.jsx)(n.p,{children:"When using your own filters consider:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Prefer ",(0,r.jsx)(n.code,{children:"deny"})," over ",(0,r.jsx)(n.code,{children:"allow"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Releases come in all kinds of formats. Since ",(0,r.jsx)(n.code,{children:"allow"})," is explicit you may filter out your desired match without realizing it (correct data except for release type). Or the Musicbrainz data for a higher scored match may be appropriate but you did not include it, exhaustively."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Prefer ",(0,r.jsx)(n.a,{href:"#sorting",children:"Sorting"})," over ",(0,r.jsx)(n.a,{href:"#filtering",children:"Filtering"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Sorting does not eliminate any matches. It is, generally, better to get ",(0,r.jsx)(n.strong,{children:"some"})," match than it is to have your Play data completely uncorrected because filtering eliminated all matches"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"using-partial-match",children:"Using Partial Match"}),"\n",(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.a,{href:"#rules",children:"Rules"})," to apply MusicBrainz match data selectively."]}),"\n",(0,r.jsxs)(n.p,{children:["If you know that your music collection is well organized and you do not want to change the artists/title/album etc... sent to a ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Client"}),", you can still benefit from matches by only applying MBIDs using ",(0,r.jsx)(n.code,{children:"meta"})," so that any Client that supports Musicbrainz data (",(0,r.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito"}),", ",(0,r.jsx)(n.a,{href:"/configuration/clients/tealfm",children:"Tealfm"}),", ",(0,r.jsx)(n.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz"}),", ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky",children:"Rocksky"}),") can still get that data."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "title": false,\n "artists": false,\n "album": false,\n "albumArtists": false,\n "meta": true\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsx)(n.p,{children:"If"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Musicbrainz is not returning matches"}),"\n",(0,r.jsx)(n.li,{children:"Multi-scrobbler is using the wrong match"}),"\n",(0,r.jsx)(n.li,{children:"or the resulting enhanced Scrobble is not what you expected"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Enable logging by turning on ",(0,r.jsx)(n.a,{href:"/configuration#debug-mode",children:(0,r.jsx)(n.strong,{children:"Debug Mode"})})," to help diagnose any issues with the Musicbrainz API and Scrobble enhancement. ",(0,r.jsx)(n.strong,{children:"Before creating an issue"})," please enable logging and include any logs with your issue as this is needed to debug."]}),"\n",(0,r.jsxs)(n.p,{children:["If you have multiple Modification Stages and need to see the diff for your Play between each Stage, enable ",(0,r.jsx)(n.code,{children:'"log": "all"'})," in the individual ",(0,r.jsx)(n.a,{href:"http://localhost:3000/docs/configuration/transforms/musicbrainz/?fallbackArtist=native#artist-extraction",children:"Modification Stage"}),"."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n // highlight-start\n "log": "all",\n // highlight-end\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,r.jsx)(n.h3,{id:"minimal",children:"Minimal"}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"sensible-default-1",children:"Sensible Default"}),"\n",(0,r.jsxs)(n.p,{children:["Using the config shown in ",(0,r.jsx)(n.a,{href:"#sensible-default",children:"Sensible Default"})," with File/AIO config, instead of ",(0,r.jsx)(n.a,{href:"#env-configuration",children:"ENV Config"}),"."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n "defaults": {\n "releaseStatusPriority": ["official"],\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n "releaseCountryPriority": ["XW"],\n "fallbackArtistSearch": "native"\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"add-metadata-only-no-scrobble-modification",children:"Add Metadata Only (No Scrobble Modification)"}),"\n",(0,r.jsxs)(n.p,{children:["If you do not want your scrobble data to be modified (artists/album/title) but still want to benefit from associating the scrobble with a Musicbrainz match (for Scrobble ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Clients"})," like ",(0,r.jsx)(n.a,{href:"/configuration/clients/tealfm",children:"Tealfm"}),", ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky",children:"Rocksky"}),", and ",(0,r.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito"}),"), then use ",(0,r.jsx)(n.a,{href:"#using-partial-match",children:"Partial Match"})," rules to specify only ",(0,r.jsx)(n.code,{children:"meta"})," to be updated."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n "defaults": {\n // maybe something like Sensible Default?\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/clients/jellyfin",children:"Jellyfin"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="jellyfin.json"',children:'[\n { \n "name": "MyJellyfin",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "title": false,\n "artists": false,\n "album": false,\n "albumArtists": false,\n "meta": true // only update scrobble metadata with MBIDs\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"use-native-stage-if-no-musicbrainz-matches",children:"Use Native Stage if no Musicbrainz Matches"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Musicbrainz Stage configured with","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#sensible-default",children:"Sensible Defaults"})}),"\n",(0,r.jsxs)(n.li,{children:["Fallback search with ",(0,r.jsx)(n.a,{href:"#retrying-search",children:"Artist Extraction"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/configuration/transforms/native/#default-stage",children:"Default Native Stage"})}),"\n",(0,r.jsxs)(n.li,{children:["Uses ",(0,r.jsx)(n.a,{href:"/configurations/transforms#flow-control",children:"Flow Control"})," to run Native only if there are no Musicbrainz matches"]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n "defaults": {\n "releaseStatusPriority": ["official"],\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n "releaseCountryPriority": ["XW"],\n "fallbackArtistSearch": "native",\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/clients/jellyfin",children:"Jellyfin"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="jellyfin.json"',children:'[\n { \n "name": "MyJellyfin",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n // if musicbrainz is successful then do NOT run native,\n // only run native if musicbrainz fails to find a match (onFailure)\n "type": "musicbrainz",\n "name": "MyMB"\n "onSuccess": "stop",\n "onFailure": "continue"\n },\n {\n "type": "native"\n }\n ]\n }\n }\n }\n]\n'})})]})]})}function f(e={}){let{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}}}]);
+1
assets/js/e6ac3f64.f3c52953.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6922"],{90481:function(e,n,s){s.r(n),s.d(n,{frontMatter:()=>l,default:()=>m,toc:()=>h,metadata:()=>i,assets:()=>d,contentTitle:()=>c});var i=JSON.parse('{"id":"configuration/transforms/musicbrainz","title":"Musicbrainz Stage","description":"The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data.","source":"@site/docs/configuration/transforms/musicbrainz.mdx","sourceDirName":"configuration/transforms","slug":"/configuration/transforms/musicbrainz","permalink":"/multi-scrobbler/configuration/transforms/musicbrainz","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/transforms/musicbrainz.mdx","tags":[],"version":"current","frontMatter":{"title":"Musicbrainz Stage","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Enhancing Scrobbles","permalink":"/multi-scrobbler/configuration/transforms/"},"next":{"title":"Native Stage","permalink":"/multi-scrobbler/configuration/transforms/native"}}'),r=s(85893),a=s(50065),t=s(703),o=s(73752);let l={title:"Musicbrainz Stage",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,d={},h=[{value:"Configuration",id:"configuration",level:2},{value:"API Setup",id:"api-setup",level:3},{value:"Stage Configuration",id:"stage-configuration",level:3},{value:"Rules and Hooks",id:"rules-and-hooks",level:3},{value:"ENV Configuration",id:"env-configuration",level:2},{value:"Matching with Musicbrainz",id:"matching-with-musicbrainz",level:2},{value:"Searching",id:"searching",level:3},{value:"Should MS Search?",id:"should-ms-search",level:4},{value:"Search Methods",id:"search-methods",level:4},{value:"Refining",id:"refining",level:3},{value:"Score",id:"score",level:3},{value:"Filtering",id:"filtering",level:3},{value:"Release Attributes",id:"release-attributes",level:5},{value:"Empty Releases",id:"empty-releases",level:4},{value:"Sorting",id:"sorting",level:3},{value:"Release Attributes",id:"sorting-releases",level:4},{value:"Field Scoring",id:"field-scoring",level:4},{value:"Best Practices",id:"best-practices",level:2},{value:"Sensible Default",id:"sensible-default",level:3},{value:"Search Considerations",id:"search-considerations",level:3},{value:"Filter Considerations",id:"filter-considerations",level:3},{value:"Using Partial Match",id:"using-partial-match",level:3},{value:"Logging",id:"logging",level:2},{value:"Examples",id:"examples",level:2},{value:"Minimal",id:"minimal",level:3},{value:"Sensible Default",id:"sensible-default-1",level:3},{value:"Add Metadata Only (No Scrobble Modification)",id:"add-metadata-only-no-scrobble-modification",level:3},{value:"Use Native Stage if no Musicbrainz Matches",id:"use-native-stage-if-no-musicbrainz-matches",level:3},{value:"Different Search Methods Based on Source (Last.fm and Spotify)",id:"override-stage-configuration-example",level:3}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components},{Details:s,DetailsAdmo:i}=n;return s||f("Details",!0),i||f("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Musicbrainz"})," ",(0,r.jsx)(n.a,{href:"/configuration/transforms#stage",children:"Stage"})," matches your Play data with the ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/",children:"MusicBrainz"})," database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"This Stage is useful for standardizing your Scrobble's Play data, regardless of the Source it is coming from."})}),"\n",(0,r.jsxs)(n.p,{children:["Even if you have have strong opinions about the way your existing music is already tagged/organized you should consider adding the Musicbrainz Stage to your Sources, if only to benefit from adding ",(0,r.jsx)(n.a,{href:"#using-partial-match",children:"MBIDs to scrobbled metadata."})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Why Should I Prefer MusicBrainz?"}),(0,r.jsx)("h3",{children:"More Than Mainstream Data"}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/statistics",children:"MusicBrainz database contains"})]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"37 million+ tracks"}),"\n",(0,r.jsx)(n.li,{children:"5 million+ albums"}),"\n",(0,r.jsx)(n.li,{children:"2.7 million+ artists"}),"\n"]}),(0,r.jsx)(n.p,{children:"in over 200 languages, contributed by 10,000+ editors each year with many more users voting on edits."}),(0,r.jsx)(n.p,{children:"The database covers a much wider range of music than most commercial services since it isn't restricted by licensing or incentivized to prioritize mainstream music due to business interests. You are much more likely to find data for obscure, indie, and international artists."}),(0,r.jsx)("h3",{children:"As The Artist Intended"}),(0,r.jsx)(n.p,{children:'While some large services (Spotify) may be more consistent in data structure, the MusicBrainz equivalent data is likely to be more true to the way the Artist originally intended since individuals can devote effort to individual artists. A fan of an artist is much more likely to "get it right" for their favorite band than a corporate business trying to do the least amount of work for the largest result.'})]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If you are using ",(0,r.jsx)(n.a,{href:"/configuration?config-type=env#configuration-types",children:"ENV Config"})," for multi-scrobbler and just want a quick and easy setup, skip to ",(0,r.jsx)(n.a,{href:"#env-configuration",children:(0,r.jsx)(n.strong,{children:"ENV Configuration"})}),"."]})}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Set up ",(0,r.jsx)(n.a,{href:"/configuration?cachedThings=metadata#caching",children:"Valkey Caching"})," to cache Musicbrainz API calls for faster processing."]})}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n.h3,{id:"api-setup",children:"API Setup"}),"\n",(0,r.jsxs)(n.p,{children:["To avoid rate limiting, MusicBrainz requires API users to identify themself using a ",(0,r.jsx)(n.a,{href:"https://wiki.musicbrainz.org/MusicBrainz_API/Rate_Limiting#How_can_I_be_a_good_citizen_and_be_smart_about_using_the_Web_Service?",children:"User-Agent that contains an email or URL."})," You must set this in the ",(0,r.jsx)(n.code,{children:"data"})," for your ",(0,r.jsx)(n.a,{href:"http://localhost:3000/docs/configuration/transforms/#configuring-stages",children:"stage configuration"})," in your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n }\n ]\n}\n'})}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Additional Musicbrainz Servers"}),(0,r.jsx)(n.p,{children:"Other, or additional, Musicbrainz Servers/Mirrors can be added to the API configuration. If more than one server is defined then multi-scrobbler will round-robin load balance API calls."}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.code,{children:"url"})," to define the base URL of the Musicbrainz server to use. If ",(0,r.jsx)(n.code,{children:"url"})," is not defined multi-scrobbler assumes it is the primary Musicbrainz server, ",(0,r.jsx)(n.code,{children:"https://musicbrainz.org"}),"."]}),(0,r.jsx)(n.p,{children:"Example of multiple servers:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n // uses default Musicbrainz server https://musicbrainz.org\n },\n // additional server\n {\n "contact": "contact@mydomain.com",\n "url": "https://my.mb.mirror.domain.com"\n }\n ]\n },\n }\n ]\n}\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"stage-configuration",children:"Stage Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["All of the properties found in ",(0,r.jsx)(n.a,{href:"#matching-with-musicbrainz",children:(0,r.jsx)(n.strong,{children:"Matching with Musicbrainz"})})," section are configured in ",(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," as ",(0,r.jsx)(n.code,{children:"defaults"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ],\n "defaults": {\n "releaseStatusPriority": ["official"],\n "releaseAllowEmpty": true\n }\n },\n }\n ]\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"rules-and-hooks",children:"Rules and Hooks"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://foxxmd.github.io/multi-scrobbler/configuration/transforms/#stage",children:"Add your Stage"})," to a Source or Client by specifying it in a ",(0,r.jsx)(n.a,{href:"/configuration/transforms/#hook",children:"Hook"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n]\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.jsx)(n.a,{href:"/configuration/transforms#stage-rules",children:(0,r.jsx)(n.strong,{children:"Stage Rule"})})," should be either a boolean, specifying if the transformed data should be used for this field, or a ",(0,r.jsxs)(n.a,{href:"/configuration/transforms#conditional-moditication",children:[(0,r.jsx)(n.code,{children:"when"})," condition"]}),":"]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n // ...\n "title": false, // will not apply any changes to Play title\n "artists": {\n "when": {/* ... */}, // will only apply changes to Play artists if "when" is satisfied\n /* ... */\n },\n "album": true // will always apply changes to Play album\n "meta": true // adds MusicBrainz MBIDs to scrobble data\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsxs)(n.admonition,{title:"Per Component Override",type:"tip",children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"defaults"})," you set in ",(0,r.jsx)(n.a,{href:"#stage-configuration",children:"Stage Configuration"})," ",(0,r.jsx)(n.a,{href:"/configuration/transforms/#overriding-configuration",children:"can be overriden/added to"})," (per property) in each Hook."]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "releaseStatusPriority": ["psuedo-release"], // override from defaults\n "searchOrder": ["freetext"] // add new property, combined with defaults\n }\n ]\n }\n }\n }\n]\n'})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"env-configuration",children:"ENV Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["The general configuration shown above can also be configured from a selection of ",(0,r.jsx)(n.em,{children:"presets"})," using ",(0,r.jsx)(n.a,{href:"/configuration?configType=env#configuration-types",children:"ENV Config"})," for individual Sources/Clients."]}),"\n",(0,r.jsxs)(n.p,{children:["You must ",(0,r.jsx)(n.strong,{children:"always"})," include the ",(0,r.jsx)(n.code,{children:"MB_CONTACT"})," ENV to ",(0,r.jsx)(n.a,{href:"#api-setup",children:"identify your application"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ini",children:"MB_CONTACT=contact@mydomain.com\n"})}),"\n",(0,r.jsxs)(n.p,{children:["To configure ",(0,r.jsx)(n.a,{href:"#stage-configuration",children:"stage defaults"})," use ",(0,r.jsx)(n.code,{children:"MB_PRESETS"})," with a comma-delimited list of presets you wish to apply. More than one preset can be applied, in which case they combine. You must choose at least one of the presets below:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"default"})," - Adds the default ",(0,r.jsx)(n.a,{href:"#search-methods",children:(0,r.jsx)(n.code,{children:"searchOrder"})})," ",(0,r.jsx)(n.code,{children:"isrc"}),"+",(0,r.jsx)(n.code,{children:"basic"})," (same as using no presets that affect ",(0,r.jsx)(n.code,{children:"searchOrder"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"id"})," - Adds ",(0,r.jsx)(n.a,{href:"#search-methods",children:(0,r.jsx)(n.code,{children:"searchOrder"})})," methods that priorites searching by ID: ",(0,r.jsx)(n.code,{children:"isrc"})," + ",(0,r.jsx)(n.code,{children:"mbidrecording"})," + ",(0,r.jsx)(n.code,{children:"basicOrIds"})," + ",(0,r.jsx)(n.code,{children:"basic"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"native"})," - Adds ",(0,r.jsx)(n.strong,{children:"Extracted Artists"})," (",(0,r.jsx)(n.code,{children:"artist"}),") in ",(0,r.jsx)(n.code,{children:"native"})," mode to ",(0,r.jsx)(n.a,{href:"#search-methods",children:(0,r.jsx)(n.code,{children:"searchOrder"})})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggressive"})," - Adds ",(0,r.jsx)(n.strong,{children:"Free Text Search"})," (",(0,r.jsx)(n.code,{children:"freetext"}),") to ",(0,r.jsx)(n.a,{href:"#search-methods",children:(0,r.jsx)(n.code,{children:"searchOrder"})})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fields"})," - Applies ",(0,r.jsx)(n.a,{href:"#field-scoring",children:"Field Scoring"})," to match sorting so match text is baised towards similarity to original scrobble"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"sensible"})," - Applies the ",(0,r.jsx)(n.a,{href:"#sensible-default",children:"Sensible Default"})," configuration for ",(0,r.jsx)(n.a,{href:"#sorting-releases",children:"sorting releases"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Finally, use ENV ",(0,r.jsx)(n.code,{children:"*_TRANSFORMS=musicbrainz"})," on each Source/Client you wish to apply this stage to. This applies the stage in the ",(0,r.jsxs)(n.a,{href:"/configuration/transforms#lifecycle-hooks",children:[(0,r.jsx)(n.code,{children:"preTransform"})," Hook"]})," with all ",(0,r.jsx)(n.a,{href:"#rules",children:"Rules"})," enabled."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"*"})," stands for the prefix used for each Source/Client's ENV keys. Refer to the individual Source/Client Configuration sections to find this. Example:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["All ",(0,r.jsx)(n.a,{href:"http://localhost:3000/docs/configuration/sources/subsonic/",children:"Subsonic Source"})," ENVs look like ",(0,r.jsx)(n.code,{children:"SUBSONIC_USER=myuser"})," etc..."]}),"\n",(0,r.jsxs)(n.li,{children:["Use ",(0,r.jsx)(n.code,{children:"SUBSONIC_TRANSFORMS=musicbrainz"})]}),"\n"]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example Full Docker Deploy with ENV Configuration"}),(0,r.jsxs)(n.p,{children:["Using ",(0,r.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"Jellyfin + Maloja"})," example from Quickstart:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n // highlight-start\n - MB_CONTACT=contact@mydomain.com\n # searches with sensible release sorting with the searchOrder\n # isrc => basic => artist (native mode)\n - MB_PRESETS=default,sensible,native\n // highlight-end\n - JELLYFIN_URL=192.168.0.110:8096\n - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b\n - JELLYFIN_USER=MyUser\n // highlight-start\n # applies musicbrainz Stage to preTransform of Jellyfin source\n - JELLYFIN_TRANSFORMS=musicbrainz\n // highlight-end\n\n # maloja receives enhanced scrobble from Jellyfin\n - MALOJA_URL=http://192.168.0.100:42010\n - MALOJA_API_KEY=myApiKey\n\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})})]}),"\n",(0,r.jsx)(n.h2,{id:"matching-with-musicbrainz",children:"Matching with Musicbrainz"}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"All properties found in this section are optional."})}),(0,r.jsxs)(n.p,{children:["If you just want a sensible default for configuraion refer to the ",(0,r.jsx)(n.a,{href:"#best-practices",children:"Best Practices"})," section."]})]}),"\n",(0,r.jsx)(n.p,{children:"Matching your Scrobble's Play data with a result from Musicbrainz is comprised of two steps:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#searching",children:(0,r.jsx)(n.strong,{children:"Searching"})})," Musicbrainz using parts of your Scrobble as queries"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#refining",children:(0,r.jsx)(n.strong,{children:"Refining"})})," matched results to select the desired/allowed match"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Both steps have separate configuration."}),"\n",(0,r.jsx)(n.h3,{id:"searching",children:"Searching"}),"\n",(0,r.jsx)(n.h4,{id:"should-ms-search",children:"Should MS Search?"}),"\n",(0,r.jsx)(n.p,{children:"Before MS begins a search it checks if your Scrobble data already contains:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/MusicBrainz_Identifier",children:"MBIDs"})," for ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Artist",children:"artists"}),", ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Release",children:"album"}),", and specific ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Recording",children:"track/recording"})]}),"\n",(0,r.jsx)(n.li,{children:"and duration"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["If it already has all required data types then the entire Musicbrainz Stage ",(0,r.jsxs)(n.a,{href:"/configuration/transforms/#flow-control",children:["is ",(0,r.jsx)(n.strong,{children:"skipped"}),"."]})," If any are missing then a search is performed."]}),"\n",(0,r.jsx)(n.p,{children:"Define which data types are required using:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"searchWhenMissing"})," (defaults to all) - A list containing any of: ",(0,r.jsx)(n.code,{children:"artists"})," ",(0,r.jsx)(n.code,{children:"title"})," ",(0,r.jsx)(n.code,{children:"album"})," ",(0,r.jsx)(n.code,{children:"duration"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"forceSearch"})," (default ",(0,r.jsx)(n.code,{children:"false"}),") - Force searching even if all required data is present"]}),"\n"]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // only search if MBIDs for artists or album is missing\n "searchWithMissing": ["artists", "album"]\n\n // uncomment to make the stage always search, even if above data is present\n //forceSearch: true\n }\n'})})]}),"\n",(0,r.jsxs)(n.p,{children:["If required data is missing then the next step is making ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/MusicBrainz_API/Search",children:"search queries to the Musicbrainz database"})," to try to get potential candidates."]}),"\n",(0,r.jsx)(n.h4,{id:"search-methods",children:"Search Methods"}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler can search for Musicbrainz matches using ",(0,r.jsx)(n.strong,{children:"multiple"})," methods. You control:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"the search methods that are used"}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"the order"})," in which search methods are executed"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"All search methods will be run in the order they were defined until one method returns at least one match."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"The methods you choose, and the order they run in, can drastically change how many API calls are needed to get a match, and what types of matches are returned."})," See ",(0,r.jsx)(n.a,{href:"#search-considerations",children:(0,r.jsx)(n.strong,{children:"Search Considerations"})})," for guidance on how to decide on methods based on Source."]}),"\n",(0,r.jsxs)(n.p,{children:["To set search methods and their order use the ",(0,r.jsx)(n.code,{children:"searchOrder"})," option in your ",(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // only searches using these methods, in the order they are listed here\n "searchOrder": ["isrc", "mbidrecording", "basic","freetext"]\n }\n'})}),"\n",(0,r.jsx)(n.admonition,{title:"Default Search Methods",type:"tip",children:(0,r.jsxs)(n.p,{children:["If ",(0,r.jsx)(n.code,{children:"searchOrder"})," is undefined then Multi-scrobbler will default to using ",(0,r.jsx)(n.code,{children:"isrc"})," then ",(0,r.jsx)(n.code,{children:"basic"})," method."]})}),"\n",(0,r.jsx)("h4",{children:"Available Methods"}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["ISRC (",(0,r.jsx)(n.code,{children:"isrc"}),")"]}),(0,r.jsxs)(n.p,{children:["If your Scrobble data contains an ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/ISRC",children:"ISRC"})," (usually from Spotify) then Multi-scrobbler can search using this ID, only."]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will only search using isrc\n "searchOrder": ["isrc"]\n }\n'})})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Track MBID (",(0,r.jsx)(n.code,{children:"mbidrecording"}),")"]}),(0,r.jsxs)(n.p,{children:["If your Scrobble data contains an ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Recording",children:"Track (Recording) MBID"})," then Multi-scrobbler can search using this MBID, only."]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will only search using recording mbid\n "searchOrder": ["mbidrecording"]\n }\n'})})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Album, Artist, and Title Fields (",(0,r.jsx)(n.code,{children:"basic"}),")"]}),(0,r.jsx)(n.p,{children:"Will search Musicbrainz using any/all available text fields from your scrobble: Album, Artists(s), and Title. Does not leverage any existing MBIDs."}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will only search using album, artist(s), and title\n "searchOrder": ["basic"]\n }\n'})})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Album/Artist/Title OR MBIDs (",(0,r.jsx)(n.code,{children:"basicOrIds"}),")"]}),(0,r.jsxs)(n.p,{children:["This is the same as the above ",(0,r.jsx)(n.strong,{children:"Album, Artist, and Title Fields"})," search except that if the scrobble data contains any corresponding MBIDs it will use those instead of the plain text field."]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will only search using album, artist(s), and title\n "searchOrder": ["basicOrIds"]\n }\n'})}),(0,r.jsx)(n.p,{children:"Example:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup"]\n "albumMbid": "c9f91cdc-984e-4303-9a51-4ac0dfa2348f",\n "album": "My Cool Album"\n}\n'})}),(0,r.jsxs)(n.p,{children:["Multi-scrobbler will search Musicbrainz using ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"artists"}),", and ",(0,r.jsx)(n.code,{children:"albumMbid"})," but NOT ",(0,r.jsx)(n.code,{children:"album"}),"."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Album And Title Only (",(0,r.jsx)(n.code,{children:"album"}),")"]}),(0,r.jsxs)(n.p,{children:["If your Scrobble data contains a title, artist(s), and an album (all three fields) then Multi-scrobbler can search using only title and album by using ",(0,r.jsx)(n.code,{children:"album"})," for ",(0,r.jsx)(n.code,{children:"searchOrder"}),":"]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will only search using only title + album name\n "searchOrder": ["album"]\n }\n'})})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Extracted Artists (",(0,r.jsx)(n.code,{children:"artist"}),")"]}),(0,r.jsxs)(n.p,{children:["If your scrobble data contains only ",(0,r.jsx)(n.strong,{children:"one"})," artist string then Multi-scrobbler can attempt to extract multiple artists from your artist and track string."]}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.code,{children:"artist"})," with ",(0,r.jsx)(n.code,{children:"searchOrder"})," and optionally specify the extraction mode with ",(0,r.jsx)(n.code,{children:"searchArtistMethod"}),":"]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will only search using title/album + extracted artists\n "searchOrder": ["artist"],\n //searchArtistMethod: \'native\' // optional\n }\n'})}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"searchArtistMethod"})," can be set to ",(0,r.jsx)(n.strong,{children:"Native"})," or ",(0,r.jsx)(n.strong,{children:"Naive"})," mode:"]}),(0,r.jsxs)(t.default,{groupId:"searchArtistMethod",queryString:!0,children:[(0,r.jsxs)(o.default,{value:"native",label:"Native (Recommended)",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Native"})," (",(0,r.jsx)(n.code,{children:"native"}),") mode uses an aggressive configuration of the ",(0,r.jsx)(n.a,{href:"/configuration/transforms/native",children:"Native Stage"}),' to extract artists using common delimiters and common "joined" artist patterns from the artist and title string of your Scrobble data.']}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"If you already have a Native Stage configured you should use that instead, running it before the Musicbrainz stage."})}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Native Mode Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup & Punk Rock Factory, My Cool Band"]\n}\n'})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Extracts ",(0,r.jsx)(n.code,{children:"Bowling For Soup"})," ",(0,r.jsx)(n.code,{children:"Punk Rock Factory"})," ",(0,r.jsx)(n.code,{children:"My Cool Band"})," from artist string"]}),"\n",(0,r.jsxs)(n.li,{children:["Extracts ",(0,r.jsx)(n.code,{children:"Wheatus"})," from title string","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Removes ",(0,r.jsx)(n.code,{children:"(feat. Wheatus)"})," from title string because it found an artist there"]}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsx)(n.p,{children:"Resulting data used for Musicbrainz search:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility",\n "artists": ["Bowling For Soup", "Punk Rock Factory", "My Cool Band", "Wheatus"]\n}\n'})})]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will only search using title/album + native extracted artists\n "searchOrder": ["artist"],\n "searchArtistMethod": "native"\n }\n'})})]}),(0,r.jsxs)(o.default,{value:"naive",label:"Naive",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Naive"})," (",(0,r.jsx)(n.code,{children:"naive"}),") mode looks for the first found common delimiter in the artist string. If it finds one then it uses the preceding value as the only artist in the Musicbrainz search. It does not try to extract additional artists from the artist string, or extract anything from the title string."]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Naive Mode Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup, Punk Rock Factory & Wheatus"]\n}\n'})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Finds ",(0,r.jsx)(n.code,{children:"&"}),' as first common delimiter, extracts "Bowling For Soup"']}),"\n"]}),(0,r.jsx)(n.p,{children:"Resulting data used for Musicbrainz search:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup"]\n}\n'})})]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // will only search using title/album + naive extracted artists\n "searchOrder": ["artist"],\n "searchArtistMethod": "naive"\n }\n'})})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Free Text (",(0,r.jsx)(n.code,{children:"freetext"}),")"]}),(0,r.jsxs)(n.p,{children:["This will search Musicbrainz for ",(0,r.jsx)(n.strong,{children:"all"})," text of your Scrobble data artist/title/album, without constraint."]}),(0,r.jsxs)(n.admonition,{type:"warning",children:[(0,r.jsxs)(n.p,{children:["Free text search is ",(0,r.jsx)(n.strong,{children:"unconstrained"})," which means that Musicbrainz will match text in ",(0,r.jsx)(n.strong,{children:"any"})," part of a Recording (artist, release, or recording field), regardless of where it is found. This may lead to results that are unexpected and undesired."]}),(0,r.jsxs)(n.p,{children:["If you know your Source's Play data is well organized you ",(0,r.jsx)(n.strong,{children:"should not"})," enable this. Free Text search should only be used if:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"your music is not well organized or"}),"\n",(0,r.jsxs)(n.li,{children:["there may be many alternative titles/artists for the music you listen to (such as with ",(0,r.jsx)(n.a,{href:"https://wiki.musicbrainz.org/Release#Status",children:"psuedo-releases"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:["you can tolerate that matches may not be accurate for releases.","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Generally, if you keep ",(0,r.jsx)(n.a,{href:"#score",children:"score"})," high then matched releases should ",(0,r.jsx)(n.em,{children:"at least"}),' be the right artist or what you would expect within a reason, as a match. The release may not be the one you actually listened to but it would be "close enough".']}),"\n"]}),"\n"]}),"\n"]})]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," example:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // ...\n // will only search using free text search of all artist/album/title\n "searchOrder": ["freetext"],\n }\n'})})]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["If all defined search methods do not return any results then the stage is marked as ",(0,r.jsxs)(n.a,{href:"/configuration/transforms/#flow-control",children:[(0,r.jsx)(n.strong,{children:"failed"})," (",(0,r.jsx)(n.code,{children:"onFailure"}),") for ",(0,r.jsx)(n.strong,{children:"Flow Control"})]}),"."]})}),"\n",(0,r.jsx)(n.h3,{id:"refining",children:"Refining"}),"\n",(0,r.jsx)(n.h3,{id:"score",children:"Score"}),"\n",(0,r.jsxs)(n.p,{children:["Each match returned by MusicBrainz contains a numeric score representing how close it was to the search parameters. Set ",(0,r.jsx)(n.code,{children:"score"})," in configuration to set a minimum score that must be met by matches. Default is ",(0,r.jsx)(n.code,{children:"90"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n // ...\n "score": 90 // matches must score 90 or higher to be considered\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"filtering",children:"Filtering"}),"\n",(0,r.jsxs)(n.p,{children:["There are several attributes associated with the ",(0,r.jsx)(n.a,{href:"https://wiki.musicbrainz.org/Release",children:"Release"})," a ",(0,r.jsx)(n.a,{href:"https://wiki.musicbrainz.org/Recording",children:"Recording"})," (individual Track/song) belongs to that you may be interested in controlling. MS can use these attributes to filter what the final Recording selected to match against your Play data is."]}),"\n",(0,r.jsx)(n.p,{children:"An easy way to think about this:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Do you prefer Albums, Singles, or EPs?"}),"\n",(0,r.jsx)(n.li,{children:"Do you always want to use an official album release, or are bootleg or cancelled albums okay to use?"}),"\n",(0,r.jsx)(n.li,{children:"Should a track that belongs to a Compilation album be allowed to match?"}),"\n",(0,r.jsx)(n.li,{children:"What country do you prefer an album release to be from?"}),"\n"]}),"\n",(0,r.jsx)(n.h5,{id:"release-attributes",children:"Release Attributes"}),"\n",(0,r.jsxs)(n.p,{children:["These attributes (",(0,r.jsx)(n.code,{children:"attribute_name"})," in config) are:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.a,{href:"https://wiki.musicbrainz.org/Release#Status",children:["Release ",(0,r.jsx)(n.strong,{children:"Status"})]})," (",(0,r.jsx)(n.code,{children:"releaseStatus"}),") - Is this release/album/ep official, promotional, bootleg, etc..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.a,{href:"https://wiki.musicbrainz.org/Release_Group/Type#Primary_types",children:["Release Group ",(0,r.jsx)(n.strong,{children:"Primary Type"})]})," (",(0,r.jsx)(n.code,{children:"releaseGroupPrimaryType"}),") - Is this release an Album, Single, EP, etc..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.a,{href:"https://wiki.musicbrainz.org/Release_Group/Type#Secondary_types",children:["Release Group ",(0,r.jsx)(n.strong,{children:"Secondary Type"})]})," (",(0,r.jsx)(n.code,{children:"releaseGroupSecondaryType"}),") - Is this release a compilation, soundtrack, remix, etc..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.a,{href:"https://beta.musicbrainz.org/doc/Release/Country",children:["Release ",(0,r.jsx)(n.strong,{children:"Country"})]})," (",(0,r.jsx)(n.code,{children:"releaseCountry"}),") - What ISO2 country was this released in? US, GB, MX, etc...","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["MusicBrainz uses the special code ",(0,r.jsx)(n.code,{children:"XW"}),' to represent a "Worldwide" release AKA release not made specifically for a country']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Each of the above attributes can be used to ",(0,r.jsx)(n.strong,{children:"filter"})," matches using ",(0,r.jsx)(n.code,{children:"allow"})," (explicitly include) or ",(0,r.jsx)(n.code,{children:"deny"})," (exclude) terms. The correct property name for each is like so:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'[attribute_name]Allow = [...]\n[attribute_name]Deny\n\nEX to explicitly allow only release status "official"\n\n"releaseStatusAllow": ["official"]\n\nEX to exclude compilations\n\n"releaseGroupSecondaryTypeDeny": ["compilation"]\n'})}),"\n",(0,r.jsx)(n.h4,{id:"empty-releases",children:"Empty Releases"}),"\n",(0,r.jsx)(n.p,{children:"Sometimes a Recording may not have any associated Releases. This may be because there is not enough information about the Recording yet, or it was never included on an actual Release."}),"\n",(0,r.jsxs)(n.p,{children:["You may want to filter the majority of your matches by releases but allow matching a Recording that has no releases to begin with. To allow this set ",(0,r.jsx)(n.code,{children:"releaseAllowEmpty"})," to ",(0,r.jsx)(n.code,{children:"true"})," in configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // ...\n "releaseAllowEmpty": true // don\'t remove a match during filtering just because it has no releases\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"sorting",children:"Sorting"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"After"})," matches have been ",(0,r.jsx)(n.a,{href:"#filtering",children:"filtered"}),", the remaining matches ",(0,r.jsx)(n.em,{children:"and their releases"}),"* can be sorted. Matches/Releases with an attribute that does not match are ",(0,r.jsx)(n.strong,{children:"not"})," removed, but they are sorted lower than matches that do match."]}),"\n",(0,r.jsxs)(n.p,{children:["Sorting can be a good alternative to filtering: with filters there is a possibility your filters may eliminate all matches; if you want to ensure that ",(0,r.jsx)(n.strong,{children:"some"})," match will be used then sorting can ensure that the ",(0,r.jsx)(n.strong,{children:"best choice"})," out of those given will always be used, without accidentally ending up with ",(0,r.jsx)(n.strong,{children:"no choice"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Sorting can be used instead of filters, or in conjunction with filters, it's your choice."}),"\n",(0,r.jsx)(n.h4,{id:"sorting-releases",children:"Release Attributes"}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.jsx)(n.a,{href:"#release-attribute",children:"Release Attribute"})," has one additional property that can be used to ",(0,r.jsx)(n.strong,{children:"rank"})," releases based on the order of the values you give it. This is the ",(0,r.jsx)(n.code,{children:"priority"})," property."]}),"\n",(0,r.jsx)(n.p,{children:"In configuration:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'[attribute_name]Priority = [...]\n\nEX to prefer "official" releases over everything else\n\n"releaseStatusPriority": ["official"]\n\nEX to prefer albums, then singles, over everything else\n\n"releaseGroupPrimaryTypePriority": ["album", "single"]\n'})}),"\n",(0,r.jsx)(n.h4,{id:"field-scoring",children:"Field Scoring"}),"\n",(0,r.jsx)(n.p,{children:'Matches can additionally be sorted/ranked based on how similar their fields are to the original Scrobble. Use these properties for sorting when you want the final Musicbrainz match to be as closely matched to the original Scrobble, as opposed to what may be the most "correct" match based on the Musicbrainz score or suggested Release.'}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example Scenario"}),(0,r.jsxs)(n.p,{children:["You scrobble ",(0,r.jsx)(n.a,{href:"https://open.spotify.com/track/21trRQA61afzljSK9V0SHX",children:"this track from spotify"}),", which has an English title, Album name, and Artist name."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{ \n "track": "Price",\n "artists": ["ATLUS Sound Team"],\n "album": "PERSONA5 ORIGINAL SOUNDTRACK"\n}\n'})}),(0,r.jsxs)(n.p,{children:["However, the ",(0,r.jsx)(n.a,{href:"https://beta.musicbrainz.org/search?query=isrc%3AJPK651601515&type=recording&limit=25&method=advanced",children:"Recording found by Musicbrainz"})," has multiple Releases (albums). The first suggested release is a ",(0,r.jsx)(n.em,{children:"related"})," Album with similar name (",(0,r.jsx)(n.code,{children:"Persona 25th Anniversary Deluxe Vinyl Box Set"}),") but it's not the same as your album. Additionally, the artists for this album are in Japanese, rather than English."]}),(0,r.jsxs)(n.p,{children:["You have used ",(0,r.jsx)(n.code,{children:"releaseStatusPriority"})," to prioritize ",(0,r.jsx)(n.code,{children:"psuedo-release"})," which does work but there are still multiple releases chosen, and some are non-English (",(0,r.jsx)(n.code,{children:"\u300E\u30DA\u30EB\u30BD\u30CA5\u300F\u30AA\u30EA\u30B8\u30CA\u30EB\u30FB\u30B5\u30A6\u30F3\u30C9\u30C8\u30E9\u30C3\u30AF"}),")."]}),(0,r.jsxs)(n.p,{children:["Using ",(0,r.jsx)(n.code,{children:'"albumWeight": 0.4'})," and ",(0,r.jsx)(n.code,{children:'"artistWeight": 0.3'})," ensures that the releases that have an album name, and artist names, more similar to your original scrobble are ranked higher. Resulting in ",(0,r.jsxs)(n.a,{href:"https://beta.musicbrainz.org/release/82de33b1-1cd6-4236-b116-561d0ecc8acf",children:["the correct Release (",(0,r.jsx)(n.code,{children:"PERSONA5 ORIGINAL SOUNDTRACK"}),")"]})," being chosen as the final match."]})]}),"\n",(0,r.jsxs)(n.p,{children:["Add one or more of these weight properties to your ",(0,r.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," to enable Field Scoring:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'// ...\n"defaults": {\n // ...\n // enables album text similiarity scoring\n "albumWeight": 0.33,\n // enables title text similiarity scoring\n "titleWeight": 0.33,\n // enables artist text similiarity scoring\n "artistWeight": 0.33\n }\n'})}),"\n",(0,r.jsxs)(n.p,{children:["While not enforced, it's a good idea to keep these weights under ",(0,r.jsx)(n.code,{children:"1"}),". And if using more than one weight, they should be add up to ",(0,r.jsx)(n.code,{children:"1"}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"How Scoring is Combined"}),(0,r.jsxs)(n.p,{children:["The score similarity from ",(0,r.jsx)(n.code,{children:"albumWeight"})," will be added to the score accumulated by ",(0,r.jsx)(n.a,{href:"#sorting-releases",children:"Release Attributes"})," to affect the final ranking of each Release for a Match/Recording."]}),(0,r.jsx)(n.p,{children:"In the final sorting of Recordings, title score + artist score is combined with the top ranked release album score. The top ranked score is then used to choose the matched Recording."})]}),"\n",(0,r.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,r.jsx)(n.h3,{id:"sensible-default",children:"Sensible Default"}),"\n",(0,r.jsxs)(n.p,{children:["Generally, the Musicbrainz Stage can be used without any of the ",(0,r.jsx)(n.a,{href:"#configuration",children:"optional configuration"})," and you should still see good results from matches. The top ",(0,r.jsx)(n.a,{href:"#score",children:"scored"})," match is, anecdotally, good enough for correcting and filling in surface-level play data like Title and Artist names."]}),"\n",(0,r.jsx)(n.p,{children:"For a more opinionated match that will mirror what you would expect from data from large music services:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n // use official release over anything else\n "releaseStatusPriority": ["official"],\n // prefer album, then single, then ep\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n // prefer worldwide release\n "releaseCountryPriority": ["XW"]\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Consider adding ",(0,r.jsxs)(n.a,{href:"#search-methods",children:["Artist Extraction (",(0,r.jsx)(n.code,{children:"artist"}),")"]})," in ",(0,r.jsx)(n.strong,{children:"Native Mode"})," if any of your Sources do not support multiple artists or your music collection is not tagged well."]}),"\n",(0,r.jsx)(s,{children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n // use official release over anything else\n "releaseStatusPriority": ["official"],\n // prefer album, then single, then ep\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n // prefer worldwide release\n "releaseCountryPriority": ["XW"],\n // search using extracted artist as last search attempt\n "searchOrder": ["isrc", "basic", "artist"],\n "searchArtistMethod": "native"\n}\n'})})}),"\n",(0,r.jsx)(n.h3,{id:"search-considerations",children:"Search Considerations"}),"\n",(0,r.jsxs)(n.p,{children:["How complete, and accurate, your scrobble data is from a certain Source should dictate what ",(0,r.jsx)(n.a,{href:"#search-methods",children:"Search Methods"})," you should use for matching."]}),"\n",(0,r.jsxs)(n.p,{children:["Musicbrainz agressively normalizes ",(0,r.jsx)(n.strong,{children:"artist, album, and title"})," fields in its database which means that if your Scrobble data contains major innaccuracies or phrases fields in a non-normal way, it's possible Musicbrainz won't find any matches. This is a more common occurrence when trying to match Scrobble data from Sources that don't support multiple artist data, like ",(0,r.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," and ",(0,r.jsx)(n.a,{href:"/configuration/sources/lastfm",children:"Last.fm"}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Examples of Bad Data"}),(0,r.jsx)(n.p,{children:"Last.fm Scrobble returns an Artist in the title and combines two artists into one string:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup & Punk Rock Factory"]\n}\n'})}),(0,r.jsxs)(n.p,{children:["The corresponding ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/release/85bf284b-8b39-414e-8ad9-61f593072588",children:"Musicbrainz Recording"})," has all artists separated and no artist in the title:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility",\n "artists": ["Bowling For Soup", "Punk Rock Factory", "Wheatus"]\n}\n'})})]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"In general, you should prioritize methods that search by unique identifiers"})," (",(0,r.jsx)(n.code,{children:"isrc"})," ",(0,r.jsx)(n.code,{children:"mbidRecording"})," ",(0,r.jsx)(n.code,{children:"basicOrIds"}),") if you know your Sources may contain ",(0,r.jsx)(n.em,{children:"accurate"})," data for these. Such as: Spotify, Jellyfin, Plex, and Listenbrainz (Source)."]}),"\n",(0,r.jsx)(n.p,{children:"Use field-based methods if your Sources do not return IDs consistently (or at all). Add more field-based methods the more inaccurate your scrobble data may be, but be aware that more aggressive/broad searches may return less accurate results."}),"\n",(0,r.jsxs)(i,{type:"tip",summary:"Matching Scrobbles from Last.fm",children:[(0,r.jsx)(n.p,{children:"Last.fm is inconsistent when it comes to matching your scrobbles. It will accept (almost) any fields for track/title/album and aggressively attempt to match/correct these, regardless of your intentions."}),(0,r.jsxs)(n.p,{children:["Unless the client scrobbling to Last.fm is also sending an ",(0,r.jsx)(n.code,{children:"mbid"}),", it's likely your scrobble will not be ",(0,r.jsx)(n.strong,{children:"consistently"})," matched correctly and so the ",(0,r.jsx)(n.code,{children:"mbid"})," supplied by last.fm in its scrobble data will be wrong."]}),(0,r.jsxs)(n.p,{children:["Therefore, you should ",(0,r.jsx)(n.em,{children:"avoid"})," using ",(0,r.jsx)(n.code,{children:"mbidRecording"})," and ",(0,r.jsx)(n.code,{children:"basicOrIds"})," as the primary search methods (or understand the risks of using them). Instead, prefer to use field-based methods ",(0,r.jsx)(n.em,{children:"before"})," falling back to id-based methods."]})]}),"\n",(0,r.jsx)(n.h3,{id:"filter-considerations",children:"Filter Considerations"}),"\n",(0,r.jsx)(n.p,{children:"When using your own filters consider:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Prefer ",(0,r.jsx)(n.code,{children:"deny"})," over ",(0,r.jsx)(n.code,{children:"allow"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Releases come in all kinds of formats. Since ",(0,r.jsx)(n.code,{children:"allow"})," is explicit you may filter out your desired match without realizing it (correct data except for release type). Or the Musicbrainz data for a higher scored match may be appropriate but you did not include it, exhaustively."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Prefer ",(0,r.jsx)(n.a,{href:"#sorting",children:"Sorting"})," over ",(0,r.jsx)(n.a,{href:"#filtering",children:"Filtering"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Sorting does not eliminate any matches. It is, generally, better to get ",(0,r.jsx)(n.strong,{children:"some"})," match than it is to have your Play data completely uncorrected because filtering eliminated all matches"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"using-partial-match",children:"Using Partial Match"}),"\n",(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.a,{href:"#rules",children:"Rules"})," to apply MusicBrainz match data selectively."]}),"\n",(0,r.jsxs)(n.p,{children:["If you know that your music collection is well organized and you do not want to change the artists/title/album etc... sent to a ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Client"}),", you can still benefit from matches by only applying MBIDs using ",(0,r.jsx)(n.code,{children:"meta"})," so that any Client that supports Musicbrainz data (",(0,r.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito"}),", ",(0,r.jsx)(n.a,{href:"/configuration/clients/tealfm",children:"Tealfm"}),", ",(0,r.jsx)(n.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz"}),", ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky",children:"Rocksky"}),") can still get that data."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "title": false,\n "artists": false,\n "album": false,\n "albumArtists": false,\n "meta": true\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsx)(n.p,{children:"If"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Musicbrainz is not returning matches"}),"\n",(0,r.jsx)(n.li,{children:"Multi-scrobbler is using the wrong match"}),"\n",(0,r.jsx)(n.li,{children:"or the resulting enhanced Scrobble is not what you expected"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Enable logging by turning on ",(0,r.jsx)(n.a,{href:"/configuration#debug-mode",children:(0,r.jsx)(n.strong,{children:"Debug Mode"})})," to help diagnose any issues with the Musicbrainz API and Scrobble enhancement. ",(0,r.jsx)(n.strong,{children:"Before creating an issue"})," please enable logging and include any logs with your issue as this is needed to debug."]}),"\n",(0,r.jsxs)(n.p,{children:["If you have multiple Modification Stages and need to see the diff for your Play between each Stage, enable ",(0,r.jsx)(n.code,{children:'"log": "all"'})," in the individual ",(0,r.jsx)(n.a,{href:"#rules-and-hooks",children:"Modification Stage"}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n // highlight-start\n "log": "all",\n // highlight-end\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,r.jsx)(n.h3,{id:"minimal",children:"Minimal"}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"sensible-default-1",children:"Sensible Default"}),"\n",(0,r.jsxs)(n.p,{children:["Using the config shown in ",(0,r.jsx)(n.a,{href:"#sensible-default",children:"Sensible Default"})," with File/AIO config, instead of ",(0,r.jsx)(n.a,{href:"#env-configuration",children:"ENV Config"}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n "defaults": {\n "releaseStatusPriority": ["official"],\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n "releaseCountryPriority": ["XW"],\n "searchArtistMethod": "native"\n "searchOrder": ["isrc", "basic", "artist"]\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="subsonic.json"',children:'[\n { \n "name": "MySubsonic",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"add-metadata-only-no-scrobble-modification",children:"Add Metadata Only (No Scrobble Modification)"}),"\n",(0,r.jsxs)(n.p,{children:["If you do not want your scrobble data to be modified (artists/album/title) but still want to benefit from associating the scrobble with a Musicbrainz match (for Scrobble ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Clients"})," like ",(0,r.jsx)(n.a,{href:"/configuration/clients/tealfm",children:"Tealfm"}),", ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky",children:"Rocksky"}),", and ",(0,r.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito"}),"), then use ",(0,r.jsx)(n.a,{href:"#using-partial-match",children:"Partial Match"})," rules to specify only ",(0,r.jsx)(n.code,{children:"meta"})," to be updated."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n "defaults": {\n // maybe something like Sensible Default?\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/clients/jellyfin",children:"Jellyfin"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="jellyfin.json"',children:'[\n { \n "name": "MyJellyfin",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "title": false,\n "artists": false,\n "album": false,\n "albumArtists": false,\n "meta": true // only update scrobble metadata with MBIDs\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"use-native-stage-if-no-musicbrainz-matches",children:"Use Native Stage if no Musicbrainz Matches"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Musicbrainz Stage configured with","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#sensible-default",children:"Sensible Defaults"})}),"\n",(0,r.jsxs)(n.li,{children:["Fallback search with ",(0,r.jsx)(n.a,{href:"#search-methods",children:"Artist Extraction"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/configuration/transforms/native/#default-stage",children:"Default Native Stage"})}),"\n",(0,r.jsxs)(n.li,{children:["Uses ",(0,r.jsx)(n.a,{href:"/configurations/transforms#flow-control",children:"Flow Control"})," to run Native only if there are no Musicbrainz matches"]}),"\n"]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Your ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ]\n },\n "defaults": {\n "releaseStatusPriority": ["official"],\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n "releaseCountryPriority": ["XW"],\n "searchArtistMethod": "native",\n "searchOrder": ["isrc","basic", "artist"]\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/clients/jellyfin",children:"Jellyfin"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="jellyfin.json"',children:'[\n { \n "name": "MyJellyfin",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n // if musicbrainz is successful then do NOT run native,\n // only run native if musicbrainz fails to find a match (onFailure)\n "type": "musicbrainz",\n "name": "MyMB"\n "onSuccess": "stop",\n "onFailure": "continue"\n },\n {\n "type": "native"\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"override-stage-configuration-example",children:"Different Search Methods Based on Source (Last.fm and Spotify)"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"#search-considerations",children:"Last.fm has unreliable MBIDs"})," and Spotify provides an ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/ISRC",children:"ISRC"})," and consistent formatting."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For Spotify, we want to rely on ID ",(0,r.jsx)(n.a,{href:"#search-methods",children:"searches"})," and matches that are ",(0,r.jsx)(n.a,{href:"#field-scoring",children:"close to original scrobble text"})]}),"\n",(0,r.jsx)(n.li,{children:"For Last.fm, we want to use only text searches and take whatever correction is given to us"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.a,{href:"#rules-and-hooks",children:(0,r.jsx)(n.strong,{children:"Per Component Overrides"})})," with the default (or ",(0,r.jsx)(n.a,{href:"#sensible-default",children:"sensible"}),") ",(0,r.jsx)(n.a,{href:"#stage-configuration",children:"Stage Configuration"})," to specify different search behavior for each Source."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.p,{children:"Stage Configuration"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "data": {\n "apis": [\n {\n "contact": "contact@mydomain.com"\n }\n ],\n "defaults": {} // maybe use sensible?\n },\n }\n ]\n}\n'})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json"',children:'[\n { \n "name": "MyLFM",\n "configureAs": "source"\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "searchArtistMethod": "native"\n // does not use any ID searches\n // fallback to more aggressive/broad searches\n "searchOrder": ["basic", "artist", "freetext"]\n }\n ]\n }\n }\n }\n]\n'})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",metastring:'title="spotify.json"',children:'[\n { \n "name": "MySpotify",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n // use ISRC as first search\n "searchOrder": ["isrc", "basic"]\n // bias matches towards similarity to original data\n "albumWeight": 0.33,\n "titleWeight": 0.33,\n "artistWeight": 0.33\n }\n ]\n }\n }\n }\n]\n'})})]})]})}function m(e={}){let{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}function f(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]);
+1
assets/js/e82a470f.c703e7ea.js
··· 1 + "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["5757"],{30341:function(e,s,n){n.d(s,{ZP:()=>l,d$:()=>r});var t=n(85893),o=n(50065),i=n(11753);let r=[];function a(e){let s={a:"a",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.a,{href:"https://docs.bsky.app/docs/advanced-guides/atproto",children:"AT Protocol"})," is a standard to allow different applications to share and interpret your social data."]}),"\n",(0,t.jsxs)(s.p,{children:["Your data is stored in a personal ",(0,t.jsx)(s.a,{href:"https://atproto.com/guides/data-repos",children:"repository"})," in a ",(0,t.jsx)(s.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),", which is data-type agnostic (it's just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc..."]}),"\n",(0,t.jsxs)(s.p,{children:["Even though the application and the PDS/repository are independent, all of this is done for you automatically when you create a ",(0,t.jsx)(s.a,{href:"https://bsky.social/about",children:"Bluesky"})," account."]}),"\n",(0,t.jsx)(s.p,{children:"So..."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:['multi-scrobbler "scrobbles" your plays to your repository',"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["in a JSON data structure which includes ",(0,t.jsxs)(s.a,{href:"https://atproto.com/specs/lexicon",children:[e.name,"'s data type and structure"]})]}),"\n",(0,t.jsxs)(s.li,{children:["at a ",(0,t.jsxs)(s.a,{href:"https://atproto.com/guides/glossary#collection",children:["known location for ",e.name,"'s data"]})," (",(0,t.jsx)(i.Z,{children:e.lexicon}),"), in a list that is appended to as you continue to scrobble"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["when accessing ",e.name,", or another application that knows how to read it, your data is pulled from the repository to render the app"]}),"\n"]})]})}function l(e={}){let{wrapper:s}={...(0,o.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},35418:function(e,s,n){n.r(s),n.d(s,{frontMatter:()=>l,default:()=>p,toc:()=>h,metadata:()=>t,assets:()=>d,contentTitle:()=>c});var t=JSON.parse('{"id":"configuration/clients/rocksky","title":"Rocksky","description":"To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)","source":"@site/docs/configuration/clients/rocksky.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/rocksky","permalink":"/multi-scrobbler/configuration/clients/rocksky","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/rocksky.mdx","tags":[],"version":"current","frontMatter":{"title":"Rocksky","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Maloja","permalink":"/multi-scrobbler/configuration/clients/maloja"},"next":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/clients/tealfm"}}'),o=n(85893),i=n(50065),r=n(30341),a=n(58919);let l={title:"Rocksky",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,d={},h=[...r.d$,{value:"Setup",id:"setup",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Handle",id:"handle",level:3}];function u(e){let s={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components},{Config:n,Details:t,DetailsAdmo:l}=s;return n||y("Config",!0),t||y("Details",!0),l||y("DetailsAdmo",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.admonition,{title:"Other Uses",type:"tip",children:(0,o.jsxs)(s.p,{children:["To monitor and re-scrobble activity ",(0,o.jsx)(s.strong,{children:"from"})," Rocksky create a ",(0,o.jsx)(s.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky (Source)"})]})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"https://rocksky.app/",children:(0,o.jsx)(s.strong,{children:"Rocksky"})})," is music tracking and discovery platform built on the AT Protocol (Bluesky)."]}),"\n",(0,o.jsxs)(t,{children:[(0,o.jsx)("summary",{children:"How does that work?"}),(0,o.jsx)(r.ZP,{name:"Rocksky",lexicon:"app.rocksky"})]}),"\n",(0,o.jsx)(l,{type:"warning",summary:"Your Data Is Public",children:(0,o.jsxs)(s.p,{children:["The default Bluesky PDS is ",(0,o.jsx)(s.strong,{children:"public"}),", meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy."]})}),"\n",(0,o.jsxs)(l,{type:"warning",summary:"No Scrobbling Guarantee",children:[(0,o.jsxs)(s.p,{children:["Rocksky ",(0,o.jsx)(s.strong,{children:"does not guarantee"})," that every scrobble you send will be persisted. Rocksky's design goal is to store scrobbles with ",(0,o.jsx)(s.strong,{children:"metdata-complete, 3rd party verifiable track information"})," so that it can be a metadata-rich discovery platform, rather than an exhaustive scrobble data source-of-truth."]}),(0,o.jsxs)(s.p,{children:["To do this it ",(0,o.jsx)(s.em,{children:"asynchronously"})," matches your scrobble data against Musicbrainz's and/or Spotify's catalogs, ",(0,o.jsx)(s.em,{children:"after the scrobble has been submitted."})," ",(0,o.jsx)(s.strong,{children:"If the scrobble does not end up matching then it is not persisted."})]}),(0,o.jsxs)(s.p,{children:["If you need your scrobbles to be 100% captured then you should scrobble to an ",(0,o.jsx)(s.em,{children:"additional"})," ",(0,o.jsx)(s.a,{href:"/configuration/clients",children:"Scrobble Client"}),"."]})]}),"\n",(0,o.jsx)(s.h2,{id:"setup",children:"Setup"}),"\n",(0,o.jsxs)(s.p,{children:["You will need a ",(0,o.jsx)(s.a,{href:"https://bsky.app/",children:"Bluesky"})," account to use Rocksky."]}),"\n",(0,o.jsxs)(s.admonition,{type:"note",children:[(0,o.jsx)(s.mdxAdmonitionTitle,{}),(0,o.jsxs)(s.p,{children:["Usage is adapted from ",(0,o.jsx)(s.a,{href:"https://docs.rocksky.app/migrating-to-rocksky-scrobble-api-957839m0",children:"Rocksky docs"})," on ",(0,o.jsx)(s.a,{href:"https://docs.rocksky.app",children:"docs.rocksky.app"})]})]}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["Navigate to ",(0,o.jsx)(s.a,{href:"https://rocksky.app/",children:"rocksky.app"})," and sign up/logn using your Bluesky account"]}),"\n",(0,o.jsxs)(s.li,{children:["Then, navigate to the ",(0,o.jsx)(s.a,{href:"https://rocksky.app/apikeys",children:"RockSky developer dashboard"})," and obtain an API Key"]}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsx)(s.h3,{id:"handle",children:"Handle"}),"\n",(0,o.jsxs)(s.p,{children:["The handle used with multi-scrobbler should be your ",(0,o.jsx)(s.strong,{children:"full"})," ATProto handle, including TLD."]}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["For regular Bluesky account this will be like: ",(0,o.jsx)(s.code,{children:"alice.bsky.social"})]}),"\n",(0,o.jsxs)(s.li,{children:["For Bluesky accounts that ",(0,o.jsx)(s.a,{href:"https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial",children:"use their website as their account"})," this is your domain: ",(0,o.jsx)(s.code,{children:"mydomain.com"})]}),"\n",(0,o.jsx)(s.li,{children:"For non-Bluesky users, you probably already know your handle"}),"\n"]}),"\n",(0,o.jsxs)(s.p,{children:["If you do not include a TLD then multi-scrobbler will automatically append ",(0,o.jsx)(s.code,{children:".bsky.social"})," to your handle value."]}),"\n",(0,o.jsx)(n,{config:"RockskyClientConfig",fileContent:a.Z,client:!0,name:"rocksky",children:(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,o.jsx)(s.th,{children:"Required?"}),(0,o.jsx)(s.th,{children:"Default"}),(0,o.jsx)(s.th,{children:"Description"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{style:{textAlign:"left"},children:"ROCKSKY_HANDLE"}),(0,o.jsx)(s.td,{children:"Yes"}),(0,o.jsx)(s.td,{}),(0,o.jsxs)(s.td,{children:["Your ",(0,o.jsx)(s.strong,{children:"full"})," ATProto handle. For Bluesky account this is like ",(0,o.jsx)(s.code,{children:"myUser.bsky.social"})]})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{style:{textAlign:"left"},children:"ROCKSKY_KEY"}),(0,o.jsx)(s.td,{children:"Yes"}),(0,o.jsx)(s.td,{}),(0,o.jsx)(s.td,{children:"API Key obtained from Rocksky developer dashboard"})]})]})]})})]})}function p(e={}){let{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}function y(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},11753:function(e,s,n){n.d(s,{Z:()=>o}),n(67294);var t=n(85893);function o(e){return(0,t.jsx)("code",{...e})}},58919:function(e,s,n){n.d(s,{Z:()=>t});let t='[\n {\n "name": "myRockskyClient",\n "configureAs": "client",\n "data": {\n "key": "7cdr86vis3mpq5b1pi01md0hkm7ykzzxjy81r",\n "handle": "alice.bsky.social"\n }\n },\n {\n "name": "myRockskySource",\n "configureAs": "source",\n "data": {\n "key": "e4xwktm7jxm607x8el1fcda30eu14dzb64h3j",\n "handle": "alice.bsky.social"\n }\n }\n]'}}]);
-1
assets/js/e82a470f.ed3e812a.js
··· 1 - "use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["5757"],{30341:function(e,n,t){t.d(n,{ZP:()=>l,d$:()=>r});var s=t(85893),o=t(50065),i=t(11753);let r=[];function a(e){let n={a:"a",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.a,{href:"https://docs.bsky.app/docs/advanced-guides/atproto",children:"AT Protocol"})," is a standard to allow different applications to share and interpret your social data."]}),"\n",(0,s.jsxs)(n.p,{children:["Your data is stored in a personal ",(0,s.jsx)(n.a,{href:"https://atproto.com/guides/data-repos",children:"repository"})," in a ",(0,s.jsx)(n.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),", which is data-type agnostic (it's just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc..."]}),"\n",(0,s.jsxs)(n.p,{children:["Even though the application and the PDS/repository are independent, all of this is done for you automatically when you create a ",(0,s.jsx)(n.a,{href:"https://bsky.social/about",children:"Bluesky"})," account."]}),"\n",(0,s.jsx)(n.p,{children:"So..."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['multi-scrobbler "scrobbles" your plays to your repository',"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["in a JSON data structure which includes ",(0,s.jsxs)(n.a,{href:"https://atproto.com/specs/lexicon",children:[e.name,"'s data type and structure"]})]}),"\n",(0,s.jsxs)(n.li,{children:["at a ",(0,s.jsxs)(n.a,{href:"https://atproto.com/guides/glossary#collection",children:["known location for ",e.name,"'s data"]})," (",(0,s.jsx)(i.Z,{children:e.lexicon}),"), in a list that is appended to as you continue to scrobble"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["when accessing ",e.name,", or another application that knows how to read it, your data is pulled from the repository to render the app"]}),"\n"]})]})}function l(e={}){let{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},35418:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>l,default:()=>p,toc:()=>h,metadata:()=>s,assets:()=>d,contentTitle:()=>c});var s=JSON.parse('{"id":"configuration/clients/rocksky","title":"Rocksky","description":"To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)","source":"@site/docs/configuration/clients/rocksky.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/rocksky","permalink":"/multi-scrobbler/configuration/clients/rocksky","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/rocksky.mdx","tags":[],"version":"current","frontMatter":{"title":"Rocksky","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Maloja","permalink":"/multi-scrobbler/configuration/clients/maloja"},"next":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/clients/tealfm"}}'),o=t(85893),i=t(50065),r=t(30341),a=t(58919);let l={title:"Rocksky",toc_min_heading_level:2,toc_max_heading_level:5},c=void 0,d={},h=[...r.d$,{value:"Setup",id:"setup",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Handle",id:"handle",level:3}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components},{Config:t,Details:s}=n;return t||y("Config",!0),s||y("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,o.jsxs)(n.p,{children:["To monitor and re-scrobble activity ",(0,o.jsx)(n.strong,{children:"from"})," Rocksky create a ",(0,o.jsx)(n.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky (Source)"})]})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://rocksky.app/",children:(0,o.jsx)(n.strong,{children:"Rocksky"})})," is music tracking and discovery platform built on the AT Protocol (Bluesky)."]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"How does that work?"}),(0,o.jsx)(r.ZP,{name:"Rocksky",lexicon:"app.rocksky"})]}),"\n",(0,o.jsx)(n.admonition,{title:"Public Data",type:"warning",children:(0,o.jsxs)(n.p,{children:["The default Bluesky PDS is ",(0,o.jsx)(n.strong,{children:"public"}),", meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy."]})}),"\n",(0,o.jsxs)(n.admonition,{title:"No Scrobbling Guarantee",type:"warning",children:[(0,o.jsxs)(n.p,{children:["Rocksky ",(0,o.jsx)(n.strong,{children:"does not guarantee"})," that every scrobble you send will be persisted. Rocksky's design goal is to store scrobbles with ",(0,o.jsx)(n.strong,{children:"metdata-complete, 3rd party verifiable track information"})," so that it can be a metadata-rich discovery platform, rather than an exhaustive scrobble data source-of-truth."]}),(0,o.jsxs)(n.p,{children:["To do this it ",(0,o.jsx)(n.em,{children:"asynchronously"})," matches your scrobble data against Musicbrainz's and/or Spotify's catalogs, ",(0,o.jsx)(n.em,{children:"after the scrobble has been submitted."})," ",(0,o.jsx)(n.strong,{children:"If the scrobble does not end up matching then it is not persisted."})]}),(0,o.jsxs)(n.p,{children:["If you need your scrobbles to be 100% captured then you should scrobble to an ",(0,o.jsx)(n.em,{children:"additional"})," ",(0,o.jsx)(n.a,{href:"/configuration/clients",children:"Scrobble Client"}),"."]})]}),"\n",(0,o.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,o.jsxs)(n.p,{children:["You will need a ",(0,o.jsx)(n.a,{href:"https://bsky.app/",children:"Bluesky"})," account to use Rocksky."]}),"\n",(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsx)(n.mdxAdmonitionTitle,{}),(0,o.jsxs)(n.p,{children:["Usage is adapted from ",(0,o.jsx)(n.a,{href:"https://docs.rocksky.app/migrating-to-rocksky-scrobble-api-957839m0",children:"Rocksky docs"})," on ",(0,o.jsx)(n.a,{href:"https://docs.rocksky.app",children:"docs.rocksky.app"})]})]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Navigate to ",(0,o.jsx)(n.a,{href:"https://rocksky.app/",children:"rocksky.app"})," and sign up/logn using your Bluesky account"]}),"\n",(0,o.jsxs)(n.li,{children:["Then, navigate to the ",(0,o.jsx)(n.a,{href:"https://rocksky.app/apikeys",children:"RockSky developer dashboard"})," and obtain an API Key"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsx)(n.h3,{id:"handle",children:"Handle"}),"\n",(0,o.jsxs)(n.p,{children:["The handle used with multi-scrobbler should be your ",(0,o.jsx)(n.strong,{children:"full"})," ATProto handle, including TLD."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["For regular Bluesky account this will be like: ",(0,o.jsx)(n.code,{children:"alice.bsky.social"})]}),"\n",(0,o.jsxs)(n.li,{children:["For Bluesky accounts that ",(0,o.jsx)(n.a,{href:"https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial",children:"use their website as their account"})," this is your domain: ",(0,o.jsx)(n.code,{children:"mydomain.com"})]}),"\n",(0,o.jsx)(n.li,{children:"For non-Bluesky users, you probably already know your handle"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["If you do not include a TLD then multi-scrobbler will automatically append ",(0,o.jsx)(n.code,{children:".bsky.social"})," to your handle value."]}),"\n",(0,o.jsx)(t,{config:"RockskyClientConfig",fileContent:a.Z,client:!0,name:"rocksky",children:(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,o.jsx)(n.th,{children:"Required?"}),(0,o.jsx)(n.th,{children:"Default"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{style:{textAlign:"left"},children:"ROCKSKY_HANDLE"}),(0,o.jsx)(n.td,{children:"Yes"}),(0,o.jsx)(n.td,{}),(0,o.jsxs)(n.td,{children:["Your ",(0,o.jsx)(n.strong,{children:"full"})," ATProto handle. For Bluesky account this is like ",(0,o.jsx)(n.code,{children:"myUser.bsky.social"})]})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{style:{textAlign:"left"},children:"ROCKSKY_KEY"}),(0,o.jsx)(n.td,{children:"Yes"}),(0,o.jsx)(n.td,{}),(0,o.jsx)(n.td,{children:"API Key obtained from Rocksky developer dashboard"})]})]})]})})]})}function p(e={}){let{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}function y(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},11753:function(e,n,t){t.d(n,{Z:()=>o}),t(67294);var s=t(85893);function o(e){return(0,s.jsx)("code",{...e})}},58919:function(e,n,t){t.d(n,{Z:()=>s});let s='[\n {\n "name": "myRockskyClient",\n "configureAs": "client",\n "data": {\n "key": "7cdr86vis3mpq5b1pi01md0hkm7ykzzxjy81r",\n "handle": "alice.bsky.social"\n }\n },\n {\n "name": "myRockskySource",\n "configureAs": "source",\n "data": {\n "key": "e4xwktm7jxm607x8el1fcda30eu14dzb64h3j",\n "handle": "alice.bsky.social"\n }\n }\n]'}}]);
+3 -3
assets/js/main.5b56ee47.js assets/js/main.613e1b10.js
··· 1 - (self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6909"],{3601:function(e,t,n){"use strict";n.r(t)},17686:function(e,t,n){"use strict";n.r(t)},97642:function(e,t,n){"use strict";n.d(t,{AY:()=>i,H6:()=>o,Hk:()=>a,Kc:()=>d,gQ:()=>u,hG:()=>f,l9:()=>c,pQ:()=>p,pu:()=>s,t_:()=>l,vc:()=>r});let r=null,a=50,o=!1,i=!0,l=!0,s="right",u=void 0,c=!0,d=null,f=!1,p=!1},84016:function(e,t,n){"use strict";n.d(t,{Z:()=>f}),n(67294);var r=n(68356),a=n.n(r),o=n(37138);let i={"04d926a5":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8303"),n.e("8051")]).then(n.bind(n,68875)),"@site/docs/configuration/configuration.mdx",68875],"07b3b246":[()=>Promise.all([n.e("8016"),n.e("9116")]).then(n.bind(n,79035)),"@site/docs/development/dev-client.md",79035],"08938dd7":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("4477")]).then(n.bind(n,24963)),"@site/docs/configuration/sources/rocksky-source.mdx",24963],"094000d3":[()=>Promise.all([n.e("8016"),n.e("9325")]).then(n.bind(n,77994)),"@site/docs/configuration/transforms/transforms.mdx",77994],"0ce74438":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("1622"),n.e("3385")]).then(n.bind(n,46259)),"@site/src/pages/playground.tsx",46259],"138e0e15":[()=>n.e("151").then(n.t.bind(n,43765,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",43765],"14eb3368":[()=>Promise.all([n.e("6212"),n.e("1983")]).then(n.bind(n,29568)),"@theme/DocCategoryGeneratedIndexPage",29568],"153c3ceb":[()=>Promise.all([n.e("8016"),n.e("1355")]).then(n.bind(n,67430)),"@site/docs/development/flatpak.md",67430],0x11113f9:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8303"),n.e("9151"),n.e("7048")]).then(n.bind(n,49971)),"@theme/DocItem",49971],"1a4e3797":[()=>Promise.all([n.e("6212"),n.e("5230")]).then(n.bind(n,60441)),"@theme/SearchPage",60441],"1fb61236":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3174")]).then(n.bind(n,20941)),"@site/docs/configuration/sources/plex.mdx",20941],"202c4968":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8054")]).then(n.bind(n,7572)),"@site/docs/configuration/sources/koito-source.mdx",7572],"24a5b6e6":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("1165")]).then(n.bind(n,79501)),"@site/docs/configuration/sources/azuracast.mdx",79501],"294f31e2":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7544")]).then(n.bind(n,42536)),"@site/docs/configuration/sources/subsonic.mdx",42536],"2a24ad03":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3424")]).then(n.bind(n,91994)),"@site/docs/configuration/sources/sources.mdx",91994],"2ecbbad4":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3396")]).then(n.bind(n,64903)),"@site/docs/configuration/sources/youtube-music.mdx",64903],"30829cd8":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3517")]).then(n.bind(n,47985)),"@site/docs/configuration/sources/tealfm-source.mdx",47985],"33c4ed3f":[()=>Promise.all([n.e("8016"),n.e("1771")]).then(n.bind(n,42444)),"@site/docs/development/dev-source.md",42444],"3827a595":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("5291")]).then(n.bind(n,32134)),"@site/docs/configuration/sources/lastfm-endpoint.mdx",32134],"41cd626a":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("4854")]).then(n.bind(n,87896)),"@site/docs/configuration/sources/vlc.mdx",87896],"425b8dd3":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6364")]).then(n.bind(n,92769)),"@site/docs/configuration/sources/musikcube.mdx",92769],"44b2647e":[()=>Promise.all([n.e("8016"),n.e("3693")]).then(n.bind(n,39167)),"@site/docs/configuration/transforms/user.mdx",39167],"493c00ca":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("862")]).then(n.bind(n,78604)),"@site/docs/configuration/sources/yamaha-musiccast.mdx",78604],"498c77bd":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8670")]).then(n.bind(n,28689)),"@site/docs/configuration/sources/jriver.mdx",28689],"4edc808e":[()=>Promise.all([n.e("8016"),n.e("8005")]).then(n.bind(n,38741)),"@site/docs/index.mdx",38741],"4f1fc707":[()=>n.e("1970").then(n.t.bind(n,78699,19)),"@generated/docusaurus-plugin-content-docs/default/p/multi-scrobbler-category-updating-f22.json",78699],"4f7d60c5":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8569")]).then(n.bind(n,73292)),"@site/docs/configuration/clients/listenbrainz.mdx",73292],"5930ad03":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("9982")]).then(n.bind(n,82109)),"@site/docs/configuration/sources/mopidy.mdx",82109],"5a378701":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7246")]).then(n.bind(n,94023)),"@site/docs/configuration/sources/jellyfin.mdx",94023],"5e95c892":[()=>n.e("3432").then(n.bind(n,41431)),"@theme/DocsRoot",41431],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,75150)),"@generated/docusaurus.config",75150],0x3dd57b1:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("9621")]).then(n.bind(n,10164)),"@site/docs/configuration/clients/lastfm.mdx",10164],"72d905a9":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("1214")]).then(n.bind(n,49415)),"@site/docs/configuration/sources/google-cast.mdx",49415],0x476864f:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7631")]).then(n.bind(n,73699)),"@site/docs/quickstart.mdx",73699],"778b0fa6":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3989")]).then(n.bind(n,66833)),"@site/docs/configuration/sources/spotify.mdx",66833],"7d837a1d":[()=>n.e("3664").then(n.t.bind(n,67189,19)),"@generated/docusaurus-plugin-content-docs/default/p/multi-scrobbler-ae0.json",67189],"812e048c":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6751")]).then(n.bind(n,89589)),"@site/docs/configuration/clients/tealfm.mdx",89589],"8b39be93":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("4330")]).then(n.bind(n,67676)),"@site/docs/configuration/sources/icecast.mdx",67676],"91a78c9f":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8972")]).then(n.bind(n,53950)),"@site/docs/configuration/sources/mpd.mdx",53950],"925abbc7":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8934")]).then(n.bind(n,85166)),"@site/docs/configuration/sources/deezer.mdx",85166],"97d34c1a":[()=>n.e("6963").then(n.t.bind(n,8609,19)),"@generated/docusaurus-plugin-content-docs/default/p/multi-scrobbler-category-development-f99.json",8609],"9bcab3db":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6374")]).then(n.bind(n,19946)),"@site/docs/configuration/sources/lastfm-source.mdx",19946],"9fd2a592":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6658")]).then(n.bind(n,14396)),"@site/docs/configuration/sources/webscrobbler.mdx",14396],a16703cd:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("4328")]).then(n.bind(n,69918)),"@site/docs/configuration/clients/clients.mdx",69918],a7456010:[()=>n.e("7365").then(n.t.bind(n,62050,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",62050],a7bd4aaa:[()=>n.e("5211").then(n.bind(n,5264)),"@theme/DocVersionRoot",5264],a93ae359:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8881")]).then(n.bind(n,4042)),"@site/docs/configuration/sources/listenbrainz-endpoint.mdx",4042],a94703ab:[()=>Promise.all([n.e("6212"),n.e("9914")]).then(n.bind(n,81037)),"@theme/DocRoot",81037],aba21aa0:[()=>n.e("5112").then(n.t.bind(n,42418,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",42418],ad895e75:[()=>Promise.all([n.e("8016"),n.e("5658")]).then(n.bind(n,89666)),"@site/docs/FAQ.md",89666],af9480c3:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("974")]).then(n.bind(n,28561)),"@site/docs/configuration/sources/listenbrainz-source.mdx",28561],b46f7c12:[()=>Promise.all([n.e("8016"),n.e("4021")]).then(n.bind(n,15185)),"@site/docs/installation/service.md",15185],bf69edfb:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6286")]).then(n.bind(n,49639)),"@site/docs/installation/installation.mdx",49639],c2e935db:[()=>Promise.all([n.e("8016"),n.e("8378")]).then(n.bind(n,55797)),"@site/docs/development/dev-common.md",55797],cdda7d53:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6707")]).then(n.bind(n,34081)),"@site/docs/configuration/clients/maloja.mdx",34081],d3a18f08:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8656")]).then(n.bind(n,47802)),"@site/docs/updating/updating.mdx",47802],d53edd15:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7375")]).then(n.bind(n,35308)),"@site/docs/configuration/sources/kodi.mdx",35308],dfa6d5b1:[()=>Promise.all([n.e("8016"),n.e("7416")]).then(n.bind(n,42302)),"@site/docs/configuration/transforms/native.mdx",42302],e6ac3f64:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6922")]).then(n.bind(n,90481)),"@site/docs/configuration/transforms/musicbrainz.mdx",90481],e7a53bbd:[()=>Promise.all([n.e("8016"),n.e("7073")]).then(n.bind(n,19979)),"@site/docs/configuration/kitchensink.mdx",19979],e82a470f:[()=>Promise.all([n.e("8016"),n.e("5757")]).then(n.bind(n,35418)),"@site/docs/configuration/clients/rocksky.mdx",35418],f18fd350:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7556")]).then(n.bind(n,72170)),"@site/docs/configuration/clients/koito.mdx",72170],fa357871:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("9318")]).then(n.bind(n,16358)),"@site/docs/configuration/sources/maloja.mdx",16358],fee59995:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("2583")]).then(n.bind(n,25894)),"@site/docs/configuration/sources/mpris.mdx",25894]};var l=n(85893);function s({error:e,retry:t,pastDelay:n}){return e?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(e)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:t,children:"Retry"})})]}):n?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(65571),c=n(15340);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e("5648").then(n.bind(n,42342)),modules:["@theme/NotFound"],webpack:()=>[42342],render(e,t){let n=e.default;return(0,l.jsx)(c.z,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});let r=o[`${e}-${t}`],d={},f=[],p=[];return Object.entries((0,u.Z)(r)).forEach(([e,t])=>{let n=i[t];n&&(d[e]=n[0],f.push(n[1]),p.push(n[2]))}),a().Map({loading:s,loader:d,modules:f,webpack:()=>p,render(t,n){let a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach(([t,n])=>{let r=n.default;if(!r)throw Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);("object"==typeof r||"function"==typeof r)&&Object.keys(n).filter(e=>"default"!==e).forEach(e=>{r[e]=n[e]});let o=a,i=t.split(".");i.slice(0,-1).forEach(e=>{o=o[e]}),o[i[i.length-1]]=r});let o=a.__comp;delete a.__comp;let i=a.__context;delete a.__context;let s=a.__props;return delete a.__props,(0,l.jsx)(c.z,{value:i,children:(0,l.jsx)(o,{...a,...s,...n})})}})}let f=[{path:"/multi-scrobbler/playground/",component:d("/multi-scrobbler/playground/","18f"),exact:!0},{path:"/multi-scrobbler/search/",component:d("/multi-scrobbler/search/","71d"),exact:!0},{path:"/multi-scrobbler/",component:d("/multi-scrobbler/","474"),routes:[{path:"/multi-scrobbler/",component:d("/multi-scrobbler/","4fa"),routes:[{path:"/multi-scrobbler/",component:d("/multi-scrobbler/","b5e"),routes:[{path:"/multi-scrobbler/category/development/",component:d("/multi-scrobbler/category/development/","626"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/category/updating/",component:d("/multi-scrobbler/category/updating/","719"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/",component:d("/multi-scrobbler/configuration/","230"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/",component:d("/multi-scrobbler/configuration/clients/","099"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/koito/",component:d("/multi-scrobbler/configuration/clients/koito/","bcb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/lastfm/",component:d("/multi-scrobbler/configuration/clients/lastfm/","5c9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/listenbrainz/",component:d("/multi-scrobbler/configuration/clients/listenbrainz/","be2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/maloja/",component:d("/multi-scrobbler/configuration/clients/maloja/","dc4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/rocksky/",component:d("/multi-scrobbler/configuration/clients/rocksky/","489"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/tealfm/",component:d("/multi-scrobbler/configuration/clients/tealfm/","743"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/kitchensink/",component:d("/multi-scrobbler/configuration/kitchensink/","7d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/",component:d("/multi-scrobbler/configuration/sources/","479"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/azuracast/",component:d("/multi-scrobbler/configuration/sources/azuracast/","434"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/deezer/",component:d("/multi-scrobbler/configuration/sources/deezer/","d7a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/google-cast/",component:d("/multi-scrobbler/configuration/sources/google-cast/","434"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/icecast/",component:d("/multi-scrobbler/configuration/sources/icecast/","dfe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/jellyfin/",component:d("/multi-scrobbler/configuration/sources/jellyfin/","2fe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/jriver/",component:d("/multi-scrobbler/configuration/sources/jriver/","a36"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/kodi/",component:d("/multi-scrobbler/configuration/sources/kodi/","ab6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/koito-source/",component:d("/multi-scrobbler/configuration/sources/koito-source/","d25"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/lastfm-endpoint/",component:d("/multi-scrobbler/configuration/sources/lastfm-endpoint/","d0b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/lastfm-source/",component:d("/multi-scrobbler/configuration/sources/lastfm-source/","f93"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/",component:d("/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","b80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/listenbrainz-source/",component:d("/multi-scrobbler/configuration/sources/listenbrainz-source/","8ff"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/maloja/",component:d("/multi-scrobbler/configuration/sources/maloja/","ed2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/mopidy/",component:d("/multi-scrobbler/configuration/sources/mopidy/","b30"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/mpd/",component:d("/multi-scrobbler/configuration/sources/mpd/","e96"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/mpris/",component:d("/multi-scrobbler/configuration/sources/mpris/","751"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/musikcube/",component:d("/multi-scrobbler/configuration/sources/musikcube/","515"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/plex/",component:d("/multi-scrobbler/configuration/sources/plex/","468"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/rocksky-source/",component:d("/multi-scrobbler/configuration/sources/rocksky-source/","c8d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/spotify/",component:d("/multi-scrobbler/configuration/sources/spotify/","0b5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/subsonic/",component:d("/multi-scrobbler/configuration/sources/subsonic/","c34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/tealfm-source/",component:d("/multi-scrobbler/configuration/sources/tealfm-source/","912"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/vlc/",component:d("/multi-scrobbler/configuration/sources/vlc/","918"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/webscrobbler/",component:d("/multi-scrobbler/configuration/sources/webscrobbler/","3e7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/yamaha-musiccast/",component:d("/multi-scrobbler/configuration/sources/yamaha-musiccast/","5e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/youtube-music/",component:d("/multi-scrobbler/configuration/sources/youtube-music/","e7a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/transforms/",component:d("/multi-scrobbler/configuration/transforms/","5d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/transforms/musicbrainz/",component:d("/multi-scrobbler/configuration/transforms/musicbrainz/","7d6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/transforms/native/",component:d("/multi-scrobbler/configuration/transforms/native/","57a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/transforms/user/",component:d("/multi-scrobbler/configuration/transforms/user/","9c5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/development/dev-client/",component:d("/multi-scrobbler/development/dev-client/","d6f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/development/dev-common/",component:d("/multi-scrobbler/development/dev-common/","878"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/development/dev-source/",component:d("/multi-scrobbler/development/dev-source/","98f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/development/flatpak/",component:d("/multi-scrobbler/development/flatpak/","b8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/FAQ/",component:d("/multi-scrobbler/FAQ/","07c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/installation/",component:d("/multi-scrobbler/installation/","371"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/installation/service/",component:d("/multi-scrobbler/installation/service/","97c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/quickstart/",component:d("/multi-scrobbler/quickstart/","cfc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/updating/",component:d("/multi-scrobbler/updating/","065"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/",component:d("/multi-scrobbler/","e36"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"*",component:d("*")}]},34639:function(e,t,n){"use strict";n.d(t,{_:()=>o,t:()=>i});var r=n(67294),a=n(85893);let o=r.createContext(!1);function i({children:e}){let[t,n]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{n(!0)},[]),(0,a.jsx)(o.Provider,{value:t,children:e})}},32073:function(e,t,n){"use strict";var r=n(67294),a=n(20745),o=n(70405),i=n(73727),l=n(75150),s=n(24011);let u=[n(3601),n(38143),n(28427),n(17686)];var c=n(84016),d=n(16550),f=n(18790),p=n(85893);function m({children:e}){return(0,p.jsx)(p.Fragment,{children:e})}var h=n(54234);let g=e=>e.defaultFormatter(e);function b({children:e}){return(0,p.jsx)(h.D,{formatter:g,children:e})}function y({children:e}){return(0,p.jsx)(b,{children:e})}var v=n(34903),k=n(72442),w=n(8043),x=n(21641),S=n(64994),E=n(93786),_=n(96825),C=n(3143),T=n(13427);function P(){let{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,k.default)(),r=(0,E.l)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(v.Z,{children:[Object.entries(n).map(([e,{htmlLang:t}])=>(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:e,fullyQualified:!0}),hrefLang:t},e)),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter(e=>a!==e.htmlLang).map(e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`))]})}function A({permalink:e}){let{siteConfig:{url:t}}=(0,k.default)(),n=function(){let{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,k.default)(),{pathname:r}=(0,d.TH)();return e+(0,C.applyTrailingSlash)((0,w.ZP)(r),{trailingSlash:n,baseUrl:t})}(),r=e?`${t}${e}`:n;return(0,p.jsxs)(v.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:r}),(0,p.jsx)("link",{rel:"canonical",href:r})]})}function O(){let{i18n:{currentLocale:e}}=(0,k.default)(),{metadata:t,image:n}=(0,x.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(v.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:_.h})]}),n&&(0,p.jsx)(S.d,{image:n}),(0,p.jsx)(A,{}),(0,p.jsx)(P,{}),(0,p.jsx)(T.Z,{tag:"default",locale:e}),(0,p.jsx)(v.Z,{children:t.map((e,t)=>(0,p.jsx)("meta",{...e},t))})]})}let L=new Map;var j=n(34639),N=n(41507),R=n(30671);function I(e,...t){let n=u.map(n=>{let r=n.default?.[e]??n[e];return r?.(...t)});return()=>n.forEach(e=>e?.())}let F=function({children:e,location:t,previousLocation:n}){return(0,R.Z)(()=>{n!==t&&(!function({location:e,previousLocation:t}){if(!t)return;let n=e.pathname===t.pathname,r=e.hash===t.hash,a=e.search===t.search;if(n&&r&&!a)return;let{hash:o}=e;if(o){let e=decodeURIComponent(o.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:t,previousLocation:n}),I("onRouteDidUpdate",{previousLocation:n,location:t}))},[n,t]),e};function D(e){return Promise.all(Array.from(new Set([e,decodeURI(e)])).map(e=>(0,f.f)(c.Z,e)).flat().map(e=>e.route.component.preload?.()))}class z extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;let n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),D(n.pathname).then(()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})}).catch(e=>{console.warn(e),window.location.reload()}),!1}render(){let{children:e,location:t}=this.props;return(0,p.jsx)(F,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.AW,{location:t,render:()=>e})})}}let M="__docusaurus-base-url-issue-banner-suggestion-container";function $(){let{siteConfig:{baseUrl:e}}=(0,k.default)();return(0,p.jsx)(p.Fragment,{children:!s.Z.canUseDOM&&(0,p.jsx)(v.Z,{children:(0,p.jsx)("script",{children:` 1 + (self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([["6909"],{3601:function(e,t,n){"use strict";n.r(t)},17686:function(e,t,n){"use strict";n.r(t)},97642:function(e,t,n){"use strict";n.d(t,{AY:()=>i,H6:()=>o,Hk:()=>a,Kc:()=>d,gQ:()=>u,hG:()=>f,l9:()=>c,pQ:()=>p,pu:()=>s,t_:()=>l,vc:()=>r});let r=null,a=50,o=!1,i=!0,l=!0,s="right",u=void 0,c=!0,d=null,f=!1,p=!1},84016:function(e,t,n){"use strict";n.d(t,{Z:()=>f}),n(67294);var r=n(68356),a=n.n(r),o=n(37138);let i={"04d926a5":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8689"),n.e("8051")]).then(n.bind(n,68875)),"@site/docs/configuration/configuration.mdx",68875],"07b3b246":[()=>Promise.all([n.e("8016"),n.e("9116")]).then(n.bind(n,79035)),"@site/docs/development/dev-client.md",79035],"08938dd7":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("4477")]).then(n.bind(n,24963)),"@site/docs/configuration/sources/rocksky-source.mdx",24963],"094000d3":[()=>Promise.all([n.e("8016"),n.e("9325")]).then(n.bind(n,77994)),"@site/docs/configuration/transforms/transforms.mdx",77994],"0ce74438":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("1622"),n.e("3385")]).then(n.bind(n,46259)),"@site/src/pages/playground.tsx",46259],"138e0e15":[()=>n.e("151").then(n.t.bind(n,43765,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",43765],"14eb3368":[()=>Promise.all([n.e("6212"),n.e("1983")]).then(n.bind(n,29568)),"@theme/DocCategoryGeneratedIndexPage",29568],"153c3ceb":[()=>Promise.all([n.e("8016"),n.e("1355")]).then(n.bind(n,67430)),"@site/docs/development/flatpak.md",67430],0x11113f9:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8689"),n.e("9151"),n.e("7048")]).then(n.bind(n,49971)),"@theme/DocItem",49971],"1a4e3797":[()=>Promise.all([n.e("6212"),n.e("5230")]).then(n.bind(n,60441)),"@theme/SearchPage",60441],"1fb61236":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3174")]).then(n.bind(n,20941)),"@site/docs/configuration/sources/plex.mdx",20941],"202c4968":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8054")]).then(n.bind(n,7572)),"@site/docs/configuration/sources/koito-source.mdx",7572],"24a5b6e6":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("1165")]).then(n.bind(n,79501)),"@site/docs/configuration/sources/azuracast.mdx",79501],"294f31e2":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7544")]).then(n.bind(n,42536)),"@site/docs/configuration/sources/subsonic.mdx",42536],"2a24ad03":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3424")]).then(n.bind(n,91994)),"@site/docs/configuration/sources/sources.mdx",91994],"2ecbbad4":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3396")]).then(n.bind(n,64903)),"@site/docs/configuration/sources/youtube-music.mdx",64903],"30829cd8":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3517")]).then(n.bind(n,47985)),"@site/docs/configuration/sources/tealfm-source.mdx",47985],"33c4ed3f":[()=>Promise.all([n.e("8016"),n.e("1771")]).then(n.bind(n,42444)),"@site/docs/development/dev-source.md",42444],"3827a595":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("5291")]).then(n.bind(n,32134)),"@site/docs/configuration/sources/lastfm-endpoint.mdx",32134],"41cd626a":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("4854")]).then(n.bind(n,87896)),"@site/docs/configuration/sources/vlc.mdx",87896],"425b8dd3":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6364")]).then(n.bind(n,92769)),"@site/docs/configuration/sources/musikcube.mdx",92769],"44b2647e":[()=>Promise.all([n.e("8016"),n.e("3693")]).then(n.bind(n,39167)),"@site/docs/configuration/transforms/user.mdx",39167],"493c00ca":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("862")]).then(n.bind(n,78604)),"@site/docs/configuration/sources/yamaha-musiccast.mdx",78604],"498c77bd":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8670")]).then(n.bind(n,28689)),"@site/docs/configuration/sources/jriver.mdx",28689],"4edc808e":[()=>Promise.all([n.e("8016"),n.e("8005")]).then(n.bind(n,38741)),"@site/docs/index.mdx",38741],"4f1fc707":[()=>n.e("1970").then(n.t.bind(n,78699,19)),"@generated/docusaurus-plugin-content-docs/default/p/multi-scrobbler-category-updating-f22.json",78699],"4f7d60c5":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8569")]).then(n.bind(n,73292)),"@site/docs/configuration/clients/listenbrainz.mdx",73292],"5930ad03":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("9982")]).then(n.bind(n,82109)),"@site/docs/configuration/sources/mopidy.mdx",82109],"5a378701":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7246")]).then(n.bind(n,94023)),"@site/docs/configuration/sources/jellyfin.mdx",94023],"5e95c892":[()=>n.e("3432").then(n.bind(n,41431)),"@theme/DocsRoot",41431],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,75150)),"@generated/docusaurus.config",75150],0x3dd57b1:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("9621")]).then(n.bind(n,10164)),"@site/docs/configuration/clients/lastfm.mdx",10164],"72d905a9":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("1214")]).then(n.bind(n,49415)),"@site/docs/configuration/sources/google-cast.mdx",49415],0x45e4909:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3151")]).then(n.bind(n,19171)),"@site/docs/configuration/sources/librefm-source.mdx",19171],0x476864f:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7631")]).then(n.bind(n,73699)),"@site/docs/quickstart.mdx",73699],"778b0fa6":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3989")]).then(n.bind(n,66833)),"@site/docs/configuration/sources/spotify.mdx",66833],"7b4f75c2":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("3748")]).then(n.bind(n,62494)),"@site/docs/configuration/clients/librefm.mdx",62494],"7d837a1d":[()=>n.e("3664").then(n.t.bind(n,67189,19)),"@generated/docusaurus-plugin-content-docs/default/p/multi-scrobbler-ae0.json",67189],"812e048c":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6751")]).then(n.bind(n,89589)),"@site/docs/configuration/clients/tealfm.mdx",89589],"8b39be93":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("4330")]).then(n.bind(n,67676)),"@site/docs/configuration/sources/icecast.mdx",67676],"91a78c9f":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8972")]).then(n.bind(n,53950)),"@site/docs/configuration/sources/mpd.mdx",53950],"925abbc7":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8934")]).then(n.bind(n,85166)),"@site/docs/configuration/sources/deezer.mdx",85166],"97d34c1a":[()=>n.e("6963").then(n.t.bind(n,8609,19)),"@generated/docusaurus-plugin-content-docs/default/p/multi-scrobbler-category-development-f99.json",8609],"9bcab3db":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6374")]).then(n.bind(n,19946)),"@site/docs/configuration/sources/lastfm-source.mdx",19946],"9fd2a592":[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6658")]).then(n.bind(n,14396)),"@site/docs/configuration/sources/webscrobbler.mdx",14396],a16703cd:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("4328")]).then(n.bind(n,69918)),"@site/docs/configuration/clients/clients.mdx",69918],a7456010:[()=>n.e("7365").then(n.t.bind(n,62050,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",62050],a7bd4aaa:[()=>n.e("5211").then(n.bind(n,5264)),"@theme/DocVersionRoot",5264],a93ae359:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8881")]).then(n.bind(n,4042)),"@site/docs/configuration/sources/listenbrainz-endpoint.mdx",4042],a94703ab:[()=>Promise.all([n.e("6212"),n.e("9914")]).then(n.bind(n,81037)),"@theme/DocRoot",81037],aba21aa0:[()=>n.e("5112").then(n.t.bind(n,42418,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",42418],ad895e75:[()=>Promise.all([n.e("8016"),n.e("5658")]).then(n.bind(n,89666)),"@site/docs/FAQ.md",89666],af9480c3:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("974")]).then(n.bind(n,28561)),"@site/docs/configuration/sources/listenbrainz-source.mdx",28561],b46f7c12:[()=>Promise.all([n.e("8016"),n.e("4021")]).then(n.bind(n,15185)),"@site/docs/installation/service.md",15185],bf69edfb:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6286")]).then(n.bind(n,49639)),"@site/docs/installation/installation.mdx",49639],c2e935db:[()=>Promise.all([n.e("8016"),n.e("8378")]).then(n.bind(n,55797)),"@site/docs/development/dev-common.md",55797],cdda7d53:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6707")]).then(n.bind(n,34081)),"@site/docs/configuration/clients/maloja.mdx",34081],d3a18f08:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("8656")]).then(n.bind(n,47802)),"@site/docs/updating/updating.mdx",47802],d53edd15:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7375")]).then(n.bind(n,35308)),"@site/docs/configuration/sources/kodi.mdx",35308],dfa6d5b1:[()=>Promise.all([n.e("8016"),n.e("7416")]).then(n.bind(n,42302)),"@site/docs/configuration/transforms/native.mdx",42302],e6ac3f64:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("6922")]).then(n.bind(n,90481)),"@site/docs/configuration/transforms/musicbrainz.mdx",90481],e7a53bbd:[()=>Promise.all([n.e("8016"),n.e("7073")]).then(n.bind(n,19979)),"@site/docs/configuration/kitchensink.mdx",19979],e82a470f:[()=>Promise.all([n.e("8016"),n.e("5757")]).then(n.bind(n,35418)),"@site/docs/configuration/clients/rocksky.mdx",35418],f18fd350:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("7556")]).then(n.bind(n,72170)),"@site/docs/configuration/clients/koito.mdx",72170],fa357871:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("9318")]).then(n.bind(n,16358)),"@site/docs/configuration/sources/maloja.mdx",16358],fee59995:[()=>Promise.all([n.e("6212"),n.e("8016"),n.e("2583")]).then(n.bind(n,25894)),"@site/docs/configuration/sources/mpris.mdx",25894]};var l=n(85893);function s({error:e,retry:t,pastDelay:n}){return e?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(e)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:t,children:"Retry"})})]}):n?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(65571),c=n(15340);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e("5648").then(n.bind(n,42342)),modules:["@theme/NotFound"],webpack:()=>[42342],render(e,t){let n=e.default;return(0,l.jsx)(c.z,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});let r=o[`${e}-${t}`],d={},f=[],p=[];return Object.entries((0,u.Z)(r)).forEach(([e,t])=>{let n=i[t];n&&(d[e]=n[0],f.push(n[1]),p.push(n[2]))}),a().Map({loading:s,loader:d,modules:f,webpack:()=>p,render(t,n){let a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach(([t,n])=>{let r=n.default;if(!r)throw Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);("object"==typeof r||"function"==typeof r)&&Object.keys(n).filter(e=>"default"!==e).forEach(e=>{r[e]=n[e]});let o=a,i=t.split(".");i.slice(0,-1).forEach(e=>{o=o[e]}),o[i[i.length-1]]=r});let o=a.__comp;delete a.__comp;let i=a.__context;delete a.__context;let s=a.__props;return delete a.__props,(0,l.jsx)(c.z,{value:i,children:(0,l.jsx)(o,{...a,...s,...n})})}})}let f=[{path:"/multi-scrobbler/playground/",component:d("/multi-scrobbler/playground/","18f"),exact:!0},{path:"/multi-scrobbler/search/",component:d("/multi-scrobbler/search/","71d"),exact:!0},{path:"/multi-scrobbler/",component:d("/multi-scrobbler/","2c5"),routes:[{path:"/multi-scrobbler/",component:d("/multi-scrobbler/","bb5"),routes:[{path:"/multi-scrobbler/",component:d("/multi-scrobbler/","d93"),routes:[{path:"/multi-scrobbler/category/development/",component:d("/multi-scrobbler/category/development/","626"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/category/updating/",component:d("/multi-scrobbler/category/updating/","719"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/",component:d("/multi-scrobbler/configuration/","230"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/",component:d("/multi-scrobbler/configuration/clients/","099"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/koito/",component:d("/multi-scrobbler/configuration/clients/koito/","bcb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/lastfm/",component:d("/multi-scrobbler/configuration/clients/lastfm/","5c9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/librefm/",component:d("/multi-scrobbler/configuration/clients/librefm/","dd4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/listenbrainz/",component:d("/multi-scrobbler/configuration/clients/listenbrainz/","be2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/maloja/",component:d("/multi-scrobbler/configuration/clients/maloja/","dc4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/rocksky/",component:d("/multi-scrobbler/configuration/clients/rocksky/","489"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/clients/tealfm/",component:d("/multi-scrobbler/configuration/clients/tealfm/","743"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/kitchensink/",component:d("/multi-scrobbler/configuration/kitchensink/","7d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/",component:d("/multi-scrobbler/configuration/sources/","479"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/azuracast/",component:d("/multi-scrobbler/configuration/sources/azuracast/","434"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/deezer/",component:d("/multi-scrobbler/configuration/sources/deezer/","d7a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/google-cast/",component:d("/multi-scrobbler/configuration/sources/google-cast/","434"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/icecast/",component:d("/multi-scrobbler/configuration/sources/icecast/","dfe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/jellyfin/",component:d("/multi-scrobbler/configuration/sources/jellyfin/","2fe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/jriver/",component:d("/multi-scrobbler/configuration/sources/jriver/","a36"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/kodi/",component:d("/multi-scrobbler/configuration/sources/kodi/","ab6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/koito-source/",component:d("/multi-scrobbler/configuration/sources/koito-source/","d25"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/lastfm-endpoint/",component:d("/multi-scrobbler/configuration/sources/lastfm-endpoint/","d0b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/lastfm-source/",component:d("/multi-scrobbler/configuration/sources/lastfm-source/","f93"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/librefm-source/",component:d("/multi-scrobbler/configuration/sources/librefm-source/","2b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/",component:d("/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","b80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/listenbrainz-source/",component:d("/multi-scrobbler/configuration/sources/listenbrainz-source/","8ff"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/maloja/",component:d("/multi-scrobbler/configuration/sources/maloja/","ed2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/mopidy/",component:d("/multi-scrobbler/configuration/sources/mopidy/","b30"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/mpd/",component:d("/multi-scrobbler/configuration/sources/mpd/","e96"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/mpris/",component:d("/multi-scrobbler/configuration/sources/mpris/","751"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/musikcube/",component:d("/multi-scrobbler/configuration/sources/musikcube/","515"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/plex/",component:d("/multi-scrobbler/configuration/sources/plex/","468"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/rocksky-source/",component:d("/multi-scrobbler/configuration/sources/rocksky-source/","c8d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/spotify/",component:d("/multi-scrobbler/configuration/sources/spotify/","0b5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/subsonic/",component:d("/multi-scrobbler/configuration/sources/subsonic/","c34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/tealfm-source/",component:d("/multi-scrobbler/configuration/sources/tealfm-source/","912"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/vlc/",component:d("/multi-scrobbler/configuration/sources/vlc/","918"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/webscrobbler/",component:d("/multi-scrobbler/configuration/sources/webscrobbler/","3e7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/yamaha-musiccast/",component:d("/multi-scrobbler/configuration/sources/yamaha-musiccast/","5e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/sources/youtube-music/",component:d("/multi-scrobbler/configuration/sources/youtube-music/","e7a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/transforms/",component:d("/multi-scrobbler/configuration/transforms/","5d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/transforms/musicbrainz/",component:d("/multi-scrobbler/configuration/transforms/musicbrainz/","7d6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/transforms/native/",component:d("/multi-scrobbler/configuration/transforms/native/","57a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/configuration/transforms/user/",component:d("/multi-scrobbler/configuration/transforms/user/","9c5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/development/dev-client/",component:d("/multi-scrobbler/development/dev-client/","d6f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/development/dev-common/",component:d("/multi-scrobbler/development/dev-common/","878"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/development/dev-source/",component:d("/multi-scrobbler/development/dev-source/","98f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/development/flatpak/",component:d("/multi-scrobbler/development/flatpak/","b8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/FAQ/",component:d("/multi-scrobbler/FAQ/","07c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/installation/",component:d("/multi-scrobbler/installation/","371"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/installation/service/",component:d("/multi-scrobbler/installation/service/","97c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/quickstart/",component:d("/multi-scrobbler/quickstart/","cfc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/updating/",component:d("/multi-scrobbler/updating/","065"),exact:!0,sidebar:"tutorialSidebar"},{path:"/multi-scrobbler/",component:d("/multi-scrobbler/","e36"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"*",component:d("*")}]},34639:function(e,t,n){"use strict";n.d(t,{_:()=>o,t:()=>i});var r=n(67294),a=n(85893);let o=r.createContext(!1);function i({children:e}){let[t,n]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{n(!0)},[]),(0,a.jsx)(o.Provider,{value:t,children:e})}},32073:function(e,t,n){"use strict";var r=n(67294),a=n(20745),o=n(70405),i=n(73727),l=n(75150),s=n(24011);let u=[n(3601),n(38143),n(28427),n(17686)];var c=n(84016),d=n(16550),f=n(18790),p=n(85893);function m({children:e}){return(0,p.jsx)(p.Fragment,{children:e})}var h=n(54234);let g=e=>e.defaultFormatter(e);function b({children:e}){return(0,p.jsx)(h.D,{formatter:g,children:e})}function y({children:e}){return(0,p.jsx)(b,{children:e})}var v=n(34903),k=n(72442),w=n(8043),x=n(21641),S=n(64994),E=n(93786),_=n(96825),C=n(3143),T=n(13427);function P(){let{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,k.default)(),r=(0,E.l)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(v.Z,{children:[Object.entries(n).map(([e,{htmlLang:t}])=>(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:e,fullyQualified:!0}),hrefLang:t},e)),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter(e=>a!==e.htmlLang).map(e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`))]})}function A({permalink:e}){let{siteConfig:{url:t}}=(0,k.default)(),n=function(){let{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,k.default)(),{pathname:r}=(0,d.TH)();return e+(0,C.applyTrailingSlash)((0,w.ZP)(r),{trailingSlash:n,baseUrl:t})}(),r=e?`${t}${e}`:n;return(0,p.jsxs)(v.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:r}),(0,p.jsx)("link",{rel:"canonical",href:r})]})}function O(){let{i18n:{currentLocale:e}}=(0,k.default)(),{metadata:t,image:n}=(0,x.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(v.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:_.h})]}),n&&(0,p.jsx)(S.d,{image:n}),(0,p.jsx)(A,{}),(0,p.jsx)(P,{}),(0,p.jsx)(T.Z,{tag:"default",locale:e}),(0,p.jsx)(v.Z,{children:t.map((e,t)=>(0,p.jsx)("meta",{...e},t))})]})}let L=new Map;var j=n(34639),N=n(41507),R=n(30671);function I(e,...t){let n=u.map(n=>{let r=n.default?.[e]??n[e];return r?.(...t)});return()=>n.forEach(e=>e?.())}let F=function({children:e,location:t,previousLocation:n}){return(0,R.Z)(()=>{n!==t&&(!function({location:e,previousLocation:t}){if(!t)return;let n=e.pathname===t.pathname,r=e.hash===t.hash,a=e.search===t.search;if(n&&r&&!a)return;let{hash:o}=e;if(o){let e=decodeURIComponent(o.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:t,previousLocation:n}),I("onRouteDidUpdate",{previousLocation:n,location:t}))},[n,t]),e};function D(e){return Promise.all(Array.from(new Set([e,decodeURI(e)])).map(e=>(0,f.f)(c.Z,e)).flat().map(e=>e.route.component.preload?.()))}class z extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;let n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),D(n.pathname).then(()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})}).catch(e=>{console.warn(e),window.location.reload()}),!1}render(){let{children:e,location:t}=this.props;return(0,p.jsx)(F,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.AW,{location:t,render:()=>e})})}}let M="__docusaurus-base-url-issue-banner-suggestion-container";function $(){let{siteConfig:{baseUrl:e}}=(0,k.default)();return(0,p.jsx)(p.Fragment,{children:!s.Z.canUseDOM&&(0,p.jsx)(v.Z,{children:(0,p.jsx)("script",{children:` 2 2 document.addEventListener('DOMContentLoaded', function maybeInsertBanner() { 3 3 var shouldInsert = typeof window['docusaurus'] === 'undefined'; 4 4 shouldInsert && insertBanner(); ··· 24 24 : actualHomePagePath + '/'; 25 25 suggestionContainer.innerHTML = suggestedBaseUrl; 26 26 } 27 - `})})})}function B(){let{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,k.default)(),{pathname:n}=(0,d.TH)();return t&&n===e?(0,p.jsx)($,{}):null}function U(){let{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:a}}=(0,k.default)(),o=(0,w.ZP)(e),{htmlLang:i,direction:l}=a[r];return(0,p.jsxs)(v.Z,{children:[(0,p.jsx)("html",{lang:i,dir:l}),(0,p.jsx)("title",{children:t}),(0,p.jsx)("meta",{property:"og:title",content:t}),(0,p.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,p.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,p.jsx)("link",{rel:"icon",href:o})]})}var H=n(77084),Q=n(87039);function Z(){let e=(0,Q.Z)();return(0,p.jsx)(v.Z,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}let V=(0,f.H)(c.Z);function W(){let e=function(e){if(L.has(e.pathname))return{...e,pathname:L.get(e.pathname)};if((0,f.f)(c.Z,e.pathname).some(({route:e})=>!0===e.exact))return L.set(e.pathname,e.pathname),e;let t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return L.set(e.pathname,t),{...e,pathname:t}}((0,d.TH)());return(0,p.jsx)(z,{location:e,children:V})}var q=n(37138);let G=!function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise((t,n)=>{let r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)})}:function(e){return new Promise((t,n)=>{if("undefined"==typeof document)return void n();let r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();let a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)})};var Y=n(65571);let K=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee=Object.freeze({prefetch:e=>!(J()||X.has(e)||K.has(e))&&(K.add(e),Promise.all((0,f.f)(c.Z,e).flatMap(e=>{let t;return t=e.route.path,Object.entries(q).filter(([e])=>e.replace(/-[^-]+$/,"")===t).flatMap(([,e])=>Object.values((0,Y.Z)(e)))}).map(e=>{let t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch(()=>{}):Promise.resolve()}))),preload:e=>!(J()||X.has(e))&&(X.add(e),D(e))});if(e=n.hmd(e),s.Z.canUseDOM){window.docusaurus=ee;let t=document.getElementById("__docusaurus"),n=(0,p.jsx)(o.B6,{children:(0,p.jsx)(function({children:e}){return"hash"===l.default.future.experimental_router?(0,p.jsx)(i.UT,{children:e}):(0,p.jsx)(i.VK,{children:e})},{children:(0,p.jsx)(function(){return(0,p.jsx)(H.default,{children:(0,p.jsx)(N.M,{children:(0,p.jsxs)(j.t,{children:[(0,p.jsx)(m,{children:(0,p.jsxs)(y,{children:[(0,p.jsx)(U,{}),(0,p.jsx)(O,{}),(0,p.jsx)(B,{}),(0,p.jsx)(W,{})]})}),(0,p.jsx)(Z,{})]})})})},{})})}),s=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},u=()=>{if(window.docusaurusRoot)return void window.docusaurusRoot.render(n);window.docusaurusRoot=a.hydrateRoot(t,n,{onRecoverableError:s})};D(window.location.pathname).then(()=>{(0,r.startTransition)(u)}),e.hot&&e.hot.accept()}},41507:function(e,t,n){"use strict";n.d(t,{M:()=>f,_:()=>d});var r=n(67294),a=n(75150),o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/multi-scrobbler/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/multi-scrobbler/","mainDocId":"index","docs":[{"id":"configuration/clients/clients","path":"/multi-scrobbler/configuration/clients/","sidebar":"tutorialSidebar"},{"id":"configuration/clients/koito","path":"/multi-scrobbler/configuration/clients/koito","sidebar":"tutorialSidebar"},{"id":"configuration/clients/lastfm","path":"/multi-scrobbler/configuration/clients/lastfm","sidebar":"tutorialSidebar"},{"id":"configuration/clients/listenbrainz","path":"/multi-scrobbler/configuration/clients/listenbrainz","sidebar":"tutorialSidebar"},{"id":"configuration/clients/maloja","path":"/multi-scrobbler/configuration/clients/maloja","sidebar":"tutorialSidebar"},{"id":"configuration/clients/rocksky","path":"/multi-scrobbler/configuration/clients/rocksky","sidebar":"tutorialSidebar"},{"id":"configuration/clients/tealfm","path":"/multi-scrobbler/configuration/clients/tealfm","sidebar":"tutorialSidebar"},{"id":"configuration/configuration","path":"/multi-scrobbler/configuration/","sidebar":"tutorialSidebar"},{"id":"configuration/kitchensink","path":"/multi-scrobbler/configuration/kitchensink","sidebar":"tutorialSidebar"},{"id":"configuration/sources/azuracast","path":"/multi-scrobbler/configuration/sources/azuracast","sidebar":"tutorialSidebar"},{"id":"configuration/sources/deezer","path":"/multi-scrobbler/configuration/sources/deezer","sidebar":"tutorialSidebar"},{"id":"configuration/sources/google-cast","path":"/multi-scrobbler/configuration/sources/google-cast","sidebar":"tutorialSidebar"},{"id":"configuration/sources/icecast","path":"/multi-scrobbler/configuration/sources/icecast","sidebar":"tutorialSidebar"},{"id":"configuration/sources/jellyfin","path":"/multi-scrobbler/configuration/sources/jellyfin","sidebar":"tutorialSidebar"},{"id":"configuration/sources/jriver","path":"/multi-scrobbler/configuration/sources/jriver","sidebar":"tutorialSidebar"},{"id":"configuration/sources/kodi","path":"/multi-scrobbler/configuration/sources/kodi","sidebar":"tutorialSidebar"},{"id":"configuration/sources/koito-source","path":"/multi-scrobbler/configuration/sources/koito-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/lastfm-endpoint","path":"/multi-scrobbler/configuration/sources/lastfm-endpoint","sidebar":"tutorialSidebar"},{"id":"configuration/sources/lastfm-source","path":"/multi-scrobbler/configuration/sources/lastfm-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/listenbrainz-endpoint","path":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint","sidebar":"tutorialSidebar"},{"id":"configuration/sources/listenbrainz-source","path":"/multi-scrobbler/configuration/sources/listenbrainz-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/maloja","path":"/multi-scrobbler/configuration/sources/maloja","sidebar":"tutorialSidebar"},{"id":"configuration/sources/mopidy","path":"/multi-scrobbler/configuration/sources/mopidy","sidebar":"tutorialSidebar"},{"id":"configuration/sources/mpd","path":"/multi-scrobbler/configuration/sources/mpd","sidebar":"tutorialSidebar"},{"id":"configuration/sources/mpris","path":"/multi-scrobbler/configuration/sources/mpris","sidebar":"tutorialSidebar"},{"id":"configuration/sources/musikcube","path":"/multi-scrobbler/configuration/sources/musikcube","sidebar":"tutorialSidebar"},{"id":"configuration/sources/plex","path":"/multi-scrobbler/configuration/sources/plex","sidebar":"tutorialSidebar"},{"id":"configuration/sources/rocksky-source","path":"/multi-scrobbler/configuration/sources/rocksky-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/sources","path":"/multi-scrobbler/configuration/sources/","sidebar":"tutorialSidebar"},{"id":"configuration/sources/spotify","path":"/multi-scrobbler/configuration/sources/spotify","sidebar":"tutorialSidebar"},{"id":"configuration/sources/subsonic","path":"/multi-scrobbler/configuration/sources/subsonic","sidebar":"tutorialSidebar"},{"id":"configuration/sources/tealfm-source","path":"/multi-scrobbler/configuration/sources/tealfm-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/vlc","path":"/multi-scrobbler/configuration/sources/vlc","sidebar":"tutorialSidebar"},{"id":"configuration/sources/webscrobbler","path":"/multi-scrobbler/configuration/sources/webscrobbler","sidebar":"tutorialSidebar"},{"id":"configuration/sources/yamaha-musiccast","path":"/multi-scrobbler/configuration/sources/yamaha-musiccast","sidebar":"tutorialSidebar"},{"id":"configuration/sources/youtube-music","path":"/multi-scrobbler/configuration/sources/youtube-music","sidebar":"tutorialSidebar"},{"id":"configuration/transforms/musicbrainz","path":"/multi-scrobbler/configuration/transforms/musicbrainz","sidebar":"tutorialSidebar"},{"id":"configuration/transforms/native","path":"/multi-scrobbler/configuration/transforms/native","sidebar":"tutorialSidebar"},{"id":"configuration/transforms/transforms","path":"/multi-scrobbler/configuration/transforms/","sidebar":"tutorialSidebar"},{"id":"configuration/transforms/user","path":"/multi-scrobbler/configuration/transforms/user","sidebar":"tutorialSidebar"},{"id":"development/dev-client","path":"/multi-scrobbler/development/dev-client","sidebar":"tutorialSidebar"},{"id":"development/dev-common","path":"/multi-scrobbler/development/dev-common","sidebar":"tutorialSidebar"},{"id":"development/dev-source","path":"/multi-scrobbler/development/dev-source","sidebar":"tutorialSidebar"},{"id":"development/flatpak","path":"/multi-scrobbler/development/flatpak","sidebar":"tutorialSidebar"},{"id":"FAQ","path":"/multi-scrobbler/FAQ","sidebar":"tutorialSidebar"},{"id":"index","path":"/multi-scrobbler/","sidebar":"tutorialSidebar"},{"id":"installation/installation","path":"/multi-scrobbler/installation/","sidebar":"tutorialSidebar"},{"id":"installation/service","path":"/multi-scrobbler/installation/service","sidebar":"tutorialSidebar"},{"id":"quickstart","path":"/multi-scrobbler/quickstart","sidebar":"tutorialSidebar"},{"id":"updating/updating","path":"/multi-scrobbler/updating/","sidebar":"tutorialSidebar"},{"id":"/category/updating","path":"/multi-scrobbler/category/updating","sidebar":"tutorialSidebar"},{"id":"/category/development","path":"/multi-scrobbler/category/development","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/multi-scrobbler/","label":"index"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}'),l=n(62627),s=JSON.parse('{"docusaurusVersion":"3.8.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.8.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.8.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.8.1"},"docusaurus-plugin-svgr":{"type":"package","name":"@docusaurus/plugin-svgr","version":"3.8.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.8.1"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.8.1"},"docusaurus-json-schema-plugin":{"type":"package","name":"docusaurus-json-schema-plugin","version":"1.14.0"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.51.1"},"docusaurus-theme-github-codeblock":{"type":"package"}}}'),u=n(85893);let c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(c);function f({children:e}){return(0,u.jsx)(d.Provider,{value:c,children:e})}},77084:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>m});var r=n(67294),a=n(24011),o=n(34903),i=n(3143),l=n(31026),s=n(15340),u=n(85893);function c({error:e,tryAgain:t}){return(0,u.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,u.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,u.jsx)("button",{type:"button",onClick:t,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,u.jsx)(d,{error:e})]})}function d({error:e}){let t=(0,i.getErrorCausalChain)(e).map(e=>e.message).join("\n\nCause:\n");return(0,u.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:t})}function f({children:e}){return(0,u.jsx)(s.z,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:e})}function p({error:e,tryAgain:t}){return(0,u.jsx)(f,{children:(0,u.jsxs)(m,{fallback:()=>(0,u.jsx)(c,{error:e,tryAgain:t}),children:[(0,u.jsx)(o.Z,{children:(0,u.jsx)("title",{children:"Page Error"})}),(0,u.jsx)(l.Z,{children:(0,u.jsx)(c,{error:e,tryAgain:t})})]})})}class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){let{children:e}=this.props,{error:t}=this.state;return t?(this.props.fallback??(e=>(0,u.jsx)(p,{...e})))({error:t,tryAgain:()=>this.setState({error:null})}):e??null}}},24011:function(e,t,n){"use strict";n.d(t,{Z:()=>a});let r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},34903:function(e,t,n){"use strict";n.d(t,{Z:()=>o}),n(67294);var r=n(70405),a=n(85893);function o(e){return(0,a.jsx)(r.ql,{...e})}},50436:function(e,t,n){"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(73727),o=n(3143),i=n(72442),l=n(60011),s=n(24011),u=n(66575),c=n(8043),d=n(85893);let f=r.forwardRef(function({isNavLink:e,to:t,href:n,activeClassName:f,isActive:p,"data-noBrokenLinkCheck":m,autoAddBaseUrl:h=!0,...g},b){var y;let{siteConfig:v}=(0,i.default)(),{trailingSlash:k,baseUrl:w}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,c.Cg)(),E=(0,u.Z)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(b,()=>_.current);let C=t||n,T=(0,l.Z)(C),P=C?.replace("pathname://",""),A=void 0!==P?(y=P,h&&y.startsWith("/")?S(y):y):void 0;"hash"===x&&A?.startsWith("./")&&(A=A?.slice(1)),A&&T&&(A=(0,o.applyTrailingSlash)(A,{trailingSlash:k,baseUrl:w}));let O=(0,r.useRef)(!1),L=e?a.OL:a.rU,j=s.Z.canUseIntersectionObserver,N=(0,r.useRef)(),R=()=>{O.current||null==A||(window.docusaurus.preload(A),O.current=!0)};(0,r.useEffect)(()=>(!j&&T&&s.Z.canUseDOM&&null!=A&&window.docusaurus.prefetch(A),()=>{j&&N.current&&N.current.disconnect()}),[N,A,j,T]);let I=A?.startsWith("#")??!1,F=!g.target||"_self"===g.target,D=!A||!T||!F||I&&"hash"!==x;m||!I&&D||E.collectLink(A),g.id&&E.collectAnchor(g.id);let z={};return D?(0,d.jsx)("a",{ref:_,href:A,...C&&!T&&{target:"_blank",rel:"noopener noreferrer"},...g,...z}):(0,d.jsx)(L,{...g,onMouseEnter:R,onTouchStart:R,innerRef:e=>{_.current=e,j&&e&&T&&(N.current=new window.IntersectionObserver(t=>{t.forEach(t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))})}),N.current.observe(e))},to:A,...e&&{isActive:p,activeClassName:f},...z})})},14709:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>u,translate:()=>s});var r=n(67294),a=n(85893);function o(e,t){let n=e.split(/(\{\w+\})/).map((e,n)=>{if(n%2==1){let n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e});return n.some(e=>(0,r.isValidElement)(e))?n.map((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e).filter(e=>""!==e):n.join("")}var i=n(62627);function l({id:e,message:t}){if(void 0===e&&void 0===t)throw Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[e??t]??t??e}function s({message:e,id:t},n){return o(l({message:e,id:t}),n)}function u({children:e,id:t,values:n}){if(e&&"string"!=typeof e)throw console.warn("Illegal <Translate> children",e),Error("The Docusaurus <Translate> component only accept simple string values");let r=l({message:e,id:t});return(0,a.jsx)(a.Fragment,{children:o(r,n)})}},44593:function(e,t,n){"use strict";n.d(t,{m:()=>r});let r="default"},60011:function(e,t,n){"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},8043:function(e,t,n){"use strict";n.d(t,{Cg:()=>i,ZP:()=>l});var r=n(67294),a=n(72442),o=n(60011);function i(){let{siteConfig:e}=(0,a.default)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router;return{withBaseUrl:(0,r.useCallback)((e,r)=>(function({siteUrl:e,baseUrl:t,url:n,options:{forcePrependBaseUrl:r=!1,absolute:a=!1}={},router:i}){if(!n||n.startsWith("#")||(0,o.b)(n))return n;if("hash"===i)return n.startsWith("/")?`.${n}`:`./${n}`;if(r)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;let l=n.startsWith(t)?n:t+n.replace(/^\//,"");return a?e+l:l})({siteUrl:n,baseUrl:t,url:e,options:r,router:i}),[n,t,i])}}function l(e,t={}){let{withBaseUrl:n}=i();return n(e,t)}},66575:function(e,t,n){"use strict";n.d(t,{Z:()=>o});var r=n(67294);n(85893);let a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}});function o(){return(0,r.useContext)(a)}},72442:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(67294),a=n(41507);function o(){return(0,r.useContext)(a._)}},87039:function(e,t,n){"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(34639);function o(){return(0,r.useContext)(a._)}},30671:function(e,t,n){"use strict";n.d(t,{Z:()=>a});var r=n(67294);let a=n(24011).Z.canUseDOM?r.useLayoutEffect:r.useEffect},90095:function(e,t,n){"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(15340);function o(){let e=r.useContext(a._);if(!e)throw Error("Unexpected: no Docusaurus route context found");return e}},65571:function(e,t,n){"use strict";function r(e){let t={};return!function e(n,r){Object.entries(n).forEach(([n,a])=>{let o=r?`${r}.${n}`:n;"object"==typeof a&&a&&Object.keys(a).length>0?e(a,o):t[o]=a})}(e),t}n.d(t,{Z:()=>r})},15340:function(e,t,n){"use strict";n.d(t,{_:()=>o,z:()=>i});var r=n(67294),a=n(85893);let o=r.createContext(null);function i({children:e,value:t}){let n=r.useContext(o),i=(0,r.useMemo)(()=>(function({parent:e,value:t}){if(!e){if(t){if(!("plugin"in t))throw Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute")}else throw Error("Unexpected: no Docusaurus route context found");return t}let n={...e.data,...t?.data};return{plugin:e.plugin,data:n}})({parent:n,value:t}),[n,t]);return(0,a.jsx)(o.Provider,{value:i,children:e})}},49758:function(e,t,n){"use strict";n.d(t,{J:()=>h,L5:()=>p,Oh:()=>g});var r=n(67294),a=n(86055),o=n(44593),i=n(21641),l=n(16181),s=n(73436),u=n(85893);let c=e=>`docs-preferred-version-${e}`,d=r.createContext(null);function f({children:e}){let t=function(){let e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)(()=>Object.keys(e),[e]),[o,s]=(0,r.useState)(()=>Object.fromEntries(n.map(e=>[e,{preferredVersionName:null}])));return(0,r.useEffect)(()=>{s(function({pluginIds:e,versionPersistence:t,allDocsData:n}){return Object.fromEntries(e.map(e=>[e,function(e){var r,a;let o,i,s=(o=e,i=t,(0,l.WA)(c(o),{persistence:i}).get());return n[e].versions.some(e=>e.name===s)?{preferredVersionName:s}:(r=e,a=t,(0,l.WA)(c(r),{persistence:a}).del(),{preferredVersionName:null})}(e)]))}({allDocsData:e,versionPersistence:t,pluginIds:n}))},[e,t,n]),[o,(0,r.useMemo)(()=>({savePreferredVersion:function(e,n){var r,a,o;r=e,a=t,o=n,(0,l.WA)(c(r),{persistence:a}).set(o),s(t=>({...t,[e]:{preferredVersionName:n}}))}}),[t])]}();return(0,u.jsx)(d.Provider,{value:t,children:e})}function p({children:e}){return(0,u.jsx)(f,{children:e})}function m(){let e=(0,r.useContext)(d);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function h(e=o.m){let t=(0,a.zh)(e),[n,i]=m(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find(e=>e.name===l)??null,savePreferredVersionName:(0,r.useCallback)(t=>{i.savePreferredVersion(e,t)},[i,e])}}function g(){let e=(0,a._r)(),[t]=m();return Object.fromEntries(Object.keys(e).map(n=>[n,function(n){let r=e[n],{preferredVersionName:a}=t[n];return r.versions.find(e=>e.name===a)??null}(n)]))}},41014:function(e,t,n){"use strict";n.d(t,{J:()=>o,z:()=>i});var r=n(86055),a=n(49758);function o(e,t){return`docs-${e}-${t}`}function i(){let e=(0,r._r)(),t=(0,r.WS)(),n=(0,a.Oh)();return[...Object.keys(e).map(function(r){let a=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],l=e[r].versions.find(e=>e.isLast);return o(r,(a??i??l).name)})]}},65057:function(e,t,n){"use strict";n.d(t,{V:()=>u,b:()=>s});var r=n(67294),a=n(73436),o=n(85893);let i=Symbol("EmptyContext"),l=r.createContext(i);function s({children:e,name:t,items:n}){let a=(0,r.useMemo)(()=>t&&n?{name:t,items:n}:null,[t,n]);return(0,o.jsx)(l.Provider,{value:a,children:e})}function u(){let e=(0,r.useContext)(l);if(e===i)throw new a.i6("DocsSidebarProvider");return e}},7035:function(e,t,n){"use strict";n.d(t,{LM:()=>p,MN:()=>_,Ok:()=>h,SN:()=>E,_F:()=>b,f:()=>y,jA:()=>m,lO:()=>w,oz:()=>x,s1:()=>k,vY:()=>S,xz:()=>f});var r=n(67294),a=n(16550),o=n(18790),i=n(86055),l=n(27765),s=n(73721),u=n(49758),c=n(60464),d=n(65057);function f(e){let t=(0,c.E)();if(!e)return;let n=t.docs[e];if(!n)throw Error(`no version doc found by id=${e}`);return n}function p(e){if("link"===e.type&&!e.unlisted)return e.href;if("category"===e.type){if(e.href&&!e.linkUnlisted)return e.href;for(let t of e.items){let e=p(t);if(e)return e}return}}function m(){let{pathname:e}=(0,a.TH)(),t=(0,d.V)();if(!t)throw Error("Unexpected: cant find current sidebar in context");let n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}function h(){let{pathname:e}=(0,a.TH)(),t=(0,d.V)();if(!t)throw Error("Unexpected: cant find current sidebar in context");let n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];return n?.items??t.items}let g=(e,t)=>void 0!==e&&(0,l.Mg)(e,t);function b(e,t){if("link"===e.type)return g(e.href,t);if("category"===e.type){let n;return g(e.href,t)||(n=e.items,n.some(e=>b(e,t)))}return!1}function y(e,t){return(0,r.useMemo)(()=>e.filter(e=>(function e(t,n){switch(t.type){case"category":return b(t,n)||void 0!==t.href&&!t.linkUnlisted||t.items.some(t=>e(t,n));case"link":return!t.unlisted||b(t,n);default:return!0}})(e,t)),[e,t])}function v({sidebarItems:e,pathname:t,onlyCategories:n=!1}){let r=[];return!function e(a){for(let o of a)if("category"===o.type&&((0,l.Mg)(o.href,t)||e(o.items))||"link"===o.type&&(0,l.Mg)(o.href,t))return n&&"category"!==o.type||r.unshift(o),!0;return!1}(e),r}function k(){let e=(0,d.V)(),{pathname:t}=(0,a.TH)();return!1!==(0,i.gA)()?.pluginData.breadcrumbs&&e?v({sidebarItems:e.items,pathname:t}):null}function w(e){let{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,u.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)(()=>(0,s.jj)([t,n,a].filter(Boolean)),[t,n,a])}function x(e,t){let n=w(t);return(0,r.useMemo)(()=>{let t=n.flatMap(e=>e.sidebars?Object.entries(e.sidebars):[]),r=t.find(t=>t[0]===e);if(!r)throw Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map(e=>e.name).join(", ")}". 27 + `})})})}function B(){let{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,k.default)(),{pathname:n}=(0,d.TH)();return t&&n===e?(0,p.jsx)($,{}):null}function U(){let{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:a}}=(0,k.default)(),o=(0,w.ZP)(e),{htmlLang:i,direction:l}=a[r];return(0,p.jsxs)(v.Z,{children:[(0,p.jsx)("html",{lang:i,dir:l}),(0,p.jsx)("title",{children:t}),(0,p.jsx)("meta",{property:"og:title",content:t}),(0,p.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,p.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,p.jsx)("link",{rel:"icon",href:o})]})}var H=n(77084),Q=n(87039);function Z(){let e=(0,Q.Z)();return(0,p.jsx)(v.Z,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}let V=(0,f.H)(c.Z);function W(){let e=function(e){if(L.has(e.pathname))return{...e,pathname:L.get(e.pathname)};if((0,f.f)(c.Z,e.pathname).some(({route:e})=>!0===e.exact))return L.set(e.pathname,e.pathname),e;let t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return L.set(e.pathname,t),{...e,pathname:t}}((0,d.TH)());return(0,p.jsx)(z,{location:e,children:V})}var q=n(37138);let G=!function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise((t,n)=>{let r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)})}:function(e){return new Promise((t,n)=>{if("undefined"==typeof document)return void n();let r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();let a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)})};var Y=n(65571);let K=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee=Object.freeze({prefetch:e=>!(J()||X.has(e)||K.has(e))&&(K.add(e),Promise.all((0,f.f)(c.Z,e).flatMap(e=>{let t;return t=e.route.path,Object.entries(q).filter(([e])=>e.replace(/-[^-]+$/,"")===t).flatMap(([,e])=>Object.values((0,Y.Z)(e)))}).map(e=>{let t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch(()=>{}):Promise.resolve()}))),preload:e=>!(J()||X.has(e))&&(X.add(e),D(e))});if(e=n.hmd(e),s.Z.canUseDOM){window.docusaurus=ee;let t=document.getElementById("__docusaurus"),n=(0,p.jsx)(o.B6,{children:(0,p.jsx)(function({children:e}){return"hash"===l.default.future.experimental_router?(0,p.jsx)(i.UT,{children:e}):(0,p.jsx)(i.VK,{children:e})},{children:(0,p.jsx)(function(){return(0,p.jsx)(H.default,{children:(0,p.jsx)(N.M,{children:(0,p.jsxs)(j.t,{children:[(0,p.jsx)(m,{children:(0,p.jsxs)(y,{children:[(0,p.jsx)(U,{}),(0,p.jsx)(O,{}),(0,p.jsx)(B,{}),(0,p.jsx)(W,{})]})}),(0,p.jsx)(Z,{})]})})})},{})})}),s=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},u=()=>{if(window.docusaurusRoot)return void window.docusaurusRoot.render(n);window.docusaurusRoot=a.hydrateRoot(t,n,{onRecoverableError:s})};D(window.location.pathname).then(()=>{(0,r.startTransition)(u)}),e.hot&&e.hot.accept()}},41507:function(e,t,n){"use strict";n.d(t,{M:()=>f,_:()=>d});var r=n(67294),a=n(75150),o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/multi-scrobbler/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/multi-scrobbler/","mainDocId":"index","docs":[{"id":"configuration/clients/clients","path":"/multi-scrobbler/configuration/clients/","sidebar":"tutorialSidebar"},{"id":"configuration/clients/koito","path":"/multi-scrobbler/configuration/clients/koito","sidebar":"tutorialSidebar"},{"id":"configuration/clients/lastfm","path":"/multi-scrobbler/configuration/clients/lastfm","sidebar":"tutorialSidebar"},{"id":"configuration/clients/librefm","path":"/multi-scrobbler/configuration/clients/librefm","sidebar":"tutorialSidebar"},{"id":"configuration/clients/listenbrainz","path":"/multi-scrobbler/configuration/clients/listenbrainz","sidebar":"tutorialSidebar"},{"id":"configuration/clients/maloja","path":"/multi-scrobbler/configuration/clients/maloja","sidebar":"tutorialSidebar"},{"id":"configuration/clients/rocksky","path":"/multi-scrobbler/configuration/clients/rocksky","sidebar":"tutorialSidebar"},{"id":"configuration/clients/tealfm","path":"/multi-scrobbler/configuration/clients/tealfm","sidebar":"tutorialSidebar"},{"id":"configuration/configuration","path":"/multi-scrobbler/configuration/","sidebar":"tutorialSidebar"},{"id":"configuration/kitchensink","path":"/multi-scrobbler/configuration/kitchensink","sidebar":"tutorialSidebar"},{"id":"configuration/sources/azuracast","path":"/multi-scrobbler/configuration/sources/azuracast","sidebar":"tutorialSidebar"},{"id":"configuration/sources/deezer","path":"/multi-scrobbler/configuration/sources/deezer","sidebar":"tutorialSidebar"},{"id":"configuration/sources/google-cast","path":"/multi-scrobbler/configuration/sources/google-cast","sidebar":"tutorialSidebar"},{"id":"configuration/sources/icecast","path":"/multi-scrobbler/configuration/sources/icecast","sidebar":"tutorialSidebar"},{"id":"configuration/sources/jellyfin","path":"/multi-scrobbler/configuration/sources/jellyfin","sidebar":"tutorialSidebar"},{"id":"configuration/sources/jriver","path":"/multi-scrobbler/configuration/sources/jriver","sidebar":"tutorialSidebar"},{"id":"configuration/sources/kodi","path":"/multi-scrobbler/configuration/sources/kodi","sidebar":"tutorialSidebar"},{"id":"configuration/sources/koito-source","path":"/multi-scrobbler/configuration/sources/koito-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/lastfm-endpoint","path":"/multi-scrobbler/configuration/sources/lastfm-endpoint","sidebar":"tutorialSidebar"},{"id":"configuration/sources/lastfm-source","path":"/multi-scrobbler/configuration/sources/lastfm-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/librefm-source","path":"/multi-scrobbler/configuration/sources/librefm-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/listenbrainz-endpoint","path":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint","sidebar":"tutorialSidebar"},{"id":"configuration/sources/listenbrainz-source","path":"/multi-scrobbler/configuration/sources/listenbrainz-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/maloja","path":"/multi-scrobbler/configuration/sources/maloja","sidebar":"tutorialSidebar"},{"id":"configuration/sources/mopidy","path":"/multi-scrobbler/configuration/sources/mopidy","sidebar":"tutorialSidebar"},{"id":"configuration/sources/mpd","path":"/multi-scrobbler/configuration/sources/mpd","sidebar":"tutorialSidebar"},{"id":"configuration/sources/mpris","path":"/multi-scrobbler/configuration/sources/mpris","sidebar":"tutorialSidebar"},{"id":"configuration/sources/musikcube","path":"/multi-scrobbler/configuration/sources/musikcube","sidebar":"tutorialSidebar"},{"id":"configuration/sources/plex","path":"/multi-scrobbler/configuration/sources/plex","sidebar":"tutorialSidebar"},{"id":"configuration/sources/rocksky-source","path":"/multi-scrobbler/configuration/sources/rocksky-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/sources","path":"/multi-scrobbler/configuration/sources/","sidebar":"tutorialSidebar"},{"id":"configuration/sources/spotify","path":"/multi-scrobbler/configuration/sources/spotify","sidebar":"tutorialSidebar"},{"id":"configuration/sources/subsonic","path":"/multi-scrobbler/configuration/sources/subsonic","sidebar":"tutorialSidebar"},{"id":"configuration/sources/tealfm-source","path":"/multi-scrobbler/configuration/sources/tealfm-source","sidebar":"tutorialSidebar"},{"id":"configuration/sources/vlc","path":"/multi-scrobbler/configuration/sources/vlc","sidebar":"tutorialSidebar"},{"id":"configuration/sources/webscrobbler","path":"/multi-scrobbler/configuration/sources/webscrobbler","sidebar":"tutorialSidebar"},{"id":"configuration/sources/yamaha-musiccast","path":"/multi-scrobbler/configuration/sources/yamaha-musiccast","sidebar":"tutorialSidebar"},{"id":"configuration/sources/youtube-music","path":"/multi-scrobbler/configuration/sources/youtube-music","sidebar":"tutorialSidebar"},{"id":"configuration/transforms/musicbrainz","path":"/multi-scrobbler/configuration/transforms/musicbrainz","sidebar":"tutorialSidebar"},{"id":"configuration/transforms/native","path":"/multi-scrobbler/configuration/transforms/native","sidebar":"tutorialSidebar"},{"id":"configuration/transforms/transforms","path":"/multi-scrobbler/configuration/transforms/","sidebar":"tutorialSidebar"},{"id":"configuration/transforms/user","path":"/multi-scrobbler/configuration/transforms/user","sidebar":"tutorialSidebar"},{"id":"development/dev-client","path":"/multi-scrobbler/development/dev-client","sidebar":"tutorialSidebar"},{"id":"development/dev-common","path":"/multi-scrobbler/development/dev-common","sidebar":"tutorialSidebar"},{"id":"development/dev-source","path":"/multi-scrobbler/development/dev-source","sidebar":"tutorialSidebar"},{"id":"development/flatpak","path":"/multi-scrobbler/development/flatpak","sidebar":"tutorialSidebar"},{"id":"FAQ","path":"/multi-scrobbler/FAQ","sidebar":"tutorialSidebar"},{"id":"index","path":"/multi-scrobbler/","sidebar":"tutorialSidebar"},{"id":"installation/installation","path":"/multi-scrobbler/installation/","sidebar":"tutorialSidebar"},{"id":"installation/service","path":"/multi-scrobbler/installation/service","sidebar":"tutorialSidebar"},{"id":"quickstart","path":"/multi-scrobbler/quickstart","sidebar":"tutorialSidebar"},{"id":"updating/updating","path":"/multi-scrobbler/updating/","sidebar":"tutorialSidebar"},{"id":"/category/updating","path":"/multi-scrobbler/category/updating","sidebar":"tutorialSidebar"},{"id":"/category/development","path":"/multi-scrobbler/category/development","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/multi-scrobbler/","label":"index"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}'),l=n(62627),s=JSON.parse('{"docusaurusVersion":"3.8.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.8.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.8.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.8.1"},"docusaurus-plugin-svgr":{"type":"package","name":"@docusaurus/plugin-svgr","version":"3.8.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.8.1"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.8.1"},"docusaurus-json-schema-plugin":{"type":"package","name":"docusaurus-json-schema-plugin","version":"1.14.0"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.51.1"},"docusaurus-theme-github-codeblock":{"type":"package"}}}'),u=n(85893);let c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(c);function f({children:e}){return(0,u.jsx)(d.Provider,{value:c,children:e})}},77084:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>m});var r=n(67294),a=n(24011),o=n(34903),i=n(3143),l=n(31026),s=n(15340),u=n(85893);function c({error:e,tryAgain:t}){return(0,u.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,u.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,u.jsx)("button",{type:"button",onClick:t,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,u.jsx)(d,{error:e})]})}function d({error:e}){let t=(0,i.getErrorCausalChain)(e).map(e=>e.message).join("\n\nCause:\n");return(0,u.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:t})}function f({children:e}){return(0,u.jsx)(s.z,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:e})}function p({error:e,tryAgain:t}){return(0,u.jsx)(f,{children:(0,u.jsxs)(m,{fallback:()=>(0,u.jsx)(c,{error:e,tryAgain:t}),children:[(0,u.jsx)(o.Z,{children:(0,u.jsx)("title",{children:"Page Error"})}),(0,u.jsx)(l.Z,{children:(0,u.jsx)(c,{error:e,tryAgain:t})})]})})}class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){let{children:e}=this.props,{error:t}=this.state;return t?(this.props.fallback??(e=>(0,u.jsx)(p,{...e})))({error:t,tryAgain:()=>this.setState({error:null})}):e??null}}},24011:function(e,t,n){"use strict";n.d(t,{Z:()=>a});let r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},34903:function(e,t,n){"use strict";n.d(t,{Z:()=>o}),n(67294);var r=n(70405),a=n(85893);function o(e){return(0,a.jsx)(r.ql,{...e})}},50436:function(e,t,n){"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(73727),o=n(3143),i=n(72442),l=n(60011),s=n(24011),u=n(66575),c=n(8043),d=n(85893);let f=r.forwardRef(function({isNavLink:e,to:t,href:n,activeClassName:f,isActive:p,"data-noBrokenLinkCheck":m,autoAddBaseUrl:h=!0,...g},b){var y;let{siteConfig:v}=(0,i.default)(),{trailingSlash:k,baseUrl:w}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,c.Cg)(),E=(0,u.Z)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(b,()=>_.current);let C=t||n,T=(0,l.Z)(C),P=C?.replace("pathname://",""),A=void 0!==P?(y=P,h&&y.startsWith("/")?S(y):y):void 0;"hash"===x&&A?.startsWith("./")&&(A=A?.slice(1)),A&&T&&(A=(0,o.applyTrailingSlash)(A,{trailingSlash:k,baseUrl:w}));let O=(0,r.useRef)(!1),L=e?a.OL:a.rU,j=s.Z.canUseIntersectionObserver,N=(0,r.useRef)(),R=()=>{O.current||null==A||(window.docusaurus.preload(A),O.current=!0)};(0,r.useEffect)(()=>(!j&&T&&s.Z.canUseDOM&&null!=A&&window.docusaurus.prefetch(A),()=>{j&&N.current&&N.current.disconnect()}),[N,A,j,T]);let I=A?.startsWith("#")??!1,F=!g.target||"_self"===g.target,D=!A||!T||!F||I&&"hash"!==x;m||!I&&D||E.collectLink(A),g.id&&E.collectAnchor(g.id);let z={};return D?(0,d.jsx)("a",{ref:_,href:A,...C&&!T&&{target:"_blank",rel:"noopener noreferrer"},...g,...z}):(0,d.jsx)(L,{...g,onMouseEnter:R,onTouchStart:R,innerRef:e=>{_.current=e,j&&e&&T&&(N.current=new window.IntersectionObserver(t=>{t.forEach(t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))})}),N.current.observe(e))},to:A,...e&&{isActive:p,activeClassName:f},...z})})},14709:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>u,translate:()=>s});var r=n(67294),a=n(85893);function o(e,t){let n=e.split(/(\{\w+\})/).map((e,n)=>{if(n%2==1){let n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e});return n.some(e=>(0,r.isValidElement)(e))?n.map((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e).filter(e=>""!==e):n.join("")}var i=n(62627);function l({id:e,message:t}){if(void 0===e&&void 0===t)throw Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[e??t]??t??e}function s({message:e,id:t},n){return o(l({message:e,id:t}),n)}function u({children:e,id:t,values:n}){if(e&&"string"!=typeof e)throw console.warn("Illegal <Translate> children",e),Error("The Docusaurus <Translate> component only accept simple string values");let r=l({message:e,id:t});return(0,a.jsx)(a.Fragment,{children:o(r,n)})}},44593:function(e,t,n){"use strict";n.d(t,{m:()=>r});let r="default"},60011:function(e,t,n){"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},8043:function(e,t,n){"use strict";n.d(t,{Cg:()=>i,ZP:()=>l});var r=n(67294),a=n(72442),o=n(60011);function i(){let{siteConfig:e}=(0,a.default)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router;return{withBaseUrl:(0,r.useCallback)((e,r)=>(function({siteUrl:e,baseUrl:t,url:n,options:{forcePrependBaseUrl:r=!1,absolute:a=!1}={},router:i}){if(!n||n.startsWith("#")||(0,o.b)(n))return n;if("hash"===i)return n.startsWith("/")?`.${n}`:`./${n}`;if(r)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;let l=n.startsWith(t)?n:t+n.replace(/^\//,"");return a?e+l:l})({siteUrl:n,baseUrl:t,url:e,options:r,router:i}),[n,t,i])}}function l(e,t={}){let{withBaseUrl:n}=i();return n(e,t)}},66575:function(e,t,n){"use strict";n.d(t,{Z:()=>o});var r=n(67294);n(85893);let a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}});function o(){return(0,r.useContext)(a)}},72442:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(67294),a=n(41507);function o(){return(0,r.useContext)(a._)}},87039:function(e,t,n){"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(34639);function o(){return(0,r.useContext)(a._)}},30671:function(e,t,n){"use strict";n.d(t,{Z:()=>a});var r=n(67294);let a=n(24011).Z.canUseDOM?r.useLayoutEffect:r.useEffect},90095:function(e,t,n){"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(15340);function o(){let e=r.useContext(a._);if(!e)throw Error("Unexpected: no Docusaurus route context found");return e}},65571:function(e,t,n){"use strict";function r(e){let t={};return!function e(n,r){Object.entries(n).forEach(([n,a])=>{let o=r?`${r}.${n}`:n;"object"==typeof a&&a&&Object.keys(a).length>0?e(a,o):t[o]=a})}(e),t}n.d(t,{Z:()=>r})},15340:function(e,t,n){"use strict";n.d(t,{_:()=>o,z:()=>i});var r=n(67294),a=n(85893);let o=r.createContext(null);function i({children:e,value:t}){let n=r.useContext(o),i=(0,r.useMemo)(()=>(function({parent:e,value:t}){if(!e){if(t){if(!("plugin"in t))throw Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute")}else throw Error("Unexpected: no Docusaurus route context found");return t}let n={...e.data,...t?.data};return{plugin:e.plugin,data:n}})({parent:n,value:t}),[n,t]);return(0,a.jsx)(o.Provider,{value:i,children:e})}},49758:function(e,t,n){"use strict";n.d(t,{J:()=>h,L5:()=>p,Oh:()=>g});var r=n(67294),a=n(86055),o=n(44593),i=n(21641),l=n(16181),s=n(73436),u=n(85893);let c=e=>`docs-preferred-version-${e}`,d=r.createContext(null);function f({children:e}){let t=function(){let e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)(()=>Object.keys(e),[e]),[o,s]=(0,r.useState)(()=>Object.fromEntries(n.map(e=>[e,{preferredVersionName:null}])));return(0,r.useEffect)(()=>{s(function({pluginIds:e,versionPersistence:t,allDocsData:n}){return Object.fromEntries(e.map(e=>[e,function(e){var r,a;let o,i,s=(o=e,i=t,(0,l.WA)(c(o),{persistence:i}).get());return n[e].versions.some(e=>e.name===s)?{preferredVersionName:s}:(r=e,a=t,(0,l.WA)(c(r),{persistence:a}).del(),{preferredVersionName:null})}(e)]))}({allDocsData:e,versionPersistence:t,pluginIds:n}))},[e,t,n]),[o,(0,r.useMemo)(()=>({savePreferredVersion:function(e,n){var r,a,o;r=e,a=t,o=n,(0,l.WA)(c(r),{persistence:a}).set(o),s(t=>({...t,[e]:{preferredVersionName:n}}))}}),[t])]}();return(0,u.jsx)(d.Provider,{value:t,children:e})}function p({children:e}){return(0,u.jsx)(f,{children:e})}function m(){let e=(0,r.useContext)(d);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function h(e=o.m){let t=(0,a.zh)(e),[n,i]=m(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find(e=>e.name===l)??null,savePreferredVersionName:(0,r.useCallback)(t=>{i.savePreferredVersion(e,t)},[i,e])}}function g(){let e=(0,a._r)(),[t]=m();return Object.fromEntries(Object.keys(e).map(n=>[n,function(n){let r=e[n],{preferredVersionName:a}=t[n];return r.versions.find(e=>e.name===a)??null}(n)]))}},41014:function(e,t,n){"use strict";n.d(t,{J:()=>o,z:()=>i});var r=n(86055),a=n(49758);function o(e,t){return`docs-${e}-${t}`}function i(){let e=(0,r._r)(),t=(0,r.WS)(),n=(0,a.Oh)();return[...Object.keys(e).map(function(r){let a=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],l=e[r].versions.find(e=>e.isLast);return o(r,(a??i??l).name)})]}},65057:function(e,t,n){"use strict";n.d(t,{V:()=>u,b:()=>s});var r=n(67294),a=n(73436),o=n(85893);let i=Symbol("EmptyContext"),l=r.createContext(i);function s({children:e,name:t,items:n}){let a=(0,r.useMemo)(()=>t&&n?{name:t,items:n}:null,[t,n]);return(0,o.jsx)(l.Provider,{value:a,children:e})}function u(){let e=(0,r.useContext)(l);if(e===i)throw new a.i6("DocsSidebarProvider");return e}},7035:function(e,t,n){"use strict";n.d(t,{LM:()=>p,MN:()=>_,Ok:()=>h,SN:()=>E,_F:()=>b,f:()=>y,jA:()=>m,lO:()=>w,oz:()=>x,s1:()=>k,vY:()=>S,xz:()=>f});var r=n(67294),a=n(16550),o=n(18790),i=n(86055),l=n(27765),s=n(73721),u=n(49758),c=n(60464),d=n(65057);function f(e){let t=(0,c.E)();if(!e)return;let n=t.docs[e];if(!n)throw Error(`no version doc found by id=${e}`);return n}function p(e){if("link"===e.type&&!e.unlisted)return e.href;if("category"===e.type){if(e.href&&!e.linkUnlisted)return e.href;for(let t of e.items){let e=p(t);if(e)return e}return}}function m(){let{pathname:e}=(0,a.TH)(),t=(0,d.V)();if(!t)throw Error("Unexpected: cant find current sidebar in context");let n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}function h(){let{pathname:e}=(0,a.TH)(),t=(0,d.V)();if(!t)throw Error("Unexpected: cant find current sidebar in context");let n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];return n?.items??t.items}let g=(e,t)=>void 0!==e&&(0,l.Mg)(e,t);function b(e,t){if("link"===e.type)return g(e.href,t);if("category"===e.type){let n;return g(e.href,t)||(n=e.items,n.some(e=>b(e,t)))}return!1}function y(e,t){return(0,r.useMemo)(()=>e.filter(e=>(function e(t,n){switch(t.type){case"category":return b(t,n)||void 0!==t.href&&!t.linkUnlisted||t.items.some(t=>e(t,n));case"link":return!t.unlisted||b(t,n);default:return!0}})(e,t)),[e,t])}function v({sidebarItems:e,pathname:t,onlyCategories:n=!1}){let r=[];return!function e(a){for(let o of a)if("category"===o.type&&((0,l.Mg)(o.href,t)||e(o.items))||"link"===o.type&&(0,l.Mg)(o.href,t))return n&&"category"!==o.type||r.unshift(o),!0;return!1}(e),r}function k(){let e=(0,d.V)(),{pathname:t}=(0,a.TH)();return!1!==(0,i.gA)()?.pluginData.breadcrumbs&&e?v({sidebarItems:e.items,pathname:t}):null}function w(e){let{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,u.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)(()=>(0,s.jj)([t,n,a].filter(Boolean)),[t,n,a])}function x(e,t){let n=w(t);return(0,r.useMemo)(()=>{let t=n.flatMap(e=>e.sidebars?Object.entries(e.sidebars):[]),r=t.find(t=>t[0]===e);if(!r)throw Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map(e=>e.name).join(", ")}". 28 28 Available sidebar ids are: 29 29 - ${t.map(e=>e[0]).join("\n- ")}`);return r[1]},[e,n])}function S(e,t){let n=w(t);return(0,r.useMemo)(()=>{let t=n.flatMap(e=>e.docs),r=t.find(t=>t.id===e);if(!r){if(n.flatMap(e=>e.draftIds).includes(e))return null;throw Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map(e=>e.name).join(", ")}". 30 30 Available doc ids are: ··· 35 35 ${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(eN,{...e})},t))})}function eW({left:e,right:t}){return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:(0,a.Z)(h.k.layout.navbar.containerLeft,"navbar__items"),children:e}),(0,c.jsx)("div",{className:(0,a.Z)(h.k.layout.navbar.containerRight,"navbar__items navbar__items--right"),children:t})]})}function eq(){let e=(0,E.e)(),t=(0,y.L)().navbar.items,[n,r]=function(e){function t(e){return(e.position??"right")==="left"}return[e.filter(t),e.filter(e=>!t(e))]}(t),a=t.find(e=>"search"===e.type);return(0,c.jsx)(eW,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(eZ,{}),(0,c.jsx)(Q,{}),(0,c.jsx)(eV,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(eV,{items:r}),(0,c.jsx)(U,{className:"colorModeToggle_DEke"}),!a&&(0,c.jsx)(eP,{children:(0,c.jsx)(eT,{})})]})})}function eG(){return(0,c.jsx)(eM,{children:(0,c.jsx)(eq,{})})}function eY({item:e}){let{to:t,href:n,label:r,prependBaseUrlToHref:o,className:i,...l}=e,s=(0,q.ZP)(t),u=(0,q.ZP)(n,{forcePrependBaseUrl:!0});return(0,c.jsxs)(W.Z,{className:(0,a.Z)("footer__link-item",i),...n?{href:o?u:n}:{to:s},...l,children:[r,n&&!(0,G.Z)(n)&&(0,c.jsx)(K.Z,{})]})}function eK({item:e}){return e.html?(0,c.jsx)("li",{className:(0,a.Z)("footer__item",e.className),dangerouslySetInnerHTML:{__html:e.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(eY,{item:e})},e.href??e.to)}function eX({column:e}){return(0,c.jsxs)("div",{className:(0,a.Z)(h.k.layout.footer.column,"col footer__col",e.className),children:[(0,c.jsx)("div",{className:"footer__title",children:e.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:e.items.map((e,t)=>(0,c.jsx)(eK,{item:e},t))})]})}function eJ({columns:e}){return(0,c.jsx)("div",{className:"row footer__links",children:e.map((e,t)=>(0,c.jsx)(eX,{column:e},t))})}function e0(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function e1({item:e}){return e.html?(0,c.jsx)("span",{className:(0,a.Z)("footer__link-item",e.className),dangerouslySetInnerHTML:{__html:e.html}}):(0,c.jsx)(eY,{item:e})}function e2({links:e}){return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:e.map((t,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(e1,{item:t}),e.length!==n+1&&(0,c.jsx)(e0,{})]},n))})})}function e4({links:e}){return"title"in e[0]?(0,c.jsx)(eJ,{columns:e}):(0,c.jsx)(e2,{links:e})}var e3=n(37507);function e6({logo:e}){let{withBaseUrl:t}=(0,q.Cg)(),n={light:t(e.src),dark:t(e.srcDark??e.src)};return(0,c.jsx)(e3.Z,{className:(0,a.Z)("footer__logo",e.className),alt:e.alt,sources:n,width:e.width,height:e.height,style:e.style})}function e9({logo:e}){return e.href?(0,c.jsx)(W.Z,{href:e.href,className:"footerLogoLink_BH7S",target:e.target,children:(0,c.jsx)(e6,{logo:e})}):(0,c.jsx)(e6,{logo:e})}function e8({copyright:e}){return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:e}})}function e5({style:e,links:t,logo:n,copyright:r}){return(0,c.jsx)("footer",{className:(0,a.Z)(h.k.layout.footer.container,"footer",{"footer--dark":"dark"===e}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[t,(n||r)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[n&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:n}),r]})]})})}let e7=r.memo(function(){let{footer:e}=(0,y.L)();if(!e)return null;let{copyright:t,links:n,logo:r,style:a}=e;return(0,c.jsx)(e5,{style:a,links:n&&n.length>0&&(0,c.jsx)(e4,{links:n}),logo:r&&(0,c.jsx)(e9,{logo:r}),copyright:t&&(0,c.jsx)(e8,{copyright:t})})}),te=(0,C.Qc)([N.S,v.p,_.OC,eO.L5,i.VC,function({children:e}){return(0,c.jsx)(T.n2,{children:(0,c.jsx)(E.M,{children:(0,c.jsx)(A,{children:e})})})}]);function tt({children:e}){return(0,c.jsx)(te,{children:e})}var tn=n(57509);function tr({error:e,tryAgain:t}){return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(tn.Z,{as:"h1",className:"hero__title",children:(0,c.jsx)(s.default,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(eB,{onClick:t,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(eU,{error:e})})]})})})}function ta(e){let{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,g.t)(),(0,c.jsxs)(tt,{children:[(0,c.jsx)(i.d,{title:l,description:s}),(0,c.jsx)(b,{}),(0,c.jsx)(S,{}),(0,c.jsx)(eG,{}),(0,c.jsx)("div",{id:d,className:(0,a.Z)(h.k.layout.main.container,h.k.wrapper.main,"mainWrapper_z2l0",r),children:(0,c.jsx)(o.default,{fallback:e=>(0,c.jsx)(tr,{...e}),children:t})}),!n&&(0,c.jsx)(e7,{})]})}},15661:function(e,t,n){"use strict";n.d(t,{Z:()=>c}),n(67294);var r=n(50436),a=n(8043),o=n(72442),i=n(21641),l=n(37507),s=n(85893);function u({logo:e,alt:t,imageClassName:n}){let r={light:(0,a.ZP)(e.src),dark:(0,a.ZP)(e.srcDark||e.src)},o=(0,s.jsx)(l.Z,{className:e.className,sources:r,height:e.height,width:e.width,alt:t,style:e.style});return n?(0,s.jsx)("div",{className:n,children:o}):o}function c(e){let{siteConfig:{title:t}}=(0,o.default)(),{navbar:{title:n,logo:l}}=(0,i.L)(),{imageClassName:c,titleClassName:d,...f}=e,p=(0,a.ZP)(l?.href||"/"),m=l?.alt??(n?"":t);return(0,s.jsxs)(r.Z,{to:p,...f,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(u,{logo:l,alt:m,imageClassName:c}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},13427:function(e,t,n){"use strict";n.d(t,{Z:()=>o}),n(67294);var r=n(34903),a=n(85893);function o({locale:e,version:t,tag:n}){return(0,a.jsxs)(r.Z,{children:[e&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:e}),t&&(0,a.jsx)("meta",{name:"docusaurus_version",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:n}),e&&(0,a.jsx)("meta",{name:"docsearch:language",content:e}),t&&(0,a.jsx)("meta",{name:"docsearch:version",content:t}),n&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:n})]})}},37507:function(e,t,n){"use strict";n.d(t,{Z:()=>c});var r=n(67294),a=n(67026),o=n(87039),i=n(35283);let l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(85893);function u({className:e,children:t}){let n=(0,o.Z)(),{colorMode:u}=(0,i.I)();return(0,s.jsx)(s.Fragment,{children:(n?"dark"===u?["dark"]:["light"]:["light","dark"]).map(n=>{let o=t({theme:n,className:(0,a.Z)(e,l.themedComponent,l[`themedComponent--${n}`])});return(0,s.jsx)(r.Fragment,{children:o},n)})})}function c(e){let{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(u,{className:n,children:({theme:e,className:n})=>(0,s.jsx)("img",{src:t[e],alt:r,className:n,...a})})}},98441:function(e,t,n){"use strict";n.d(t,{u:()=>l,z:()=>p});var r=n(67294),a=n(30671),o=n(39731),i=n(85893);function l({initialState:e}){let[t,n]=(0,r.useState)(e??!1),a=(0,r.useCallback)(()=>{n(e=>!e)},[]);return{collapsed:t,setCollapsed:n,toggleCollapsed:a}}let s={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function c(e,t){let n=t?s:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function d({as:e="div",collapsed:t,children:n,animation:a,onCollapseTransitionEnd:l,className:u}){let d=(0,r.useRef)(null);return!function({collapsibleRef:e,collapsed:t,animation:n}){let a=(0,r.useRef)(!1);(0,r.useEffect)(()=>{let r=e.current;function i(){let e=function(){let e=r.scrollHeight,t=n?.duration??function(e){if((0,o.n)())return 1;let t=e/36;return Math.round((4+15*t**.25+t/5)*10)}(e),a=n?.easing??"ease-in-out";return{transition:`height ${t}ms ${a}`,height:`${e}px`}}();r.style.transition=e.transition,r.style.height=e.height}if(!a.current){c(r,t),a.current=!0;return}r.style.willChange="height";let l=requestAnimationFrame(()=>{t?(i(),requestAnimationFrame(()=>{r.style.height=s.height,r.style.overflow=s.overflow})):(r.style.display="block",requestAnimationFrame(()=>{i()}))});return()=>cancelAnimationFrame(l)},[e,t,n])}({collapsibleRef:d,collapsed:t,animation:a}),(0,i.jsx)(e,{ref:d,onTransitionEnd:e=>{"height"===e.propertyName&&(c(d.current,t),l?.(t))},className:u,children:n})}function f({collapsed:e,...t}){let[n,o]=(0,r.useState)(!e),[l,s]=(0,r.useState)(e);return(0,a.Z)(()=>{e||o(!0)},[e]),(0,a.Z)(()=>{n&&s(e)},[n,e]),n?(0,i.jsx)(d,{...t,collapsed:l}):null}function p({lazy:e,...t}){return(0,i.jsx)(e?f:d,{...t})}},60302:function(e,t,n){"use strict";n.d(t,{n:()=>h,p:()=>m});var r=n(67294),a=n(87039),o=n(16181),i=n(73436),l=n(21641),s=n(85893);let u=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),d=()=>"true"===u.get(),f=e=>u.set(String(e)),p=r.createContext(null);function m({children:e}){let t=function(){let{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)(()=>!!t&&d());(0,r.useEffect)(()=>{o(d())},[]);let i=(0,r.useCallback)(()=>{f(!0),o(!0)},[]);return(0,r.useEffect)(()=>{if(!e)return;let{id:t}=e,n=c.get();"annoucement-bar"===n&&(n="announcement-bar");let r=t!==n;c.set(t),r&&f(!1),(r||!d())&&o(!1)},[e]),(0,r.useMemo)(()=>({isActive:!!e&&!n,close:i}),[e,n,i])}();return(0,s.jsx)(p.Provider,{value:t,children:e})}function h(){let e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},35283:function(e,t,n){"use strict";n.d(t,{I:()=>b,S:()=>g});var r=n(67294),a=n(73436),o=n(16181),i=n(21641),l=n(85893);function s(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}let u=r.createContext(void 0),c=(0,o.WA)("theme"),d="system",f=e=>"dark"===e?"dark":"light",p=e=>null===e||e===d?null:f(e),m=e=>{document.documentElement.setAttribute("data-theme",f(e))},h=e=>{document.documentElement.setAttribute("data-theme-choice",p(e)??d)};function g({children:e}){let t=function(){let{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,i.L)(),{colorMode:a,setColorModeState:o,colorModeChoice:l,setColorModeChoiceState:u}=function(){let{colorMode:{defaultMode:e}}=(0,i.L)(),[t,n]=(0,r.useState)(e),[a,o]=(0,r.useState)(null);return(0,r.useEffect)(()=>{n(f(document.documentElement.getAttribute("data-theme"))),o(p(document.documentElement.getAttribute("data-theme-choice")))},[]),{colorMode:t,setColorModeState:n,colorModeChoice:a,setColorModeChoiceState:o}}();(0,r.useEffect)(()=>{t&&c.del()},[t]);let d=(0,r.useCallback)((t,r={})=>{let{persist:a=!0}=r;if(null===t){let t=n?s():e;m(t),o(t),h(null),u(null)}else m(t),h(t),o(t),u(t);a&&(null===t?c.del():c.set(f(t)))},[o,u,n,e]);return(0,r.useEffect)(()=>c.listen(e=>{d(p(e.newValue))}),[d]),(0,r.useEffect)(()=>{if(null===l&&n){var e=e=>{o(e),m(e)},t=()=>e(s());let n=window.matchMedia("(prefers-color-scheme: dark)");return n.addEventListener("change",t),()=>n.removeEventListener("change",t)}},[n,l,o]),(0,r.useMemo)(()=>({colorMode:a,colorModeChoice:l,setColorMode:d,get isDarkTheme(){return"dark"===a},setLightTheme(){d("light")},setDarkTheme(){d("dark")}}),[a,l,d])}();return(0,l.jsx)(u.Provider,{value:t,children:e})}function b(){let e=(0,r.useContext)(u);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},91993:function(e,t,n){"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(67294),a=n(64586),o=n(1868),i=n(44874),l=n(21641),s=n(73436),u=n(85893);let c=r.createContext(void 0);function d({handler:e}){return(0,i.Rb)(e),null}function f({children:e}){let t=function(){let e=function(){let e=(0,a.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,s]=(0,r.useState)(!1),u=(0,r.useCallback)(()=>{s(e=>!e)},[]);return(0,r.useEffect)(()=>{"desktop"===t&&s(!1)},[t]),(0,r.useMemo)(()=>({disabled:e,shouldRender:n,toggle:u,shown:i}),[e,n,u,i])}();return(0,u.jsxs)(u.Fragment,{children:[t.shown&&(0,u.jsx)(d,{handler:()=>(t.toggle(),!1)}),(0,u.jsx)(c.Provider,{value:t,children:e})]})}function p(){let e=r.useContext(c);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},64586:function(e,t,n){"use strict";n.d(t,{HY:()=>s,Zo:()=>u,n2:()=>l});var r=n(67294),a=n(73436),o=n(85893);let i=r.createContext(null);function l({children:e}){let t=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:t,children:e})}function s(){let e=(0,r.useContext)(i);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function u({component:e,props:t}){let n=(0,r.useContext)(i);if(!n)throw new a.i6("NavbarSecondaryMenuContentProvider");let[,o]=n,l=(0,a.Ql)(t);return(0,r.useEffect)(()=>{o({component:e,props:l})},[o,e,l]),(0,r.useEffect)(()=>()=>o({component:null,props:null}),[o]),null}},96825:function(e,t,n){"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(67294);let a="navigation-with-keyboard";function o(){(0,r.useEffect)(()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}},[])}},1868:function(e,t,n){"use strict";n.d(t,{i:()=>o});var r=n(67294),a=n(24011);function o({desktopBreakpoint:e=996}={}){let[t,n]=(0,r.useState)(()=>"ssr");return(0,r.useEffect)(()=>{function t(){n(function(e){if(!a.Z.canUseDOM)throw Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?"desktop":"mobile"}(e))}return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[e]),t}},34036:function(e,t,n){"use strict";n.d(t,{k:()=>r});let r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},announcementBar:{container:"theme-announcement-bar"},layout:{navbar:{container:"theme-layout-navbar",containerLeft:"theme-layout-navbar-left",containerRight:"theme-layout-navbar-right",mobileSidebar:{container:"theme-layout-navbar-sidebar",panel:"theme-layout-navbar-sidebar-panel"}},main:{container:"theme-layout-main"},footer:{container:"theme-layout-footer",column:"theme-layout-footer-column"}},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},39731:function(e,t,n){"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},44874:function(e,t,n){"use strict";n.d(t,{Rb:()=>i,_X:()=>l});var r=n(67294),a=n(16550),o=n(73436);function i(e){let t=(0,a.k6)(),n=(0,o.zX)((t,n)=>{if("POP"===n)return e(t,n)});(0,r.useEffect)(()=>t.block((e,t)=>n(e,t)),[t,n])}function l(e){var t=t=>null===e?null:new URLSearchParams(t.location.search).get(e);let n=(0,a.k6)();return(0,r.useSyncExternalStore)(n.listen,()=>t(n),()=>t(n))}},73721:function(e,t,n){"use strict";function r(e,t=(e,t)=>e===t){return e.filter((n,r)=>e.findIndex(e=>t(e,n))!==r)}function a(e){return Array.from(new Set(e))}n.d(t,{jj:()=>a,lx:()=>r})},64994:function(e,t,n){"use strict";n.d(t,{FG:()=>g,VC:()=>b,d:()=>m});var r=n(67294),a=n(67026),o=n(34903),i=n(90095),l=n(8043),s=n(54234),u=n(85893);function c({title:e}){let t=(0,s.pe)().format(e);return(0,u.jsxs)(o.Z,{children:[(0,u.jsx)("title",{children:t}),(0,u.jsx)("meta",{property:"og:title",content:t})]})}function d({description:e}){return(0,u.jsxs)(o.Z,{children:[(0,u.jsx)("meta",{name:"description",content:e}),(0,u.jsx)("meta",{property:"og:description",content:e})]})}function f({image:e}){let{withBaseUrl:t}=(0,l.Cg)(),n=t(e,{absolute:!0});return(0,u.jsxs)(o.Z,{children:[(0,u.jsx)("meta",{property:"og:image",content:n}),(0,u.jsx)("meta",{name:"twitter:image",content:n})]})}function p({keywords:e}){return(0,u.jsx)(o.Z,{children:(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(e)?e.join(","):e})})}function m({title:e,description:t,keywords:n,image:r,children:a}){return(0,u.jsxs)(u.Fragment,{children:[e&&(0,u.jsx)(c,{title:e}),t&&(0,u.jsx)(d,{description:t}),n&&(0,u.jsx)(p,{keywords:n}),r&&(0,u.jsx)(f,{image:r}),a&&(0,u.jsx)(o.Z,{children:a})]})}let h=r.createContext(void 0);function g({className:e,children:t}){let n=r.useContext(h),i=(0,a.Z)(n,e);return(0,u.jsxs)(h.Provider,{value:i,children:[(0,u.jsx)(o.Z,{children:(0,u.jsx)("html",{className:i})}),t]})}function b({children:e}){var t;let n=(0,i.Z)(),r=(t=n.plugin.name,`plugin-${t.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`),o=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(g,{className:(0,a.Z)(r,o),children:e})}},73436:function(e,t,n){"use strict";n.d(t,{D9:()=>l,Qc:()=>c,Ql:()=>u,i6:()=>s,zX:()=>i});var r=n(67294),a=n(30671),o=n(85893);function i(e){let t=(0,r.useRef)(e);return(0,a.Z)(()=>{t.current=e},[e]),(0,r.useCallback)((...e)=>t.current(...e),[])}function l(e){let t=(0,r.useRef)();return(0,a.Z)(()=>{t.current=e}),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function u(e){let t=Object.entries(e);return t.sort((e,t)=>e[0].localeCompare(t[0])),(0,r.useMemo)(()=>e,t.flat())}function c(e){return({children:t})=>(0,o.jsx)(o.Fragment,{children:e.reduceRight((e,t)=>(0,o.jsx)(t,{children:e}),t)})}},27765:function(e,t,n){"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(67294),a=n(84016),o=n(72442);function i(e,t){let n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){let{baseUrl:e}=(0,o.default)().siteConfig;return(0,r.useMemo)(()=>(function({baseUrl:e,routes:t}){function n(t){return t.path===e&&!0===t.exact}function r(t){return t.path===e&&!t.exact}return function e(t){if(0===t.length)return;let a=t.find(n);return a||e(t.filter(r).flatMap(e=>e.routes??[]))}(t)})({routes:a.Z,baseUrl:e}),[e])}},58037:function(e,t,n){"use strict";n.d(t,{Ct:()=>h,OC:()=>c,RF:()=>p,o5:()=>m});var r=n(67294),a=n(24011),o=n(87039),i=n(30671),l=n(73436),s=n(85893);let u=r.createContext(void 0);function c({children:e}){let t=function(){let e=(0,r.useRef)(!0);return(0,r.useMemo)(()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}}),[])}();return(0,s.jsx)(u.Provider,{value:t,children:e})}function d(){let e=(0,r.useContext)(u);if(null==e)throw new l.i6("ScrollControllerProvider");return e}let f=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t=[]){let{scrollEventsEnabledRef:n}=d(),a=(0,r.useRef)(f()),o=(0,l.zX)(e);(0,r.useEffect)(()=>{let e=()=>{if(!n.current)return;let e=f();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)},[o,n,...t])}function m(){let e=d(),t=function(){let e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)(t=>{e.current={elem:t,top:t.getBoundingClientRect().top}},[]),n=(0,r.useCallback)(()=>{let{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};let r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}},[]);return(0,r.useMemo)(()=>({save:t,restore:n}),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)(r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{let{restored:r}=t.restore();if(n.current=void 0,r){let t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}},[e,t]);return(0,i.Z)(()=>{queueMicrotask(()=>n.current?.())}),{blockElementScrollPositionUntilNextRender:a}}function h(){let e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?(window.scrollTo({top:n,behavior:"smooth"}),()=>{}):function(e){let t=null,n=document.documentElement.scrollTop>e;return!function r(){let a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor((a-e)*.85)+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},16181:function(e,t,n){"use strict";n.d(t,{WA:()=>u,Nk:()=>c});var r=n(67294),a=JSON.parse('{"d":"localStorage","u":""}');let o=a.d;function i({key:e,oldValue:t,newValue:n,storage:r}){if(t===n)return;let a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,e,t,n,window.location.href,r),window.dispatchEvent(a)}let l=!1,s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){let n=`${e}${a.u}`;if("undefined"==typeof window){function r(){throw Error(`Illegal storage API usage for storage key "${n}". 36 36 Docusaurus storage APIs are not supposed to be called on the server-rendering process. 37 37 Please only call storage APIs in effects and event handlers.`)}return{get:r,set:r,del:r,listen:r}}let u=function(e=o){if("undefined"==typeof window)throw Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(e){var t;return t=e,l||(console.warn(`Docusaurus browser storage is not available. 38 - Possible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.`,t),l=!0),null}}(t?.persistence);return null===u?s:{get:()=>{try{return u.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{let t=u.getItem(n);u.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:u})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{let e=u.getItem(n);u.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:u})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{let t=t=>{t.storageArea===u&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(e){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,e),()=>{}}}}}function c(e,t){let[n]=(0,r.useState)(()=>null===e?s:u(e,t)),a=(0,r.useCallback)(e=>"undefined"==typeof window?()=>{}:n.listen(e),[n]);return[(0,r.useSyncExternalStore)(a,()=>n.get(),()=>null),n]}},54234:function(e,t,n){"use strict";n.d(t,{D:()=>c,pe:()=>d});var r=n(67294),a=n(72442),o=n(90095),i=n(73436),l=n(85893);let s=({title:e,siteTitle:t,titleDelimiter:n})=>{let r=e?.trim();return r&&r!==t?`${r} ${n} ${t}`:t},u=(0,r.createContext)(null);function c({formatter:e,children:t}){return(0,l.jsx)(u.Provider,{value:e,children:t})}function d(){let e=function(){let e=(0,r.useContext)(u);if(null===e)throw new i.i6("TitleFormatterProvider");return e}(),{siteConfig:t}=(0,a.default)(),{title:n,titleDelimiter:l}=t,{plugin:c}=(0,o.Z)();return{format:t=>e({title:t,siteTitle:n,titleDelimiter:l,plugin:c,defaultFormatter:s})}}},93786:function(e,t,n){"use strict";n.d(t,{l:()=>i});var r=n(72442),a=n(16550),o=n(3143);function i(){let{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.default)(),{pathname:s}=(0,a.TH)(),u=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function({locale:e,fullyQualified:n}){return`${n?t:""}${e===i?`${c}`:`${c}${e}/`}${d}`}}}},89475:function(e,t,n){"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),o=n(73436);function i(e){let t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)(()=>{n&&t!==n&&i({location:t,previousLocation:n})},[i,t,n])}},21641:function(e,t,n){"use strict";n.d(t,{L:()=>a});var r=n(72442);function a(){return(0,r.default)().siteConfig.themeConfig}},51421:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=a,t.default=function(e,t){let{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#")||void 0===n)return e;let[i]=e.split(/[#?]/),l="/"===i||i===r?i:n?a(i):o(i);return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o;let r=n(31846);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}},89064:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},3143:function(e,t,n){"use strict";t.getErrorCausalChain=t.applyTrailingSlash=void 0;let r=n(28395);var a=n(51421);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r.__importDefault(a).default}}),n(31846);var o=n(89064);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},31846:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},56358:function(e,t,n){"use strict";n.d(t,{Z:()=>o}),n(67294);var r=n(67026),a=n(85893);function o({className:e}){return(0,a.jsxs)("div",{className:(0,r.Z)("loadingRing_RJI3",e),children:[(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{})]})}},59430:function(e,t,n){"use strict";let r;n.d(t,{r:()=>S,a:()=>E});let a=Symbol("Comlink.proxy"),o=Symbol("Comlink.endpoint"),i=Symbol("Comlink.releaseProxy"),l=Symbol("Comlink.finalizer"),s=Symbol("Comlink.thrown"),u=e=>"object"==typeof e&&null!==e||"function"==typeof e,c=new Map([["proxy",{canHandle:e=>u(e)&&e[a],serialize(e){let{port1:t,port2:n}=new MessageChannel;return function e(t,n=globalThis,r=["*"]){n.addEventListener("message",function o(i){let u;if(!i||!i.data)return;if(!function(e,t){for(let n of e)if(t===n||"*"===n||n instanceof RegExp&&n.test(t))return!0;return!1}(r,i.origin))return void console.warn(`Invalid origin '${i.origin}' for comlink proxy`);let{id:c,type:f,path:p}=Object.assign({path:[]},i.data),m=(i.data.argumentList||[]).map(k);try{var h,g,b;let n=p.slice(0,-1).reduce((e,t)=>e[t],t),r=p.reduce((e,t)=>e[t],t);switch(f){case"GET":u=r;break;case"SET":n[p.slice(-1)[0]]=k(i.data.value),u=!0;break;case"APPLY":u=r.apply(n,m);break;case"CONSTRUCT":h=new r(...m),u=Object.assign(h,{[a]:!0});break;case"ENDPOINT":{let{port1:n,port2:r}=new MessageChannel;e(t,r),g=n,b=[n],y.set(g,b),u=g}break;case"RELEASE":u=void 0;break;default:return}}catch(e){u={value:e,[s]:0}}Promise.resolve(u).catch(e=>({value:e,[s]:0})).then(e=>{let[r,a]=v(e);n.postMessage(Object.assign(Object.assign({},r),{id:c}),a),"RELEASE"===f&&(n.removeEventListener("message",o),d(n),l in t&&"function"==typeof t[l]&&t[l]())}).catch(e=>{let[t,r]=v({value:TypeError("Unserializable return value"),[s]:0});n.postMessage(Object.assign(Object.assign({},t),{id:c}),r)})}),n.start&&n.start()}(e,t),[n,[n]]},deserialize:e=>(e.start(),f(e))}],["throw",{canHandle:e=>u(e)&&s in e,serialize:({value:e})=>[e instanceof Error?{isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:{isError:!1,value:e},[]],deserialize(e){if(e.isError)throw Object.assign(Error(e.value.message),e.value);throw e.value}}]]);function d(e){"MessagePort"===e.constructor.name&&e.close()}function f(e,t){let n=new Map;return e.addEventListener("message",function(e){let{data:t}=e;if(!t||!t.id)return;let r=n.get(t.id);if(r)try{r(t)}finally{n.delete(t.id)}}),function e(t,n,r=[],a=function(){}){let l=!1,s=new Proxy(a,{get(a,o){if(p(l),o===i)return()=>{g&&g.unregister(s),m(t),n.clear(),l=!0};if("then"===o){if(0===r.length)return{then:()=>s};let e=w(t,n,{type:"GET",path:r.map(e=>e.toString())}).then(k);return e.then.bind(e)}return e(t,n,[...r,o])},set(e,a,o){p(l);let[i,s]=v(o);return w(t,n,{type:"SET",path:[...r,a].map(e=>e.toString()),value:i},s).then(k)},apply(a,i,s){p(l);let u=r[r.length-1];if(u===o)return w(t,n,{type:"ENDPOINT"}).then(k);if("bind"===u)return e(t,n,r.slice(0,-1));let[c,d]=b(s);return w(t,n,{type:"APPLY",path:r.map(e=>e.toString()),argumentList:c},d).then(k)},construct(e,a){p(l);let[o,i]=b(a);return w(t,n,{type:"CONSTRUCT",path:r.map(e=>e.toString()),argumentList:o},i).then(k)}}),u=(h.get(t)||0)+1;return h.set(t,u),g&&g.register(s,t,s),s}(e,n,[],t)}function p(e){if(e)throw Error("Proxy has been released and is not useable")}function m(e){return w(e,new Map,{type:"RELEASE"}).then(()=>{d(e)})}let h=new WeakMap,g="FinalizationRegistry"in globalThis&&new FinalizationRegistry(e=>{let t=(h.get(e)||0)-1;h.set(e,t),0===t&&m(e)});function b(e){var t;let n=e.map(v);return[n.map(e=>e[0]),(t=n.map(e=>e[1]),Array.prototype.concat.apply([],t))]}let y=new WeakMap;function v(e){for(let[t,n]of c)if(n.canHandle(e)){let[r,a]=n.serialize(e);return[{type:"HANDLER",name:t,value:r},a]}return[{type:"RAW",value:e},y.get(e)||[]]}function k(e){switch(e.type){case"HANDLER":return c.get(e.name).deserialize(e.value);case"RAW":return e.value}}function w(e,t,n,r){return new Promise(a=>{let o=[,,,,].fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");t.set(o,a),e.start&&e.start(),e.postMessage(Object.assign({id:o},n),r)})}function x(){return r||(r=(async()=>{let e=f(new Worker(new URL(n.p+n.u("7971"),n.b)));return await new e})()),r}async function S(e,t){{let n=await x();await n.fetchIndexes(e,t)}}async function E(e,t,n,r){return(await x()).search(e,t,n,r)}},77160:function(e,t,n){"use strict";function r(e){return e.join(" \u203A ")}n.d(t,{e:()=>r})},68119:function(e,t,n){"use strict";function r(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}n.d(t,{X:()=>r})},557:function(e,t,n){"use strict";function r(e,t){let n=[];for(let r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort((e,t)=>e[0]-t[0]||t[1]-e[1])}n.d(t,{m:()=>r})},70203:function(e,t,n){"use strict";n.d(t,{C:()=>function e(t,n,a){let o=[];for(let a of n){let i=t.toLowerCase().indexOf(a);if(i>=0){i>0&&o.push(e(t.substr(0,i),n)),o.push(`<mark>${(0,r.X)(t.substr(i,a.length))}</mark>`);let l=i+a.length;l<t.length&&o.push(e(t.substr(l),n));break}}return 0===o.length?a?`<mark>${(0,r.X)(t)}</mark>`:(0,r.X)(t):o.join("")}});var r=n(68119)},68064:function(e,t,n){"use strict";n.d(t,{o:()=>s});var r=n(68119),a=n(70203);let o=/\w+|\p{Unified_Ideograph}/u;function i(e){let t=[],n=0,r=e;for(;r.length>0;){let a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var l=n(97642);function s(e,t,n,o=l.Hk){let{chunkIndex:u,chunks:c}=function(e,t,n){let o=[],l=0,s=0,u=-1;for(;l<t.length;){let[c,d]=t[l];if(l+=1,!(c<s)){if(c>s)for(let t of i(e.substring(s,c)).map(e=>({html:(0,r.X)(e),textLength:e.length})))o.push(t);-1===u&&(u=o.length),s=c+d,o.push({html:(0,a.C)(e.substring(c,s),n,!0),textLength:d})}}if(s<e.length)for(let t of i(e.substring(s)).map(e=>({html:(0,r.X)(e),textLength:e.length})))o.push(t);return{chunkIndex:u,chunks:o}}(e,t,n),d=c.slice(0,u),f=c[u],p=[f.html],m=c.slice(u+1),h=f.textLength,g=0,b=0,y=!1,v=!1;for(;h<o;)if((g<=b||0===m.length)&&d.length>0){let e=d.pop();h+e.textLength<=o?(p.unshift(e.html),g+=e.textLength,h+=e.textLength):(y=!0,d.length=0)}else if(m.length>0){let e=m.shift();h+e.textLength<=o?(p.push(e.html),b+=e.textLength,h+=e.textLength):(v=!0,m.length=0)}else break;return(y||d.length>0)&&p.unshift("\u2026"),(v||m.length>0)&&p.push("\u2026"),p.join("")}},43393:function(e,t,n){"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{let{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{_:()=>r})},56861:function(e,t,n){"use strict";var r,a;n.d(t,{P:()=>r}),(a=r||(r={}))[a.Title=0]="Title",a[a.Heading=1]="Heading",a[a.Description=2]="Description",a[a.Keywords=3]="Keywords",a[a.Content=4]="Content"},31381:function(e,t,n){"use strict";n.d(t,{ob:()=>p,Ep:()=>f,q_:()=>C,lX:()=>k,PP:()=>P});var r=n(16019);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;n+=1,r+=1)e[n]=e[r];e.pop()}let i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&a(e),s=t&&a(t),u=l||s;if(e&&a(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var c=i[i.length-1];n="."===c||".."===c||""===c}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(21835);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o,l,s,u,c,d;"string"==typeof e?(s="",u="",-1!==(c=(l=e||"/").indexOf("#"))&&(u=l.substr(c),l=l.substr(0,c)),-1!==(d=l.indexOf("?"))&&(s=l.substr(d),l=l.substr(0,d)),(o={pathname:l,search:"?"===s?"":s,hash:"#"===u?"":u}).state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(e){if(e instanceof URIError)throw URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.');throw e}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null,t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter(function(e){return e!==r})}},notifyListeners:function(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach(function(e){return e.apply(void 0,n)})}}}var h=!!("undefined"!=typeof window&&window.document&&window.document.createElement);function g(e,t){t(window.confirm(e))}var b="popstate",y="hashchange";function v(){try{return window.history.state||{}}catch(e){return{}}}function k(e){void 0===e&&(e={}),h||(0,l.Z)(!1);var t,n=window.history,a=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=-1!==window.navigator.userAgent.indexOf("Trident"),i=e,u=i.forceRefresh,k=void 0!==u&&u,w=i.getUserConfirmation,x=void 0===w?g:w,S=i.keyLength,E=void 0===S?6:S,_=e.basename?d(s(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return _&&(o=c(o,_)),p(o,r,n)}function T(){return Math.random().toString(36).substr(2,E)}var P=m();function A(e){(0,r.Z)(B,e),B.length=n.length,P.notifyListeners(B.location,B.action)}function O(e){(void 0!==e.state||-1!==navigator.userAgent.indexOf("CriOS"))&&N(C(e.state))}function L(){N(C(v()))}var j=!1;function N(e){j?(j=!1,A()):P.confirmTransitionTo(e,"POP",x,function(t){var n,r,a,o,i;t?A({action:"POP",location:e}):(n=e,r=B.location,-1===(a=I.indexOf(r.key))&&(a=0),-1===(o=I.indexOf(n.key))&&(o=0),(i=a-o)&&(j=!0,D(i)))})}var R=C(v()),I=[R.key];function F(e){return _+f(e)}function D(e){n.go(e)}var z=0;function M(e){1===(z+=e)&&1===e?(window.addEventListener(b,O),o&&window.addEventListener(y,L)):0===z&&(window.removeEventListener(b,O),o&&window.removeEventListener(y,L))}var $=!1,B={length:n.length,action:"POP",location:R,createHref:F,push:function(e,t){var r="PUSH",o=p(e,t,T(),B.location);P.confirmTransitionTo(o,r,x,function(e){if(e){var t=F(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),k)window.location.href=t;else{var s=I.indexOf(B.location.key),u=I.slice(0,s+1);u.push(o.key),I=u,A({action:r,location:o})}else window.location.href=t}})},replace:function(e,t){var r="REPLACE",o=p(e,t,T(),B.location);P.confirmTransitionTo(o,r,x,function(e){if(e){var t=F(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),k)window.location.replace(t);else{var s=I.indexOf(B.location.key);-1!==s&&(I[s]=o.key),A({action:r,location:o})}else window.location.replace(t)}})},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=P.setPrompt(e);return $||(M(1),$=!0),function(){return $&&($=!1,M(-1)),t()}},listen:function(e){var t=P.appendListener(e);return M(1),function(){M(-1),t()}}};return B}var w="hashchange",x={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+u(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:u,decodePath:s},slash:{encodePath:s,decodePath:s}};function S(e){var t=e.indexOf("#");return -1===t?e:e.slice(0,t)}function E(){var e=window.location.href,t=e.indexOf("#");return -1===t?"":e.substring(t+1)}function _(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),h||(0,l.Z)(!1);var t=window.history;window.navigator.userAgent.indexOf("Firefox");var n=e,a=n.getUserConfirmation,o=void 0===a?g:a,i=n.hashType,u=e.basename?d(s(e.basename)):"",b=x[void 0===i?"slash":i],y=b.encodePath,v=b.decodePath;function k(){var e=v(E());return u&&(e=c(e,u)),p(e)}var C=m();function T(e){(0,r.Z)(M,e),M.length=t.length,C.notifyListeners(M.location,M.action)}var P=!1,A=null;function O(){var e=E(),t=y(e);if(e!==t)_(t);else{var n,r=k(),a=M.location;if(!P&&a.pathname===r.pathname&&a.search===r.search&&a.hash===r.hash||A===f(r))return;A=null,n=r,P?(P=!1,T()):C.confirmTransitionTo(n,"POP",o,function(e){var t,r,a,o,i;e?T({action:"POP",location:n}):(t=n,r=M.location,-1===(a=R.lastIndexOf(f(r)))&&(a=0),-1===(o=R.lastIndexOf(f(t)))&&(o=0),(i=a-o)&&(P=!0,I(i)))})}}var L=E(),j=y(L);L!==j&&_(j);var N=k(),R=[f(N)];function I(e){t.go(e)}var F=0;function D(e){1===(F+=e)&&1===e?window.addEventListener(w,O):0===F&&window.removeEventListener(w,O)}var z=!1,M={length:t.length,action:"POP",location:N,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+y(u+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,M.location);C.confirmTransitionTo(r,n,o,function(e){if(e){var t=f(r),a=y(u+t);if(E()!==a){A=t,window.location.hash=a;var o=R.lastIndexOf(f(M.location)),i=R.slice(0,o+1);i.push(t),R=i,T({action:n,location:r})}else T()}})},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,M.location);C.confirmTransitionTo(r,n,o,function(e){if(e){var t=f(r),a=y(u+t);E()!==a&&(A=t,_(a));var o=R.indexOf(f(M.location));-1!==o&&(R[o]=t),T({action:n,location:r})}})},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=C.setPrompt(e);return z||(D(1),z=!0),function(){return z&&(z=!1,D(-1)),t()}},listen:function(e){var t=C.appendListener(e);return D(1),function(){D(-1),t()}}};return M}function T(e,t,n){return Math.min(Math.max(e,t),n)}function P(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,l=t.keyLength,s=void 0===l?6:l,u=m();function c(e){(0,r.Z)(y,e),y.length=y.entries.length,u.notifyListeners(y.location,y.action)}function d(){return Math.random().toString(36).substr(2,s)}var h=T(void 0===i?0:i,0,o.length-1),g=o.map(function(e){return"string"==typeof e?p(e,void 0,d()):p(e,void 0,e.key||d())});function b(e){var t=T(y.index+e,0,y.entries.length-1),r=y.entries[t];u.confirmTransitionTo(r,"POP",n,function(e){e?c({action:"POP",location:r,index:t}):c()})}var y={length:g.length,action:"POP",location:g[h],index:h,entries:g,createHref:f,push:function(e,t){var r="PUSH",a=p(e,t,d(),y.location);u.confirmTransitionTo(a,r,n,function(e){if(e){var t=y.index+1,n=y.entries.slice(0);n.length>t?n.splice(t,n.length-t,a):n.push(a),c({action:r,location:a,index:t,entries:n})}})},replace:function(e,t){var r="REPLACE",a=p(e,t,d(),y.location);u.confirmTransitionTo(a,r,n,function(e){e&&(y.entries[y.index]=a,c({action:r,location:a}))})},go:b,goBack:function(){b(-1)},goForward:function(){b(1)},canGo:function(e){var t=y.index+e;return t>=0&&t<y.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return y}},8679:function(e,t,n){"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g<i.length;++g){var b=i[g];if(!o[b]&&!(r&&r[b])&&!(h&&h[b])&&!(l&&l[b])){var y=f(n,b);try{u(t,b,y)}catch(e){}}}}return t}},41143:function(e){"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=Error(t.replace(/%s/g,function(){return u[c++]}))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:function(e){e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},31336:function(e){!function(){var t,n,r,a,o,i,l,s,u,c,d,f,p,m,h,g,b,y,v,k,w,x,S,E,_,C,T,P,A,O,L=function(e){var t=new L.Builder;return t.pipeline.add(L.trimmer,L.stopWordFilter,L.stemmer),t.searchPipeline.add(L.stemmer),e.call(t,t),t.build()};L.version="2.3.9",L.utils={},L.utils.warn=(t=this,function(e){t.console&&console.warn&&console.warn(e)}),L.utils.asString=function(e){return null==e?"":e.toString()},L.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r<n.length;r++){var a=n[r],o=e[a];if(Array.isArray(o)){t[a]=o.slice();continue}if("string"==typeof o||"number"==typeof o||"boolean"==typeof o){t[a]=o;continue}throw TypeError("clone is not deep and does not support nested objects")}return t},L.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},L.FieldRef.joiner="/",L.FieldRef.fromString=function(e){var t=e.indexOf(L.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),r=e.slice(t+1);return new L.FieldRef(r,n,e)},L.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+L.FieldRef.joiner+this.docRef),this._stringValue},L.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},L.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},L.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},L.Set.prototype.contains=function(e){return!!this.elements[e]},L.Set.prototype.intersect=function(e){var t,n,r,a=[];if(e===L.Set.complete)return this;if(e===L.Set.empty)return e;this.length<e.length?(t=this,n=e):(t=e,n=this),r=Object.keys(t.elements);for(var o=0;o<r.length;o++){var i=r[o];i in n.elements&&a.push(i)}return new L.Set(a)},L.Set.prototype.union=function(e){return e===L.Set.complete?L.Set.complete:e===L.Set.empty?this:new L.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},L.idf=function(e,t){var n=0;for(var r in e)"_index"!=r&&(n+=Object.keys(e[r]).length);return Math.log(1+Math.abs((t-n+.5)/(n+.5)))},L.Token=function(e,t){this.str=e||"",this.metadata=t||{}},L.Token.prototype.toString=function(){return this.str},L.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},L.Token.prototype.clone=function(e){return e=e||function(e){return e},new L.Token(e(this.str,this.metadata),this.metadata)},L.tokenizer=function(e,t){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new L.Token(L.utils.asString(e).toLowerCase(),L.utils.clone(t))});for(var n=e.toString().toLowerCase(),r=n.length,a=[],o=0,i=0;o<=r;o++){var l=n.charAt(o),s=o-i;if(l.match(L.tokenizer.separator)||o==r){if(s>0){var u=L.utils.clone(t)||{};u.position=[i,s],u.index=a.length,a.push(new L.Token(n.slice(i,o),u))}i=o+1}}return a},L.tokenizer.separator=/[\s\-]+/,L.Pipeline=function(){this._stack=[]},L.Pipeline.registeredFunctions=Object.create(null),L.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&L.utils.warn("Overwriting existing registered function: "+t),e.label=t,L.Pipeline.registeredFunctions[e.label]=e},L.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||L.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},L.Pipeline.load=function(e){var t=new L.Pipeline;return e.forEach(function(e){var n=L.Pipeline.registeredFunctions[e];if(n)t.add(n);else throw Error("Cannot load unregistered function: "+e)}),t},L.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){L.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},L.Pipeline.prototype.after=function(e,t){L.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},L.Pipeline.prototype.before=function(e,t){L.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw Error("Cannot find existingFn");this._stack.splice(n,0,t)},L.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},L.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n<t;n++){for(var r=this._stack[n],a=[],o=0;o<e.length;o++){var i=r(e[o],o,e);if(null!=i&&""!==i)if(Array.isArray(i))for(var l=0;l<i.length;l++)a.push(i[l]);else a.push(i)}e=a}return e},L.Pipeline.prototype.runString=function(e,t){var n=new L.Token(e,t);return this.run([n]).map(function(e){return e.toString()})},L.Pipeline.prototype.reset=function(){this._stack=[]},L.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return L.Pipeline.warnIfFunctionNotRegistered(e),e.label})},L.Vector=function(e){this._magnitude=0,this.elements=e||[]},L.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,n=this.elements.length/2,r=n-t,a=Math.floor(r/2),o=this.elements[2*a];r>1&&(o<e&&(t=a),o>e&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:o<e?(a+1)*2:void 0},L.Vector.prototype.insert=function(e,t){this.upsert(e,t,function(){throw"duplicate index"})},L.Vector.prototype.upsert=function(e,t,n){this._magnitude=0;var r=this.positionForIndex(e);this.elements[r]==e?this.elements[r+1]=n(this.elements[r+1],t):this.elements.splice(r,0,e,t)},L.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,n=1;n<t;n+=2){var r=this.elements[n];e+=r*r}return this._magnitude=Math.sqrt(e)},L.Vector.prototype.dot=function(e){for(var t=0,n=this.elements,r=e.elements,a=n.length,o=r.length,i=0,l=0,s=0,u=0;s<a&&u<o;)(i=n[s])<(l=r[u])?s+=2:i>l?u+=2:i==l&&(t+=n[s+1]*r[u+1],s+=2,u+=2);return t},L.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},L.Vector.prototype.toArray=function(){for(var e=Array(this.elements.length/2),t=1,n=0;t<this.elements.length;t+=2,n++)e[n]=this.elements[t];return e},L.Vector.prototype.toJSON=function(){return this.elements},n={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},r={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},l="^("+(o="[^aeiou][^aeiouy]*")+")?"+(i=(a="[aeiouy]")+"[aeiou]*")+o+"("+i+")?$",s="^("+o+")?"+i+o+i+o,u=RegExp("^("+o+")?"+i+o),c=new RegExp(s),d=new RegExp(l),f=RegExp("^("+o+")?"+a),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,h=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,b=/.$/,y=/(at|bl|iz)$/,v=RegExp("([^aeiouylsz])\\1$"),k=RegExp("^"+o+a+"[^aeiouwxy]$"),w=/^(.+?[^aeiou])y$/,x=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,S=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,E=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,C=/^(.+?)e$/,T=/ll$/,P=RegExp("^"+o+a+"[^aeiouwxy]$"),A=function(e){var t,a,o,i,l,s;if(e.length<3)return e;if("y"==(o=e.substr(0,1))&&(e=o.toUpperCase()+e.substr(1)),i=p,l=m,i.test(e)?e=e.replace(i,"$1$2"):l.test(e)&&(e=e.replace(l,"$1$2")),i=h,l=g,i.test(e)){var A=i.exec(e);(i=u).test(A[1])&&(i=b,e=e.replace(i,""))}else if(l.test(e)){var A=l.exec(e);t=A[1],(l=f).test(t)&&(e=t,l=y,s=v,l.test(e)?e+="e":s.test(e)?(i=b,e=e.replace(i,"")):k.test(e)&&(e+="e"))}if((i=w).test(e)){var A=i.exec(e);e=(t=A[1])+"i"}if((i=x).test(e)){var A=i.exec(e);t=A[1],a=A[2],(i=u).test(t)&&(e=t+n[a])}if((i=S).test(e)){var A=i.exec(e);t=A[1],a=A[2],(i=u).test(t)&&(e=t+r[a])}if(i=E,l=_,i.test(e)){var A=i.exec(e);t=A[1],(i=c).test(t)&&(e=t)}else if(l.test(e)){var A=l.exec(e);t=A[1]+A[2],(l=c).test(t)&&(e=t)}if((i=C).test(e)){var A=i.exec(e);t=A[1],i=c,l=d,s=P,(i.test(t)||l.test(t)&&!s.test(t))&&(e=t)}return i=T,l=c,i.test(e)&&l.test(e)&&(i=b,e=e.replace(i,"")),"y"==o&&(e=o.toLowerCase()+e.substr(1)),e},L.stemmer=function(e){return e.update(A)},L.Pipeline.registerFunction(L.stemmer,"stemmer"),L.generateStopWordFilter=function(e){var t=e.reduce(function(e,t){return e[t]=t,e},{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},L.stopWordFilter=L.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),L.Pipeline.registerFunction(L.stopWordFilter,"stopWordFilter"),L.trimmer=function(e){return e.update(function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")})},L.Pipeline.registerFunction(L.trimmer,"trimmer"),L.TokenSet=function(){this.final=!1,this.edges={},this.id=L.TokenSet._nextId,L.TokenSet._nextId+=1},L.TokenSet._nextId=1,L.TokenSet.fromArray=function(e){for(var t=new L.TokenSet.Builder,n=0,r=e.length;n<r;n++)t.insert(e[n]);return t.finish(),t.root},L.TokenSet.fromClause=function(e){return"editDistance"in e?L.TokenSet.fromFuzzyString(e.term,e.editDistance):L.TokenSet.fromString(e.term)},L.TokenSet.fromFuzzyString=function(e,t){for(var n=new L.TokenSet,r=[{node:n,editsRemaining:t,str:e}];r.length;){var a=r.pop();if(a.str.length>0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new L.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var l=a.node.edges["*"];else{var l=new L.TokenSet;a.node.edges["*"]=l}if(0==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var s=a.node.edges["*"];else{var s=new L.TokenSet;a.node.edges["*"]=s}1==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var u,c=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?u=a.node.edges[d]:(u=new L.TokenSet,a.node.edges[d]=u),1==a.str.length&&(u.final=!0),r.push({node:u,editsRemaining:a.editsRemaining-1,str:c+a.str.slice(2)})}}}return n},L.TokenSet.fromString=function(e){for(var t=new L.TokenSet,n=t,r=0,a=e.length;r<a;r++){var o=e[r],i=r==a-1;if("*"==o)t.edges[o]=t,t.final=i;else{var l=new L.TokenSet;l.final=i,t.edges[o]=l,t=l}}return n},L.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var n=t.pop(),r=Object.keys(n.node.edges),a=r.length;n.node.final&&(n.prefix.charAt(0),e.push(n.prefix));for(var o=0;o<a;o++){var i=r[o];t.push({prefix:n.prefix.concat(i),node:n.node.edges[i]})}}return e},L.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),n=t.length,r=0;r<n;r++){var a=t[r],o=this.edges[a];e=e+a+o.id}return e},L.TokenSet.prototype.intersect=function(e){for(var t=new L.TokenSet,n=void 0,r=[{qNode:e,output:t,node:this}];r.length;)for(var a=Object.keys((n=r.pop()).qNode.edges),o=a.length,i=Object.keys(n.node.edges),l=i.length,s=0;s<o;s++)for(var u=a[s],c=0;c<l;c++){var d=i[c];if(d==u||"*"==u){var f=n.node.edges[d],p=n.qNode.edges[u],m=f.final&&p.final,h=void 0;d in n.output.edges?(h=n.output.edges[d]).final=h.final||m:((h=new L.TokenSet).final=m,n.output.edges[d]=h),r.push({qNode:p,output:h,node:f})}}return t},L.TokenSet.Builder=function(){this.previousWord="",this.root=new L.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},L.TokenSet.Builder.prototype.insert=function(e){var t,n=0;if(e<this.previousWord)throw Error("Out of order word insertion");for(var r=0;r<e.length&&r<this.previousWord.length&&e[r]==this.previousWord[r];r++)n++;this.minimize(n),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child;for(var r=n;r<e.length;r++){var a=new L.TokenSet,o=e[r];t.edges[o]=a,this.uncheckedNodes.push({parent:t,char:o,child:a}),t=a}t.final=!0,this.previousWord=e},L.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},L.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},L.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},L.Index.prototype.search=function(e){return this.query(function(t){new L.QueryParser(e,t).parse()})},L.Index.prototype.query=function(e){for(var t=new L.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),l=0;l<this.fields.length;l++)r[this.fields[l]]=new L.Vector;e.call(t,t);for(var l=0;l<t.clauses.length;l++){var s=t.clauses[l],u=null,c=L.Set.empty;u=s.usePipeline?this.pipeline.runString(s.term,{fields:s.fields}):[s.term];for(var d=0;d<u.length;d++){s.term=u[d];var f=L.TokenSet.fromClause(s),p=this.tokenSet.intersect(f).toArray();if(0===p.length&&s.presence===L.Query.presence.REQUIRED){for(var m=0;m<s.fields.length;m++){var h=s.fields[m];o[h]=L.Set.empty}break}for(var g=0;g<p.length;g++)for(var b=p[g],y=this.invertedIndex[b],v=y._index,m=0;m<s.fields.length;m++){var h=s.fields[m],k=y[h],w=Object.keys(k),x=b+"/"+h,S=new L.Set(w);if(s.presence==L.Query.presence.REQUIRED&&(c=c.union(S),void 0===o[h]&&(o[h]=L.Set.complete)),s.presence==L.Query.presence.PROHIBITED){void 0===i[h]&&(i[h]=L.Set.empty),i[h]=i[h].union(S);continue}if(r[h].upsert(v,s.boost,function(e,t){return e+t}),!a[x]){for(var E=0;E<w.length;E++){var _,C=w[E],T=new L.FieldRef(C,h),P=k[C];void 0===(_=n[T])?n[T]=new L.MatchData(b,h,P):_.add(b,h,P)}a[x]=!0}}}if(s.presence===L.Query.presence.REQUIRED)for(var m=0;m<s.fields.length;m++){var h=s.fields[m];o[h]=o[h].intersect(c)}}for(var A=L.Set.complete,O=L.Set.empty,l=0;l<this.fields.length;l++){var h=this.fields[l];o[h]&&(A=A.intersect(o[h])),i[h]&&(O=O.union(i[h]))}var j=Object.keys(n),N=[],R=Object.create(null);if(t.isNegated()){j=Object.keys(this.fieldVectors);for(var l=0;l<j.length;l++){var T=j[l],I=L.FieldRef.fromString(T);n[T]=new L.MatchData}}for(var l=0;l<j.length;l++){var I=L.FieldRef.fromString(j[l]),F=I.docRef;if(A.contains(F)&&!O.contains(F)){var D,z=this.fieldVectors[I],M=r[I.fieldName].similarity(z);if(void 0!==(D=R[F]))D.score+=M,D.matchData.combine(n[I]);else{var $={ref:F,score:M,matchData:n[I]};R[F]=$,N.push($)}}}return N.sort(function(e,t){return t.score-e.score})},L.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map(function(e){return[e,this.invertedIndex[e]]},this),t=Object.keys(this.fieldVectors).map(function(e){return[e,this.fieldVectors[e].toJSON()]},this);return{version:L.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},L.Index.load=function(e){var t={},n={},r=e.fieldVectors,a=Object.create(null),o=e.invertedIndex,i=new L.TokenSet.Builder,l=L.Pipeline.load(e.pipeline);e.version!=L.version&&L.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+L.version+"' does not match serialized index '"+e.version+"'");for(var s=0;s<r.length;s++){var u=r[s],c=u[0],d=u[1];n[c]=new L.Vector(d)}for(var s=0;s<o.length;s++){var u=o[s],f=u[0],p=u[1];i.insert(f),a[f]=p}return i.finish(),t.fields=e.fields,t.fieldVectors=n,t.invertedIndex=a,t.tokenSet=i.root,t.pipeline=l,new L.Index(t)},L.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=L.tokenizer,this.pipeline=new L.Pipeline,this.searchPipeline=new L.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},L.Builder.prototype.ref=function(e){this._ref=e},L.Builder.prototype.field=function(e,t){if(/\//.test(e))throw RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},L.Builder.prototype.b=function(e){e<0?this._b=0:e>1?this._b=1:this._b=e},L.Builder.prototype.k1=function(e){this._k1=e},L.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a<r.length;a++){var o=r[a],i=this._fields[o].extractor,l=i?i(e):e[o],s=this.tokenizer(l,{fields:[o]}),u=this.pipeline.run(s),c=new L.FieldRef(n,o),d=Object.create(null);this.fieldTermFrequencies[c]=d,this.fieldLengths[c]=0,this.fieldLengths[c]+=u.length;for(var f=0;f<u.length;f++){var p=u[f];if(void 0==d[p]&&(d[p]=0),d[p]+=1,void 0==this.invertedIndex[p]){var m=Object.create(null);m._index=this.termIndex,this.termIndex+=1;for(var h=0;h<r.length;h++)m[r[h]]=Object.create(null);this.invertedIndex[p]=m}void 0==this.invertedIndex[p][o][n]&&(this.invertedIndex[p][o][n]=Object.create(null));for(var g=0;g<this.metadataWhitelist.length;g++){var b=this.metadataWhitelist[g],y=p.metadata[b];void 0==this.invertedIndex[p][o][n][b]&&(this.invertedIndex[p][o][n][b]=[]),this.invertedIndex[p][o][n][b].push(y)}}}},L.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,n={},r={},a=0;a<t;a++){var o=L.FieldRef.fromString(e[a]),i=o.fieldName;r[i]||(r[i]=0),r[i]+=1,n[i]||(n[i]=0),n[i]+=this.fieldLengths[o]}for(var l=Object.keys(this._fields),a=0;a<l.length;a++){var s=l[a];n[s]=n[s]/r[s]}this.averageFieldLength=n},L.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),n=t.length,r=Object.create(null),a=0;a<n;a++){for(var o=L.FieldRef.fromString(t[a]),i=o.fieldName,l=this.fieldLengths[o],s=new L.Vector,u=this.fieldTermFrequencies[o],c=Object.keys(u),d=c.length,f=this._fields[i].boost||1,p=this._documents[o.docRef].boost||1,m=0;m<d;m++){var h,g,b=c[m],y=u[b],v=this.invertedIndex[b]._index;void 0===r[b]?(h=L.idf(this.invertedIndex[b],this.documentCount),r[b]=h):h=r[b],g=Math.round(1e3*(h*((this._k1+1)*y)/(this._k1*(1-this._b+this._b*(l/this.averageFieldLength[i]))+y)*f*p))/1e3,s.insert(v,g)}e[o]=s}this.fieldVectors=e},L.Builder.prototype.createTokenSet=function(){this.tokenSet=L.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},L.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new L.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},L.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},L.MatchData=function(e,t,n){for(var r=Object.create(null),a=Object.keys(n||{}),o=0;o<a.length;o++){var i=a[o];r[i]=n[i].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=r)},L.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),n=0;n<t.length;n++){var r=t[n],a=Object.keys(e.metadata[r]);void 0==this.metadata[r]&&(this.metadata[r]=Object.create(null));for(var o=0;o<a.length;o++){var i=a[o],l=Object.keys(e.metadata[r][i]);void 0==this.metadata[r][i]&&(this.metadata[r][i]=Object.create(null));for(var s=0;s<l.length;s++){var u=l[s];void 0==this.metadata[r][i][u]?this.metadata[r][i][u]=e.metadata[r][i][u]:this.metadata[r][i][u]=this.metadata[r][i][u].concat(e.metadata[r][i][u])}}}},L.MatchData.prototype.add=function(e,t,n){if(!(e in this.metadata)){this.metadata[e]=Object.create(null),this.metadata[e][t]=n;return}if(!(t in this.metadata[e])){this.metadata[e][t]=n;return}for(var r=Object.keys(n),a=0;a<r.length;a++){var o=r[a];o in this.metadata[e][t]?this.metadata[e][t][o]=this.metadata[e][t][o].concat(n[o]):this.metadata[e][t][o]=n[o]}},L.Query=function(e){this.clauses=[],this.allFields=e},L.Query.wildcard=new String("*"),L.Query.wildcard.NONE=0,L.Query.wildcard.LEADING=1,L.Query.wildcard.TRAILING=2,L.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},L.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=L.Query.wildcard.NONE),e.wildcard&L.Query.wildcard.LEADING&&e.term.charAt(0)!=L.Query.wildcard&&(e.term="*"+e.term),e.wildcard&L.Query.wildcard.TRAILING&&e.term.slice(-1)!=L.Query.wildcard&&(e.term=""+e.term+"*"),"presence"in e||(e.presence=L.Query.presence.OPTIONAL),this.clauses.push(e),this},L.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=L.Query.presence.PROHIBITED)return!1;return!0},L.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach(function(e){this.term(e,L.utils.clone(t))},this),this;var n=t||{};return n.term=e.toString(),this.clause(n),this},L.QueryParseError=function(e,t,n){this.name="QueryParseError",this.message=e,this.start=t,this.end=n},L.QueryParseError.prototype=Error(),L.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},L.QueryLexer.prototype.run=function(){for(var e=L.QueryLexer.lexText;e;)e=e(this)},L.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,n=this.pos,r=0;r<this.escapeCharPositions.length;r++)n=this.escapeCharPositions[r],e.push(this.str.slice(t,n)),t=n+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},L.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},L.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},L.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return L.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},L.QueryLexer.prototype.width=function(){return this.pos-this.start},L.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},L.QueryLexer.prototype.backup=function(){this.pos-=1},L.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do t=(e=this.next()).charCodeAt(0);while(t>47&&t<58);e!=L.QueryLexer.EOS&&this.backup()},L.QueryLexer.prototype.more=function(){return this.pos<this.length},L.QueryLexer.EOS="EOS",L.QueryLexer.FIELD="FIELD",L.QueryLexer.TERM="TERM",L.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",L.QueryLexer.BOOST="BOOST",L.QueryLexer.PRESENCE="PRESENCE",L.QueryLexer.lexField=function(e){return e.backup(),e.emit(L.QueryLexer.FIELD),e.ignore(),L.QueryLexer.lexText},L.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(L.QueryLexer.TERM)),e.ignore(),e.more())return L.QueryLexer.lexText},L.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(L.QueryLexer.EDIT_DISTANCE),L.QueryLexer.lexText},L.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(L.QueryLexer.BOOST),L.QueryLexer.lexText},L.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(L.QueryLexer.TERM)},L.QueryLexer.termSeparator=L.tokenizer.separator,L.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==L.QueryLexer.EOS)return L.QueryLexer.lexEOS;if(92==t.charCodeAt(0)){e.escapeCharacter();continue}if(":"==t)return L.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(L.QueryLexer.TERM),L.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(L.QueryLexer.TERM),L.QueryLexer.lexBoost;if("+"==t&&1===e.width()||"-"==t&&1===e.width())return e.emit(L.QueryLexer.PRESENCE),L.QueryLexer.lexText;if(t.match(L.QueryLexer.termSeparator))return L.QueryLexer.lexTerm}},L.QueryParser=function(e,t){this.lexer=new L.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},L.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=L.QueryParser.parseClause;e;)e=e(this);return this.query},L.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},L.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},L.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},L.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case L.QueryLexer.PRESENCE:return L.QueryParser.parsePresence;case L.QueryLexer.FIELD:return L.QueryParser.parseField;case L.QueryLexer.TERM:return L.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new L.QueryParseError(n,t.start,t.end)}},L.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(void 0!=t){switch(t.str){case"-":e.currentClause.presence=L.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=L.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new L.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(void 0==r){var n="expecting term or field, found nothing";throw new L.QueryParseError(n,t.start,t.end)}switch(r.type){case L.QueryLexer.FIELD:return L.QueryParser.parseField;case L.QueryLexer.TERM:return L.QueryParser.parseTerm;default:var n="expecting term or field, found '"+r.type+"'";throw new L.QueryParseError(n,r.start,r.end)}}},L.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new L.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(void 0==a){var r="expecting term, found nothing";throw new L.QueryParseError(r,t.start,t.end)}if(a.type===L.QueryLexer.TERM)return L.QueryParser.parseTerm;var r="expecting term, found '"+a.type+"'";throw new L.QueryParseError(r,a.start,a.end)}},L.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case L.QueryLexer.TERM:return e.nextClause(),L.QueryParser.parseTerm;case L.QueryLexer.FIELD:return e.nextClause(),L.QueryParser.parseField;case L.QueryLexer.EDIT_DISTANCE:return L.QueryParser.parseEditDistance;case L.QueryLexer.BOOST:return L.QueryParser.parseBoost;case L.QueryLexer.PRESENCE:return e.nextClause(),L.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new L.QueryParseError(r,n.start,n.end)}}},L.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new L.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(void 0==a)return void e.nextClause();switch(a.type){case L.QueryLexer.TERM:return e.nextClause(),L.QueryParser.parseTerm;case L.QueryLexer.FIELD:return e.nextClause(),L.QueryParser.parseField;case L.QueryLexer.EDIT_DISTANCE:return L.QueryParser.parseEditDistance;case L.QueryLexer.BOOST:return L.QueryParser.parseBoost;case L.QueryLexer.PRESENCE:return e.nextClause(),L.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+a.type+"'";throw new L.QueryParseError(r,a.start,a.end)}}},L.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new L.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(void 0==a)return void e.nextClause();switch(a.type){case L.QueryLexer.TERM:return e.nextClause(),L.QueryParser.parseTerm;case L.QueryLexer.FIELD:return e.nextClause(),L.QueryParser.parseField;case L.QueryLexer.EDIT_DISTANCE:return L.QueryParser.parseEditDistance;case L.QueryLexer.BOOST:return L.QueryParser.parseBoost;case L.QueryLexer.PRESENCE:return e.nextClause(),L.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+a.type+"'";throw new L.QueryParseError(r,a.start,a.end)}}},O=function(){return L},"function"==typeof define&&define.amd?define(O):e.exports=O()}()},74865:function(e){var t;t=function(){var e,t,n,r={};r.version="0.2.0";var a=r.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}r.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(a[t]=n);return this},r.status=null,r.set=function(e){var t=r.isStarted();r.status=1===(e=o(e,a.minimum,1))?null:e;var n=r.render(!t),s=n.querySelector(a.barSelector),u=a.speed,c=a.easing;return n.offsetWidth,i(function(t){var o,i,d,f;""===a.positionUsing&&(a.positionUsing=r.getPositioningCSS()),l(s,(o=e,i=u,d=c,(f="translate3d"===a.positionUsing?{transform:"translate3d("+(-1+o)*100+"%,0,0)"}:"translate"===a.positionUsing?{transform:"translate("+(-1+o)*100+"%,0)"}:{"margin-left":(-1+o)*100+"%"}).transition="all "+i+"ms "+d,f)),1===e?(l(n,{transition:"none",opacity:1}),n.offsetWidth,setTimeout(function(){l(n,{transition:"all "+u+"ms linear",opacity:0}),setTimeout(function(){r.remove(),t()},u)},u)):setTimeout(t,u)}),this},r.isStarted=function(){return"number"==typeof r.status},r.start=function(){r.status||r.set(0);var e=function(){setTimeout(function(){r.status&&(r.trickle(),e())},a.trickleSpeed)};return a.trickle&&e(),this},r.done=function(e){return e||r.status?r.inc(.3+.5*Math.random()).set(1):this},r.inc=function(e){var t=r.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),r.set(t)):r.start()},r.trickle=function(){return r.inc(Math.random()*a.trickleRate)},e=0,t=0,r.promise=function(n){return n&&"resolved"!==n.state()&&(0===t&&r.start(),e++,t++,n.always(function(){0==--t?(e=0,r.done()):r.set((e-t)/e)})),this},r.render=function(e){if(r.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=a.template;var n,o=t.querySelector(a.barSelector),i=e?"-100":(-1+(r.status||0))*100,s=document.querySelector(a.parent);return l(o,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),!a.showSpinner&&(n=t.querySelector(a.spinnerSelector))&&f(n),s!=document.body&&u(s,"nprogress-custom-parent"),s.appendChild(t),t},r.remove=function(){c(document.documentElement,"nprogress-busy"),c(document.querySelector(a.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},r.isRendered=function(){return!!document.getElementById("nprogress")},r.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var i=(n=[],function(e){n.push(e),1==n.length&&function e(){var t=n.shift();t&&t(e)}()}),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(n,r,a){var o;r=t[o=(o=r).replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(e,t){return t.toUpperCase()})]||(t[o]=function(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}(o)),n.style[r]=a}return function(e,t){var r,a,o=arguments;if(2==o.length)for(r in t)void 0!==(a=t[r])&&t.hasOwnProperty(r)&&n(e,r,a);else n(e,o[1],o[2])}}();function s(e,t){return("string"==typeof e?e:d(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=d(e),r=n+t;s(n,t)||(e.className=r.substring(1))}function c(e,t){var n,r=d(e);s(e,t)&&(e.className=(n=r.replace(" "+t+" "," ")).substring(1,n.length-1))}function d(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return r},"function"==typeof define&&define.amd?define(t):e.exports=t()},14779:function(e,t,n){var r=n(5826);e.exports=function e(t,n,a){if(r(n)||(a=n||a,n=[]),a=a||{},t instanceof RegExp){var i,l,s=n,d=t.source.match(/\((?!\?)/g);if(d)for(var f=0;f<d.length;f++)s.push({name:f,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return t.keys=s,t}if(r(t)){for(var p,m=n,h=a,g=[],b=0;b<t.length;b++)g.push(e(t[b],m,h).source);return(p=RegExp("(?:"+g.join("|")+")",u(h))).keys=m,p}return i=n,c(o(t,l=a),i,l)},e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=c;var a=RegExp("(\\\\.)|([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))","g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var c,d,f=n[0],p=n[1],m=n.index;if(l+=e.slice(i,m),i=m+f.length,p){l+=p[1];continue}var h=e[i],g=n[2],b=n[3],y=n[4],v=n[5],k=n[6],w=n[7];l&&(r.push(l),l="");var x=null!=g&&null!=h&&h!==g,S="+"===k||"*"===k,E="?"===k||"*"===k,_=g||u,C=y||v,T=g||("string"==typeof r[r.length-1]?r[r.length-1]:"");r.push({name:b||o++,prefix:g||"",delimiter:_,optional:E,repeat:S,partial:x,asterisk:!!w,pattern:C?C.replace(/([=!:$\/()])/g,"\\$1"):w?".*":(c=_,!(d=T)||d.indexOf(c)>-1?"[^"+s(c)+"]+?":s(d)+"|(?:(?!"+s(d)+")[^"+s(c)+"])+?")})}return i<e.length&&(l+=e.substr(i)),l&&r.push(l),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function l(e,t){for(var n=Array(e.length),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=RegExp("^(?:"+e[a].pattern+")$",u(t)));return function(t,a){for(var o="",l=t||{},s=(a||{}).pretty?i:encodeURIComponent,u=0;u<e.length;u++){var c,d=e[u];if("string"==typeof d){o+=d;continue}var f=l[d.name];if(null==f)if(d.optional){d.partial&&(o+=d.prefix);continue}else throw TypeError('Expected "'+d.name+'" to be defined');if(r(f)){if(!d.repeat)throw TypeError('Expected "'+d.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length)if(d.optional)continue;else throw TypeError('Expected "'+d.name+'" to not be empty');for(var p=0;p<f.length;p++){if(c=s(f[p]),!n[u].test(c))throw TypeError('Expected all "'+d.name+'" to match "'+d.pattern+'", but received `'+JSON.stringify(c)+"`");o+=(0===p?d.prefix:d.delimiter)+c}continue}if(c=d.asterisk?encodeURI(f).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}):s(f),!n[u].test(c))throw TypeError('Expected "'+d.name+'" to match "'+d.pattern+'", but received "'+c+'"');o+=d.prefix+c}return o}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function u(e){return e&&e.sensitive?"":"i"}function c(e,t,n){r(t)||(n=t||n,t=[]);for(var a,o=(n=n||{}).strict,i=!1!==n.end,l="",c=0;c<e.length;c++){var d=e[c];if("string"==typeof d)l+=s(d);else{var f=s(d.prefix),p="(?:"+d.pattern+")";t.push(d),d.repeat&&(p+="(?:"+f+p+")*"),l+=p=d.optional?d.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=s(n.delimiter||"/"),h=l.slice(-m.length)===m;return o||(l=(h?l.slice(0,-m.length):l)+"(?:"+m+"(?=$))?"),i?l+="$":l+=o&&h?"":"(?="+m+"|$)",(a=RegExp("^"+l,u(n))).keys=t,a}},57874:function(){!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism)},40728:function(){var e,t;(e=Prism).languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]},Object.keys(t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"}).forEach(function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}}),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})},77158:function(){!function(e){var t=/\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source,n=/(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)/.source.replace(/<SP_BS>/g,function(){return t}),r=/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source,a=/--[\w-]+=(?:<STR>|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(/<STR>/g,function(){return r}),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function l(e,t){return RegExp(e=e.replace(/<OPT>/g,function(){return a}).replace(/<SP>/g,function(){return n}),t)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:l(/(^(?:ONBUILD<SP>)?\w+<SP>)<OPT>(?:<SP><OPT>)*/.source,"i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:l(/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\b/.source,"i"),lookbehind:!0,greedy:!0},{pattern:l(/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\]+<SP>)AS/.source,"i"),lookbehind:!0,greedy:!0},{pattern:l(/(^ONBUILD<SP>)\w+/.source,"i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism)},29525:function(){Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}},74277:function(){Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},22444:function(){var e,t;t=/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/,(e=Prism).languages.json5=e.languages.extend("json",{property:[{pattern:RegExp(t.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:t,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})},96854:function(){var e=Prism;function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(a>=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return l}(n.tokens)}}}})},96836:function(){var e,t;(e=Prism).languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"],t=e.languages.extend("typescript",{}),delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript},81032:function(e,t,n){var r={"./prism-bash":"57874","./prism-diff":"40728","./prism-docker":"77158","./prism-ini":"29525","./prism-json":"74277","./prism-json5":"22444","./prism-typescript":"96836"};function a(e){return n(o(e))}function o(e){if(!n.o(r,e)){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=81032},92703:function(e,t,n){"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:function(e,t,n){e.exports=n(92703)()},50414:function(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},96787:function(e,t,n){"use strict";var r,a=n(63840),o=n(67294),i=n(73935);function l(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function s(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function u(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do 0!=(4098&(t=e).flags)&&(n=t.return),e=t.return;while(e)}return 3===t.tag?n:null}function c(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==(e=e.alternate)&&(t=e.memoizedState),null!==t)return t.dehydrated}return null}function d(e){if(u(e)!==e)throw Error(l(188))}var f=Object.assign,p=Symbol.for("react.element"),m=Symbol.for("react.transitional.element"),h=Symbol.for("react.portal"),g=Symbol.for("react.fragment"),b=Symbol.for("react.strict_mode"),y=Symbol.for("react.profiler"),v=Symbol.for("react.provider"),k=Symbol.for("react.consumer"),w=Symbol.for("react.context"),x=Symbol.for("react.forward_ref"),S=Symbol.for("react.suspense"),E=Symbol.for("react.suspense_list"),_=Symbol.for("react.memo"),C=Symbol.for("react.lazy");Symbol.for("react.scope");var T=Symbol.for("react.activity");Symbol.for("react.legacy_hidden"),Symbol.for("react.tracing_marker");var P=Symbol.for("react.memo_cache_sentinel");Symbol.for("react.view_transition");var A=Symbol.iterator;function O(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=A&&e[A]||e["@@iterator"])?e:null}var L=Symbol.for("react.client.reference"),j=Array.isArray,N=o.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,R=i.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,I={pending:!1,data:null,method:null,action:null},F=[],D=-1;function z(e){return{current:e}}function M(e){0>D||(e.current=F[D],F[D]=null,D--)}function $(e,t){F[++D]=e.current,e.current=t}var B=z(null),U=z(null),H=z(null),Q=z(null);function Z(e,t){switch($(H,t),$(U,e),$(B,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?ui(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=ul(t=ui(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}M(B),$(B,e)}function V(){M(B),M(U),M(H)}function W(e){null!==e.memoizedState&&$(Q,e);var t=B.current,n=ul(t,e.type);t!==n&&($(U,e),$(B,n))}function q(e){U.current===e&&(M(B),M(U)),Q.current===e&&(M(Q),uY._currentValue=I)}var G=Object.prototype.hasOwnProperty,Y=a.unstable_scheduleCallback,K=a.unstable_cancelCallback,X=a.unstable_shouldYield,J=a.unstable_requestPaint,ee=a.unstable_now,et=a.unstable_getCurrentPriorityLevel,en=a.unstable_ImmediatePriority,er=a.unstable_UserBlockingPriority,ea=a.unstable_NormalPriority,eo=a.unstable_LowPriority,ei=a.unstable_IdlePriority,el=a.log,es=a.unstable_setDisableYieldValue,eu=null,ec=null;function ed(e){if("function"==typeof el&&es(e),ec&&"function"==typeof ec.setStrictMode)try{ec.setStrictMode(eu,e)}catch(e){}}var ef=Math.clz32?Math.clz32:function(e){return 0==(e>>>=0)?32:31-(ep(e)/em|0)|0},ep=Math.log,em=Math.LN2,eh=256,eg=4194304;function eb(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194048&e;case 4194304:case 8388608:case 0x1000000:case 0x2000000:return 0x3c00000&e;case 0x4000000:return 0x4000000;case 0x8000000:return 0x8000000;case 0x10000000:return 0x10000000;case 0x20000000:return 0x20000000;case 0x40000000:return 0;default:return e}}function ey(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var a=0,o=e.suspendedLanes,i=e.pingedLanes;e=e.warmLanes;var l=0x7ffffff&r;return 0!==l?0!=(r=l&~o)?a=eb(r):0!=(i&=l)?a=eb(i):n||0!=(n=l&~e)&&(a=eb(n)):0!=(l=r&~o)?a=eb(l):0!==i?a=eb(i):n||0!=(n=r&~e)&&(a=eb(n)),0===a?0:0!==t&&t!==a&&0==(t&o)&&((o=a&-a)>=(n=t&-t)||32===o&&0!=(4194048&n))?t:a}function ev(e,t){return 0==(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function ek(){var e=eh;return 0==(4194048&(eh<<=1))&&(eh=256),e}function ew(){var e=eg;return 0==(0x3c00000&(eg<<=1))&&(eg=4194304),e}function ex(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function eS(e,t){e.pendingLanes|=t,0x10000000!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function eE(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-ef(t);e.entangledLanes|=t,e.entanglements[r]=0x40000000|e.entanglements[r]|4194090&n}function e_(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-ef(n),a=1<<r;a&t|e[r]&t&&(e[r]|=t),n&=~a}}function eC(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 0x1000000:case 0x2000000:e=128;break;case 0x10000000:e=0x8000000;break;default:e=0}return e}function eT(e){return 2<(e&=-e)?8<e?0!=(0x7ffffff&e)?32:0x10000000:8:2}function eP(){var e=R.p;return 0!==e?e:void 0===(e=window.event)?32:ce(e.type)}var eA=Math.random().toString(36).slice(2),eO="__reactFiber$"+eA,eL="__reactProps$"+eA,ej="__reactContainer$"+eA,eN="__reactEvents$"+eA,eR="__reactListeners$"+eA,eI="__reactHandles$"+eA,eF="__reactResources$"+eA,eD="__reactMarker$"+eA;function ez(e){delete e[eO],delete e[eL],delete e[eN],delete e[eR],delete e[eI]}function eM(e){var t=e[eO];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ej]||n[eO]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uw(e);null!==e;){if(n=e[eO])return n;e=uw(e)}return t}n=(e=n).parentNode}return null}function e$(e){if(e=e[eO]||e[ej]){var t=e.tag;if(5===t||6===t||13===t||26===t||27===t||3===t)return e}return null}function eB(e){var t=e.tag;if(5===t||26===t||27===t||6===t)return e.stateNode;throw Error(l(33))}function eU(e){var t=e[eF];return t||(t=e[eF]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function eH(e){e[eD]=!0}var eQ=new Set,eZ={};function eV(e,t){eW(e,t),eW(e+"Capture",t)}function eW(e,t){for(eZ[e]=t,e=0;e<t.length;e++)eQ.add(t[e])}var eq=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),eG={},eY={};function eK(e,t,n){if(G.call(eY,t)||!G.call(eG,t)&&(eq.test(t)?eY[t]=!0:(eG[t]=!0,!1)))if(null===n)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var r=t.toLowerCase().slice(0,5);if("data-"!==r&&"aria-"!==r)return void e.removeAttribute(t)}e.setAttribute(t,""+n)}}function eX(e,t,n){if(null===n)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,""+n)}}function eJ(e,t,n,r){if(null===r)e.removeAttribute(n);else{switch(typeof r){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(n);return}e.setAttributeNS(t,n,""+r)}}function e0(e){if(void 0===tR)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);tR=t&&t[1]||"",tI=-1<e.stack.indexOf("\n at")?" (<anonymous>)":-1<e.stack.indexOf("@")?"@unknown:0:0":""}return"\n"+tR+e+tI}var e1=!1;function e2(e,t){if(!e||e1)return"";e1=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var r={DetermineComponentFrameRoot:function(){try{if(t){var n=function(){throw Error()};if(Object.defineProperty(n.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(n,[])}catch(e){var r=e}Reflect.construct(e,[],n)}else{try{n.call()}catch(e){r=e}e.call(n.prototype)}}else{try{throw Error()}catch(e){r=e}(n=e())&&"function"==typeof n.catch&&n.catch(function(){})}}catch(e){if(e&&r&&"string"==typeof e.stack)return[e.stack,r.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var a=Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,"name");a&&a.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var o=r.DetermineComponentFrameRoot(),i=o[0],l=o[1];if(i&&l){var s=i.split("\n"),u=l.split("\n");for(a=r=0;r<s.length&&!s[r].includes("DetermineComponentFrameRoot");)r++;for(;a<u.length&&!u[a].includes("DetermineComponentFrameRoot");)a++;if(r===s.length||a===u.length)for(r=s.length-1,a=u.length-1;1<=r&&0<=a&&s[r]!==u[a];)a--;for(;1<=r&&0<=a;r--,a--)if(s[r]!==u[a]){if(1!==r||1!==a)do if(r--,a--,0>a||s[r]!==u[a]){var c="\n"+s[r].replace(" at new "," at ");return e.displayName&&c.includes("<anonymous>")&&(c=c.replace("<anonymous>",e.displayName)),c}while(1<=r&&0<=a);break}}}finally{e1=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?e0(n):""}function e4(e){try{var t="";do t+=function(e){switch(e.tag){case 26:case 27:case 5:return e0(e.type);case 16:return e0("Lazy");case 13:return e0("Suspense");case 19:return e0("SuspenseList");case 0:case 15:return e2(e.type,!1);case 11:return e2(e.type.render,!1);case 1:return e2(e.type,!0);case 31:return e0("Activity");default:return""}}(e),e=e.return;while(e);return t}catch(e){return"\nError generating stack: "+e.message+"\n"+e.stack}}function e3(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function e6(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function e9(e){e._valueTracker||(e._valueTracker=function(e){var t=e6(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function e8(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=e6(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function e5(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}var e7=/[\n"\\]/g;function te(e){return e.replace(e7,function(e){return"\\"+e.charCodeAt(0).toString(16)+" "})}function tt(e,t,n,r,a,o,i,l){e.name="",null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i?e.type=i:e.removeAttribute("type"),null!=t?"number"===i?(0===t&&""===e.value||e.value!=t)&&(e.value=""+e3(t)):e.value!==""+e3(t)&&(e.value=""+e3(t)):"submit"!==i&&"reset"!==i||e.removeAttribute("value"),null!=t?tr(e,i,e3(t)):null!=n?tr(e,i,e3(n)):null!=r&&e.removeAttribute("value"),null==a&&null!=o&&(e.defaultChecked=!!o),null!=a&&(e.checked=a&&"function"!=typeof a&&"symbol"!=typeof a),null!=l&&"function"!=typeof l&&"symbol"!=typeof l&&"boolean"!=typeof l?e.name=""+e3(l):e.removeAttribute("name")}function tn(e,t,n,r,a,o,i,l){if(null!=o&&"function"!=typeof o&&"symbol"!=typeof o&&"boolean"!=typeof o&&(e.type=o),null!=t||null!=n){if(("submit"===o||"reset"===o)&&null==t)return;n=null!=n?""+e3(n):"",t=null!=t?""+e3(t):n,l||t===e.value||(e.value=t),e.defaultValue=t}r="function"!=typeof(r=null!=r?r:a)&&"symbol"!=typeof r&&!!r,e.checked=l?e.checked:!!r,e.defaultChecked=!!r,null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i&&(e.name=i)}function tr(e,t,n){"number"===t&&e5(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function ta(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(a=0,n=""+e3(n),t=null;a<e.length;a++){if(e[a].value===n){e[a].selected=!0,r&&(e[a].defaultSelected=!0);return}null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function to(e,t,n){if(null!=t&&((t=""+e3(t))!==e.value&&(e.value=t),null==n)){e.defaultValue!==t&&(e.defaultValue=t);return}e.defaultValue=null!=n?""+e3(n):""}function ti(e,t,n,r){if(null==t){if(null!=r){if(null!=n)throw Error(l(92));if(j(r)){if(1<r.length)throw Error(l(93));r=r[0]}n=r}null==n&&(n=""),t=n}e.defaultValue=n=e3(t),(r=e.textContent)===n&&""!==r&&null!==r&&(e.value=r)}function tl(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType){n.nodeValue=t;return}}e.textContent=t}var ts=new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" "));function tu(e,t,n){var r=0===t.indexOf("--");null==n||"boolean"==typeof n||""===n?r?e.setProperty(t,""):"float"===t?e.cssFloat="":e[t]="":r?e.setProperty(t,n):"number"!=typeof n||0===n||ts.has(t)?"float"===t?e.cssFloat=n:e[t]=(""+n).trim():e[t]=n+"px"}function tc(e,t,n){if(null!=t&&"object"!=typeof t)throw Error(l(62));if(e=e.style,null!=n){for(var r in n)!n.hasOwnProperty(r)||null!=t&&t.hasOwnProperty(r)||(0===r.indexOf("--")?e.setProperty(r,""):"float"===r?e.cssFloat="":e[r]="");for(var a in t)r=t[a],t.hasOwnProperty(a)&&n[a]!==r&&tu(e,a,r)}else for(var o in t)t.hasOwnProperty(o)&&tu(e,o,t[o])}function td(e){if(-1===e.indexOf("-"))return!1;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var tf=new Map([["acceptCharset","accept-charset"],["htmlFor","for"],["httpEquiv","http-equiv"],["crossOrigin","crossorigin"],["accentHeight","accent-height"],["alignmentBaseline","alignment-baseline"],["arabicForm","arabic-form"],["baselineShift","baseline-shift"],["capHeight","cap-height"],["clipPath","clip-path"],["clipRule","clip-rule"],["colorInterpolation","color-interpolation"],["colorInterpolationFilters","color-interpolation-filters"],["colorProfile","color-profile"],["colorRendering","color-rendering"],["dominantBaseline","dominant-baseline"],["enableBackground","enable-background"],["fillOpacity","fill-opacity"],["fillRule","fill-rule"],["floodColor","flood-color"],["floodOpacity","flood-opacity"],["fontFamily","font-family"],["fontSize","font-size"],["fontSizeAdjust","font-size-adjust"],["fontStretch","font-stretch"],["fontStyle","font-style"],["fontVariant","font-variant"],["fontWeight","font-weight"],["glyphName","glyph-name"],["glyphOrientationHorizontal","glyph-orientation-horizontal"],["glyphOrientationVertical","glyph-orientation-vertical"],["horizAdvX","horiz-adv-x"],["horizOriginX","horiz-origin-x"],["imageRendering","image-rendering"],["letterSpacing","letter-spacing"],["lightingColor","lighting-color"],["markerEnd","marker-end"],["markerMid","marker-mid"],["markerStart","marker-start"],["overlinePosition","overline-position"],["overlineThickness","overline-thickness"],["paintOrder","paint-order"],["panose-1","panose-1"],["pointerEvents","pointer-events"],["renderingIntent","rendering-intent"],["shapeRendering","shape-rendering"],["stopColor","stop-color"],["stopOpacity","stop-opacity"],["strikethroughPosition","strikethrough-position"],["strikethroughThickness","strikethrough-thickness"],["strokeDasharray","stroke-dasharray"],["strokeDashoffset","stroke-dashoffset"],["strokeLinecap","stroke-linecap"],["strokeLinejoin","stroke-linejoin"],["strokeMiterlimit","stroke-miterlimit"],["strokeOpacity","stroke-opacity"],["strokeWidth","stroke-width"],["textAnchor","text-anchor"],["textDecoration","text-decoration"],["textRendering","text-rendering"],["transformOrigin","transform-origin"],["underlinePosition","underline-position"],["underlineThickness","underline-thickness"],["unicodeBidi","unicode-bidi"],["unicodeRange","unicode-range"],["unitsPerEm","units-per-em"],["vAlphabetic","v-alphabetic"],["vHanging","v-hanging"],["vIdeographic","v-ideographic"],["vMathematical","v-mathematical"],["vectorEffect","vector-effect"],["vertAdvY","vert-adv-y"],["vertOriginX","vert-origin-x"],["vertOriginY","vert-origin-y"],["wordSpacing","word-spacing"],["writingMode","writing-mode"],["xmlnsXlink","xmlns:xlink"],["xHeight","x-height"]]),tp=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;function tm(e){return tp.test(""+e)?"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')":e}var th=null;function tg(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var tb=null,ty=null;function tv(e){var t=e$(e);if(t&&(e=t.stateNode)){var n=e[eL]||null;switch(e=t.stateNode,t.type){case"input":if(tt(e,n.value,n.defaultValue,n.defaultValue,n.checked,n.defaultChecked,n.type,n.name),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll('input[name="'+te(""+t)+'"][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var a=r[eL]||null;if(!a)throw Error(l(90));tt(r,a.value,a.defaultValue,a.defaultValue,a.checked,a.defaultChecked,a.type,a.name)}}for(t=0;t<n.length;t++)(r=n[t]).form===e.form&&e8(r)}break;case"textarea":to(e,n.value,n.defaultValue);break;case"select":null!=(t=n.value)&&ta(e,!!n.multiple,t,!1)}}}var tk=!1;function tw(e,t,n){if(tk)return e(t,n);tk=!0;try{return e(t)}finally{if(tk=!1,(null!==tb||null!==ty)&&(st(),tb&&(t=tb,e=ty,ty=tb=null,tv(t),e)))for(t=0;t<e.length;t++)tv(e[t])}}function tx(e,t){var n=e.stateNode;if(null===n)return null;var r=n[eL]||null;if(null===r)return null;switch(n=r[t],t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r="button"!==(e=e.type)&&"input"!==e&&"select"!==e&&"textarea"!==e),e=!r;break;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(l(231,t,typeof n));return n}var tS="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement,tE=!1;if(tS)try{var t_={};Object.defineProperty(t_,"passive",{get:function(){tE=!0}}),window.addEventListener("test",t_,t_),window.removeEventListener("test",t_,t_)}catch(e){tE=!1}var tC=null,tT=null,tP=null;function tA(){if(tP)return tP;var e,t,n=tT,r=n.length,a="value"in tC?tC.value:tC.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return tP=a.slice(e,1<t?1-t:void 0)}function tO(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function tL(){return!0}function tj(){return!1}function tN(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?tL:tj,this.isPropagationStopped=tj,this}return f(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=tL)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=tL)},persist:function(){},isPersistent:tL}),t}var tR,tI,tF,tD,tz,tM={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},t$=tN(tM),tB=f({},tM,{view:0,detail:0}),tU=tN(tB),tH=f({},tB,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:t0,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==tz&&(tz&&"mousemove"===e.type?(tF=e.screenX-tz.screenX,tD=e.screenY-tz.screenY):tD=tF=0,tz=e),tF)},movementY:function(e){return"movementY"in e?e.movementY:tD}}),tQ=tN(tH),tZ=tN(f({},tH,{dataTransfer:0})),tV=tN(f({},tB,{relatedTarget:0})),tW=tN(f({},tM,{animationName:0,elapsedTime:0,pseudoElement:0})),tq=tN(f({},tM,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}})),tG=tN(f({},tM,{data:0})),tY={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},tK={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},tX={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function tJ(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=tX[e])&&!!t[e]}function t0(){return tJ}var t1=tN(f({},tB,{key:function(e){if(e.key){var t=tY[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tO(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?tK[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:t0,charCode:function(e){return"keypress"===e.type?tO(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tO(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}})),t2=tN(f({},tH,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),t4=tN(f({},tB,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:t0})),t3=tN(f({},tM,{propertyName:0,elapsedTime:0,pseudoElement:0})),t6=tN(f({},tH,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0})),t9=tN(f({},tM,{newState:0,oldState:0})),t8=[9,13,27,32],t5=tS&&"CompositionEvent"in window,t7=null;tS&&"documentMode"in document&&(t7=document.documentMode);var ne=tS&&"TextEvent"in window&&!t7,nt=tS&&(!t5||t7&&8<t7&&11>=t7),nn=!1;function nr(e,t){switch(e){case"keyup":return -1!==t8.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function na(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var no=!1,ni={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function nl(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!ni[e.type]:"textarea"===t}function ns(e,t,n,r){tb?ty?ty.push(r):ty=[r]:tb=r,0<(t=s2(t,"onChange")).length&&(n=new t$("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var nu=null,nc=null;function nd(e){sq(e,0)}function nf(e){if(e8(eB(e)))return e}function np(e,t){if("change"===e)return t}var nm=!1;if(tS){if(tS){var nh="oninput"in document;if(!nh){var ng=document.createElement("div");ng.setAttribute("oninput","return;"),nh="function"==typeof ng.oninput}r=nh}else r=!1;nm=r&&(!document.documentMode||9<document.documentMode)}function nb(){nu&&(nu.detachEvent("onpropertychange",ny),nc=nu=null)}function ny(e){if("value"===e.propertyName&&nf(nc)){var t=[];ns(t,nc,e,tg(e)),tw(nd,t)}}function nv(e,t,n){"focusin"===e?(nb(),nu=t,nc=n,nu.attachEvent("onpropertychange",ny)):"focusout"===e&&nb()}function nk(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return nf(nc)}function nw(e,t){if("click"===e)return nf(t)}function nx(e,t){if("input"===e||"change"===e)return nf(t)}var nS="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function nE(e,t){if(nS(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var a=n[r];if(!G.call(t,a)||!nS(e[a],t[a]))return!1}return!0}function n_(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function nC(e,t){var n,r=n_(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=n_(r)}}function nT(e){e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window;for(var t=e5(e.document);t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(n)e=t.contentWindow;else break;t=e5(e.document)}return t}function nP(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var nA=tS&&"documentMode"in document&&11>=document.documentMode,nO=null,nL=null,nj=null,nN=!1;function nR(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;nN||null==nO||nO!==e5(r)||(r="selectionStart"in(r=nO)&&nP(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},nj&&nE(nj,r)||(nj=r,0<(r=s2(nL,"onSelect")).length&&(t=new t$("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=nO)))}function nI(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var nF={animationend:nI("Animation","AnimationEnd"),animationiteration:nI("Animation","AnimationIteration"),animationstart:nI("Animation","AnimationStart"),transitionrun:nI("Transition","TransitionRun"),transitionstart:nI("Transition","TransitionStart"),transitioncancel:nI("Transition","TransitionCancel"),transitionend:nI("Transition","TransitionEnd")},nD={},nz={};function nM(e){if(nD[e])return nD[e];if(!nF[e])return e;var t,n=nF[e];for(t in n)if(n.hasOwnProperty(t)&&t in nz)return nD[e]=n[t];return e}tS&&(nz=document.createElement("div").style,"AnimationEvent"in window||(delete nF.animationend.animation,delete nF.animationiteration.animation,delete nF.animationstart.animation),"TransitionEvent"in window||delete nF.transitionend.transition);var n$=nM("animationend"),nB=nM("animationiteration"),nU=nM("animationstart"),nH=nM("transitionrun"),nQ=nM("transitionstart"),nZ=nM("transitioncancel"),nV=nM("transitionend"),nW=new Map,nq="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function nG(e,t){nW.set(e,t),eV(t,[e])}nq.push("scrollEnd");var nY=new WeakMap;function nK(e,t){if("object"==typeof e&&null!==e){var n=nY.get(e);return void 0!==n?n:(t={value:e,source:t,stack:e4(t)},nY.set(e,t),t)}return{value:e,source:t,stack:e4(t)}}var nX=[],nJ=0,n0=0;function n1(){for(var e=nJ,t=n0=nJ=0;t<e;){var n=nX[t];nX[t++]=null;var r=nX[t];nX[t++]=null;var a=nX[t];nX[t++]=null;var o=nX[t];if(nX[t++]=null,null!==r&&null!==a){var i=r.pending;null===i?a.next=a:(a.next=i.next,i.next=a),r.pending=a}0!==o&&n6(n,a,o)}}function n2(e,t,n,r){nX[nJ++]=e,nX[nJ++]=t,nX[nJ++]=n,nX[nJ++]=r,n0|=r,e.lanes|=r,null!==(e=e.alternate)&&(e.lanes|=r)}function n4(e,t,n,r){return n2(e,t,n,r),n9(e)}function n3(e,t){return n2(e,null,null,t),n9(e)}function n6(e,t,n){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n);for(var a=!1,o=e.return;null!==o;)o.childLanes|=n,null!==(r=o.alternate)&&(r.childLanes|=n),22===o.tag&&(null===(e=o.stateNode)||1&e._visibility||(a=!0)),e=o,o=o.return;return 3===e.tag?(o=e.stateNode,a&&null!==t&&(a=31-ef(n),null===(r=(e=o.hiddenUpdates)[a])?e[a]=[t]:r.push(t),t.lane=0x20000000|n),o):null}function n9(e){if(50<l4)throw l4=0,l3=null,Error(l(185));for(var t=e.return;null!==t;)t=(e=t).return;return 3===e.tag?e.stateNode:null}var n8={};function n5(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function n7(e,t,n,r){return new n5(e,t,n,r)}function re(e){return!(!(e=e.prototype)||!e.isReactComponent)}function rt(e,t){var n=e.alternate;return null===n?((n=n7(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=0x3e00000&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n.refCleanup=e.refCleanup,n}function rn(e,t){e.flags&=0x3e00002;var n=e.alternate;return null===n?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=n.childLanes,e.lanes=n.lanes,e.child=n.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=n.memoizedProps,e.memoizedState=n.memoizedState,e.updateQueue=n.updateQueue,e.type=n.type,e.dependencies=null===(t=n.dependencies)?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function rr(e,t,n,r,a,o){var i=0;if(r=e,"function"==typeof e)re(e)&&(i=1);else if("string"==typeof e)i=!function(e,t,n){if(1===n||null!=t.itemProp)return!1;switch(e){case"meta":case"title":return!0;case"style":if("string"!=typeof t.precedence||"string"!=typeof t.href||""===t.href)break;return!0;case"link":if("string"!=typeof t.rel||"string"!=typeof t.href||""===t.href||t.onLoad||t.onError)break;if("stylesheet"===t.rel)return e=t.disabled,"string"==typeof t.precedence&&null==e;return!0;case"script":if(t.async&&"function"!=typeof t.async&&"symbol"!=typeof t.async&&!t.onLoad&&!t.onError&&t.src&&"string"==typeof t.src)return!0}return!1}(e,n,B.current)?"html"===e||"head"===e||"body"===e?27:5:26;else e:switch(e){case T:return(e=n7(31,n,t,a)).elementType=T,e.lanes=o,e;case g:return ra(n.children,a,o,t);case b:i=8,a|=24;break;case y:return(e=n7(12,n,t,2|a)).elementType=y,e.lanes=o,e;case S:return(e=n7(13,n,t,a)).elementType=S,e.lanes=o,e;case E:return(e=n7(19,n,t,a)).elementType=E,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case v:case w:i=10;break e;case k:i=9;break e;case x:i=11;break e;case _:i=14;break e;case C:i=16,r=null;break e}i=29,n=Error(l(130,null===e?"null":typeof e,"")),r=null}return(t=n7(i,n,t,a)).elementType=e,t.type=r,t.lanes=o,t}function ra(e,t,n,r){return(e=n7(7,e,r,t)).lanes=n,e}function ro(e,t,n){return(e=n7(6,e,null,t)).lanes=n,e}function ri(e,t,n){return(t=n7(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var rl=[],rs=0,ru=null,rc=0,rd=[],rf=0,rp=null,rm=1,rh="";function rg(e,t){rl[rs++]=rc,rl[rs++]=ru,ru=e,rc=t}function rb(e,t,n){rd[rf++]=rm,rd[rf++]=rh,rd[rf++]=rp,rp=e;var r=rm;e=rh;var a=32-ef(r)-1;r&=~(1<<a),n+=1;var o=32-ef(t)+a;if(30<o){var i=a-a%5;o=(r&(1<<i)-1).toString(32),r>>=i,a-=i,rm=1<<32-ef(t)+a|n<<a|r,rh=o+e}else rm=1<<o|n<<a|r,rh=e}function ry(e){null!==e.return&&(rg(e,1),rb(e,1,0))}function rv(e){for(;e===ru;)ru=rl[--rs],rl[rs]=null,rc=rl[--rs],rl[rs]=null;for(;e===rp;)rp=rd[--rf],rd[rf]=null,rh=rd[--rf],rd[rf]=null,rm=rd[--rf],rd[rf]=null}var rk=null,rw=null,rx=!1,rS=null,rE=!1,r_=Error(l(519));function rC(e){throw rj(nK(Error(l(418,"")),e)),r_}function rT(e){var t=e.stateNode,n=e.type,r=e.memoizedProps;switch(t[eO]=e,t[eL]=r,n){case"dialog":sG("cancel",t),sG("close",t);break;case"iframe":case"object":case"embed":sG("load",t);break;case"video":case"audio":for(n=0;n<sV.length;n++)sG(sV[n],t);break;case"source":sG("error",t);break;case"img":case"image":case"link":sG("error",t),sG("load",t);break;case"details":sG("toggle",t);break;case"input":sG("invalid",t),tn(t,r.value,r.defaultValue,r.checked,r.defaultChecked,r.type,r.name,!0),e9(t);break;case"select":sG("invalid",t);break;case"textarea":sG("invalid",t),ti(t,r.value,r.defaultValue,r.children),e9(t)}"string"!=typeof(n=r.children)&&"number"!=typeof n&&"bigint"!=typeof n||t.textContent===""+n||!0===r.suppressHydrationWarning||s5(t.textContent,n)?(null!=r.popover&&(sG("beforetoggle",t),sG("toggle",t)),null!=r.onScroll&&sG("scroll",t),null!=r.onScrollEnd&&sG("scrollend",t),null!=r.onClick&&(t.onclick=s7),t=!0):t=!1,t||rC(e)}function rP(e){for(rk=e.return;rk;)switch(rk.tag){case 5:case 13:rE=!1;return;case 27:case 3:rE=!0;return;default:rk=rk.return}}function rA(e){if(e!==rk)return!1;if(!rx)return rP(e),rx=!0,!1;var t,n=e.tag;if((t=3!==n&&27!==n)&&((t=5===n)&&(t="form"===(t=e.type)||"button"===t||us(e.type,e.memoizedProps)),t=!t),t&&rw&&rC(e),rP(e),13===n){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(l(317));e:{for(n=0,e=e.nextSibling;e;){if(8===e.nodeType)if("/$"===(t=e.data)){if(0===n){rw=uv(e.nextSibling);break e}n--}else"$"!==t&&"$!"!==t&&"$?"!==t||n++;e=e.nextSibling}rw=null}}else 27===n?(n=rw,uh(e.type)?(e=uk,uk=null,rw=e):rw=n):rw=rk?uv(e.stateNode.nextSibling):null;return!0}function rO(){rw=rk=null,rx=!1}function rL(){var e=rS;return null!==e&&(null===lQ?lQ=e:lQ.push.apply(lQ,e),rS=null),e}function rj(e){null===rS?rS=[e]:rS.push(e)}var rN=z(null),rR=null,rI=null;function rF(e,t,n){$(rN,t._currentValue),t._currentValue=n}function rD(e){e._currentValue=rN.current,M(rN)}function rz(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function rM(e,t,n,r){var a=e.child;for(null!==a&&(a.return=e);null!==a;){var o=a.dependencies;if(null!==o){var i=a.child;o=o.firstContext;e:for(;null!==o;){var s=o;o=a;for(var u=0;u<t.length;u++)if(s.context===t[u]){o.lanes|=n,null!==(s=o.alternate)&&(s.lanes|=n),rz(o.return,n,e),r||(i=null);break e}o=s.next}}else if(18===a.tag){if(null===(i=a.return))throw Error(l(341));i.lanes|=n,null!==(o=i.alternate)&&(o.lanes|=n),rz(i,n,e),i=null}else i=a.child;if(null!==i)i.return=a;else for(i=a;null!==i;){if(i===e){i=null;break}if(null!==(a=i.sibling)){a.return=i.return,i=a;break}i=i.return}a=i}}function r$(e,t,n,r){e=null;for(var a=t,o=!1;null!==a;){if(!o){if(0!=(524288&a.flags))o=!0;else if(0!=(262144&a.flags))break}if(10===a.tag){var i=a.alternate;if(null===i)throw Error(l(387));if(null!==(i=i.memoizedProps)){var s=a.type;nS(a.pendingProps.value,i.value)||(null!==e?e.push(s):e=[s])}}else if(a===Q.current){if(null===(i=a.alternate))throw Error(l(387));i.memoizedState.memoizedState!==a.memoizedState.memoizedState&&(null!==e?e.push(uY):e=[uY])}a=a.return}null!==e&&rM(t,e,n,r),t.flags|=262144}function rB(e){for(e=e.firstContext;null!==e;){if(!nS(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function rU(e){rR=e,rI=null,null!==(e=e.dependencies)&&(e.firstContext=null)}function rH(e){return rZ(rR,e)}function rQ(e,t){return null===rR&&rU(e),rZ(e,t)}function rZ(e,t){var n=t._currentValue;if(t={context:t,memoizedValue:n,next:null},null===rI){if(null===e)throw Error(l(308));rI=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else rI=rI.next=t;return n}var rV="undefined"!=typeof AbortController?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(t,n){e.push(n)}};this.abort=function(){t.aborted=!0,e.forEach(function(e){return e()})}},rW=a.unstable_scheduleCallback,rq=a.unstable_NormalPriority,rG={$$typeof:w,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function rY(){return{controller:new rV,data:new Map,refCount:0}}function rK(e){e.refCount--,0===e.refCount&&rW(rq,function(){e.controller.abort()})}var rX=null,rJ=0,r0=0,r1=null;function r2(){if(0==--rJ&&null!==rX){null!==r1&&(r1.status="fulfilled");var e=rX;rX=null,r0=0,r1=null;for(var t=0;t<e.length;t++)(0,e[t])()}}var r4=N.S;N.S=function(e,t){"object"==typeof t&&null!==t&&"function"==typeof t.then&&function(e,t){if(null===rX){var n=rX=[];rJ=0,r0=sB(),r1={status:"pending",value:void 0,then:function(e){n.push(e)}}}rJ++,t.then(r2,r2)}(0,t),null!==r4&&r4(e,t)};var r3=z(null);function r6(){var e=r3.current;return null!==e?e:lP.pooledCache}function r9(e,t){null===t?$(r3,r3.current):$(r3,t.pool)}function r8(){var e=r6();return null===e?null:{parent:rG._currentValue,pool:e}}var r5=Error(l(460)),r7=Error(l(474)),ae=Error(l(542)),at={then:function(){}};function an(e){return"fulfilled"===(e=e.status)||"rejected"===e}function ar(){}function aa(e,t,n){switch(void 0===(n=e[n])?e.push(t):n!==t&&(t.then(ar,ar),t=n),t.status){case"fulfilled":return t.value;case"rejected":throw al(e=t.reason),e;default:if("string"==typeof t.status)t.then(ar,ar);else{if(null!==(e=lP)&&100<e.shellSuspendCounter)throw Error(l(482));(e=t).status="pending",e.then(function(e){if("pending"===t.status){var n=t;n.status="fulfilled",n.value=e}},function(e){if("pending"===t.status){var n=t;n.status="rejected",n.reason=e}})}switch(t.status){case"fulfilled":return t.value;case"rejected":throw al(e=t.reason),e}throw ao=t,r5}}var ao=null;function ai(){if(null===ao)throw Error(l(459));var e=ao;return ao=null,e}function al(e){if(e===r5||e===ae)throw Error(l(483))}var as=!1;function au(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function ac(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function ad(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function af(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&lT)){var a=r.pending;return null===a?t.next=t:(t.next=a.next,a.next=t),r.pending=t,t=n9(e),n6(e,null,n),t}return n2(e,r,t,n),n9(e)}function ap(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194048&n))){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,e_(e,n)}}function am(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};null===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var ah=!1;function ag(){if(ah){var e=r1;if(null!==e)throw e}}function ab(e,t,n,r){ah=!1;var a=e.updateQueue;as=!1;var o=a.firstBaseUpdate,i=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var s=l,u=s.next;s.next=null,null===i?o=u:i.next=u,i=s;var c=e.alternate;null!==c&&(l=(c=c.updateQueue).lastBaseUpdate)!==i&&(null===l?c.firstBaseUpdate=u:l.next=u,c.lastBaseUpdate=s)}if(null!==o){var d=a.baseState;for(i=0,c=u=s=null,l=o;;){var p=-0x20000001&l.lane,m=p!==l.lane;if(m?(lO&p)===p:(r&p)===p){0!==p&&p===r0&&(ah=!0),null!==c&&(c=c.next={lane:0,tag:l.tag,payload:l.payload,callback:null,next:null});e:{var h=e,g=l;switch(p=t,g.tag){case 1:if("function"==typeof(h=g.payload)){d=h.call(n,d,p);break e}d=h;break e;case 3:h.flags=-65537&h.flags|128;case 0:if(null==(p="function"==typeof(h=g.payload)?h.call(n,d,p):h))break e;d=f({},d,p);break e;case 2:as=!0}}null!==(p=l.callback)&&(e.flags|=64,m&&(e.flags|=8192),null===(m=a.callbacks)?a.callbacks=[p]:m.push(p))}else m={lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===c?(u=c=m,s=d):c=c.next=m,i|=p;if(null===(l=l.next))if(null===(l=a.shared.pending))break;else l=(m=l).next,m.next=null,a.lastBaseUpdate=m,a.shared.pending=null}null===c&&(s=d),a.baseState=s,a.firstBaseUpdate=u,a.lastBaseUpdate=c,null===o&&(a.shared.lanes=0),lz|=i,e.lanes=i,e.memoizedState=d}}function ay(e,t){if("function"!=typeof e)throw Error(l(191,e));e.call(t)}function av(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;e<n.length;e++)ay(n[e],t)}var ak=z(null),aw=z(0);function ax(e,t){$(aw,e=lF),$(ak,t),lF=e|t.baseLanes}function aS(){$(aw,lF),$(ak,ak.current)}function aE(){lF=aw.current,M(ak),M(aw)}var a_=0,aC=null,aT=null,aP=null,aA=!1,aO=!1,aL=!1,aj=0,aN=0,aR=null,aI=0;function aF(){throw Error(l(321))}function aD(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!nS(e[n],t[n]))return!1;return!0}function az(e,t,n,r,a,o){return a_=o,aC=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,N.H=null===e||null===e.memoizedState?oQ:oZ,aL=!1,o=n(r,a),aL=!1,aO&&(o=a$(t,n,r,a)),aM(e),o}function aM(e){N.H=oH;var t=null!==aT&&null!==aT.next;if(a_=0,aP=aT=aC=null,aA=!1,aN=0,aR=null,t)throw Error(l(300));null===e||ib||null!==(e=e.dependencies)&&rB(e)&&(ib=!0)}function a$(e,t,n,r){aC=e;var a=0;do{if(aO&&(aR=null),aN=0,aO=!1,25<=a)throw Error(l(301));if(a+=1,aP=aT=null,null!=e.updateQueue){var o=e.updateQueue;o.lastEffect=null,o.events=null,o.stores=null,null!=o.memoCache&&(o.memoCache.index=0)}N.H=oV,o=t(n,r)}while(aO);return o}function aB(){var e=N.H,t=e.useState()[0];return t="function"==typeof t.then?aq(t):t,e=e.useState()[0],(null!==aT?aT.memoizedState:null)!==e&&(aC.flags|=1024),t}function aU(){var e=0!==aj;return aj=0,e}function aH(e,t,n){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n}function aQ(e){if(aA){for(e=e.memoizedState;null!==e;){var t=e.queue;null!==t&&(t.pending=null),e=e.next}aA=!1}a_=0,aP=aT=aC=null,aO=!1,aN=aj=0,aR=null}function aZ(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===aP?aC.memoizedState=aP=e:aP=aP.next=e,aP}function aV(){if(null===aT){var e=aC.alternate;e=null!==e?e.memoizedState:null}else e=aT.next;var t=null===aP?aC.memoizedState:aP.next;if(null!==t)aP=t,aT=e;else{if(null===e){if(null===aC.alternate)throw Error(l(467));throw Error(l(310))}e={memoizedState:(aT=e).memoizedState,baseState:aT.baseState,baseQueue:aT.baseQueue,queue:aT.queue,next:null},null===aP?aC.memoizedState=aP=e:aP=aP.next=e}return aP}function aW(){return{lastEffect:null,events:null,stores:null,memoCache:null}}function aq(e){var t=aN;return aN+=1,null===aR&&(aR=[]),e=aa(aR,e,t),t=aC,null===(null===aP?t.memoizedState:aP.next)&&(N.H=null===(t=t.alternate)||null===t.memoizedState?oQ:oZ),e}function aG(e){if(null!==e&&"object"==typeof e){if("function"==typeof e.then)return aq(e);if(e.$$typeof===w)return rH(e)}throw Error(l(438,String(e)))}function aY(e){var t=null,n=aC.updateQueue;if(null!==n&&(t=n.memoCache),null==t){var r=aC.alternate;null!==r&&null!==(r=r.updateQueue)&&null!=(r=r.memoCache)&&(t={data:r.data.map(function(e){return e.slice()}),index:0})}if(null==t&&(t={data:[],index:0}),null===n&&(n=aW(),aC.updateQueue=n),n.memoCache=t,void 0===(n=t.data[t.index]))for(n=t.data[t.index]=Array(e),r=0;r<e;r++)n[r]=P;return t.index++,n}function aK(e,t){return"function"==typeof t?t(e):t}function aX(e){return aJ(aV(),aT,e)}function aJ(e,t,n){var r=e.queue;if(null===r)throw Error(l(311));r.lastRenderedReducer=n;var a=e.baseQueue,o=r.pending;if(null!==o){if(null!==a){var i=a.next;a.next=o.next,o.next=i}t.baseQueue=a=o,r.pending=null}if(o=e.baseState,null===a)e.memoizedState=o;else{t=a.next;var s=i=null,u=null,c=t,d=!1;do{var f=-0x20000001&c.lane;if(f!==c.lane?(lO&f)===f:(a_&f)===f){var p=c.revertLane;if(0===p)null!==u&&(u=u.next={lane:0,revertLane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),f===r0&&(d=!0);else if((a_&p)===p){c=c.next,p===r0&&(d=!0);continue}else f={lane:0,revertLane:c.revertLane,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null},null===u?(s=u=f,i=o):u=u.next=f,aC.lanes|=p,lz|=p;f=c.action,aL&&n(o,f),o=c.hasEagerState?c.eagerState:n(o,f)}else p={lane:f,revertLane:c.revertLane,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null},null===u?(s=u=p,i=o):u=u.next=p,aC.lanes|=f,lz|=f;c=c.next}while(null!==c&&c!==t);if(null===u?i=o:u.next=s,!nS(o,e.memoizedState)&&(ib=!0,d&&null!==(n=r1)))throw n;e.memoizedState=o,e.baseState=i,e.baseQueue=u,r.lastRenderedState=o}return null===a&&(r.lanes=0),[e.memoizedState,r.dispatch]}function a0(e){var t=aV(),n=t.queue;if(null===n)throw Error(l(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,o=t.memoizedState;if(null!==a){n.pending=null;var i=a=a.next;do o=e(o,i.action),i=i.next;while(i!==a);nS(o,t.memoizedState)||(ib=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function a1(e,t,n){var r=aC,a=aV(),o=rx;if(o){if(void 0===n)throw Error(l(407));n=n()}else n=t();var i=!nS((aT||a).memoizedState,n);if(i&&(a.memoizedState=n,ib=!0),a=a.queue,oh(2048,8,a3.bind(null,r,a,e),[e]),a.getSnapshot!==t||i||null!==aP&&1&aP.memoizedState.tag){if(r.flags|=2048,od(9,of(),a4.bind(null,r,a,n,t),null),null===lP)throw Error(l(349));o||0!=(124&a_)||a2(r,t,n)}return n}function a2(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=aC.updateQueue)?(t=aW(),aC.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function a4(e,t,n,r){t.value=n,t.getSnapshot=r,a6(t)&&a9(e)}function a3(e,t,n){return n(function(){a6(t)&&a9(e)})}function a6(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!nS(e,n)}catch(e){return!0}}function a9(e){var t=n3(e,2);null!==t&&l8(t,e,2)}function a8(e){var t=aZ();if("function"==typeof e){var n=e;if(e=n(),aL){ed(!0);try{n()}finally{ed(!1)}}}return t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:aK,lastRenderedState:e},t}function a5(e,t,n,r){return e.baseState=n,aJ(e,aT,"function"==typeof r?r:aK)}function a7(e,t,n,r,a){if(o$(e))throw Error(l(485));if(null!==(e=t.action)){var o={payload:a,action:e,next:null,isTransition:!0,status:"pending",value:null,reason:null,listeners:[],then:function(e){o.listeners.push(e)}};null!==N.T?n(!0):o.isTransition=!1,r(o),null===(n=t.pending)?(o.next=t.pending=o,oe(t,o)):(o.next=n.next,t.pending=n.next=o)}}function oe(e,t){var n=t.action,r=t.payload,a=e.state;if(t.isTransition){var o=N.T,i={};N.T=i;try{var l=n(a,r),s=N.S;null!==s&&s(i,l),ot(e,t,l)}catch(n){or(e,t,n)}finally{N.T=o}}else try{o=n(a,r),ot(e,t,o)}catch(n){or(e,t,n)}}function ot(e,t,n){null!==n&&"object"==typeof n&&"function"==typeof n.then?n.then(function(n){on(e,t,n)},function(n){return or(e,t,n)}):on(e,t,n)}function on(e,t,n){t.status="fulfilled",t.value=n,oa(t),e.state=n,null!==(t=e.pending)&&((n=t.next)===t?e.pending=null:(n=n.next,t.next=n,oe(e,n)))}function or(e,t,n){var r=e.pending;if(e.pending=null,null!==r){r=r.next;do t.status="rejected",t.reason=n,oa(t),t=t.next;while(t!==r)}e.action=null}function oa(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}function oo(e,t){return t}function oi(e,t){if(rx){var n=lP.formState;if(null!==n){e:{var r=aC;if(rx){if(rw){t:{for(var a=rw,o=rE;8!==a.nodeType;)if(!o||null===(a=uv(a.nextSibling))){a=null;break t}a="F!"===(o=a.data)||"F"===o?a:null}if(a){rw=uv(a.nextSibling),r="F!"===a.data;break e}}rC(r)}r=!1}r&&(t=n[0])}}return(n=aZ()).memoizedState=n.baseState=t,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:oo,lastRenderedState:t},n.queue=r,n=oD.bind(null,aC,r),r.dispatch=n,r=a8(!1),o=oM.bind(null,aC,!1,r.queue),r=aZ(),a={state:t,dispatch:null,action:e,pending:null},r.queue=a,n=a7.bind(null,aC,a,o,n),a.dispatch=n,r.memoizedState=e,[t,n,!1]}function ol(e){return os(aV(),aT,e)}function os(e,t,n){if(t=aJ(e,t,oo)[0],e=aX(aK)[0],"object"==typeof t&&null!==t&&"function"==typeof t.then)try{var r=aq(t)}catch(e){if(e===r5)throw ae;throw e}else r=t;var a=(t=aV()).queue,o=a.dispatch;return n!==t.memoizedState&&(aC.flags|=2048,od(9,of(),ou.bind(null,a,n),null)),[r,o,e]}function ou(e,t){e.action=t}function oc(e){var t=aV(),n=aT;if(null!==n)return os(t,n,e);aV(),t=t.memoizedState;var r=(n=aV()).queue.dispatch;return n.memoizedState=e,[t,r,!1]}function od(e,t,n,r){return e={tag:e,create:n,deps:r,inst:t,next:null},null===(t=aC.updateQueue)&&(t=aW(),aC.updateQueue=t),null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function of(){return{destroy:void 0,resource:void 0}}function op(){return aV().memoizedState}function om(e,t,n,r){var a=aZ();r=void 0===r?null:r,aC.flags|=e,a.memoizedState=od(1|t,of(),n,r)}function oh(e,t,n,r){var a=aV();r=void 0===r?null:r;var o=a.memoizedState.inst;null!==aT&&null!==r&&aD(r,aT.memoizedState.deps)?a.memoizedState=od(t,o,n,r):(aC.flags|=e,a.memoizedState=od(1|t,o,n,r))}function og(e,t){om(8390656,8,e,t)}function ob(e,t){oh(2048,8,e,t)}function oy(e,t){return oh(4,2,e,t)}function ov(e,t){return oh(4,4,e,t)}function ok(e,t){if("function"==typeof t){var n=t(e=e());return function(){"function"==typeof n?n():t(null)}}if(null!=t)return t.current=e=e(),function(){t.current=null}}function ow(e,t,n){n=null!=n?n.concat([e]):null,oh(4,4,ok.bind(null,t,e),n)}function ox(){}function oS(e,t){var n=aV();t=void 0===t?null:t;var r=n.memoizedState;return null!==t&&aD(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function oE(e,t){var n=aV();t=void 0===t?null:t;var r=n.memoizedState;if(null!==t&&aD(t,r[1]))return r[0];if(r=e(),aL){ed(!0);try{e()}finally{ed(!1)}}return n.memoizedState=[r,t],r}function o_(e,t,n){return void 0===n||0!=(0x40000000&a_)?e.memoizedState=t:(e.memoizedState=n,e=l9(),aC.lanes|=e,lz|=e,n)}function oC(e,t,n,r){return nS(n,t)?n:null!==ak.current?(nS(e=o_(e,n,r),t)||(ib=!0),e):0==(42&a_)?(ib=!0,e.memoizedState=n):(e=l9(),aC.lanes|=e,lz|=e,t)}function oT(e,t,n,r,a){var o=R.p;R.p=0!==o&&8>o?o:8;var i=N.T,l={};N.T=l,oM(e,!1,t,n);try{var s=a(),u=N.S;if(null!==u&&u(l,s),null!==s&&"object"==typeof s&&"function"==typeof s.then){var c,d,f=(c=[],d={status:"pending",value:null,reason:null,then:function(e){c.push(e)}},s.then(function(){d.status="fulfilled",d.value=r;for(var e=0;e<c.length;e++)(0,c[e])(r)},function(e){for(d.status="rejected",d.reason=e,e=0;e<c.length;e++)(0,c[e])(void 0)}),d);oz(e,t,f,l6(e))}else oz(e,t,r,l6(e))}catch(n){oz(e,t,{then:function(){},status:"rejected",reason:n},l6())}finally{R.p=o,N.T=i}}function oP(){}function oA(e,t,n,r){if(5!==e.tag)throw Error(l(476));var a=oO(e).queue;oT(e,a,t,I,null===n?oP:function(){return oL(e),n(r)})}function oO(e){var t=e.memoizedState;if(null!==t)return t;var n={};return(t={memoizedState:I,baseState:I,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:aK,lastRenderedState:I},next:null}).next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:aK,lastRenderedState:n},next:null},e.memoizedState=t,null!==(e=e.alternate)&&(e.memoizedState=t),t}function oL(e){var t=oO(e).next.queue;oz(e,t,{},l6())}function oj(){return rH(uY)}function oN(){return aV().memoizedState}function oR(){return aV().memoizedState}function oI(e){for(var t=e.return;null!==t;){switch(t.tag){case 24:case 3:var n=l6(),r=af(t,e=ad(n),n);null!==r&&(l8(r,t,n),ap(r,t,n)),t={cache:rY()},e.payload=t;return}t=t.return}}function oF(e,t,n){var r=l6();n={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},o$(e)?oB(t,n):null!==(n=n4(e,t,n,r))&&(l8(n,e,r),oU(n,t,r))}function oD(e,t,n){oz(e,t,n,l6())}function oz(e,t,n,r){var a={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(o$(e))oB(t,a);else{var o=e.alternate;if(0===e.lanes&&(null===o||0===o.lanes)&&null!==(o=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=o(i,n);if(a.hasEagerState=!0,a.eagerState=l,nS(l,i))return n2(e,t,a,0),null===lP&&n1(),!1}catch(e){}finally{}if(null!==(n=n4(e,t,a,r)))return l8(n,e,r),oU(n,t,r),!0}return!1}function oM(e,t,n,r){if(r={lane:2,revertLane:sB(),action:r,hasEagerState:!1,eagerState:null,next:null},o$(e)){if(t)throw Error(l(479))}else null!==(t=n4(e,n,r,2))&&l8(t,e,2)}function o$(e){var t=e.alternate;return e===aC||null!==t&&t===aC}function oB(e,t){aO=aA=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function oU(e,t,n){if(0!=(4194048&n)){var r=t.lanes;r&=e.pendingLanes,t.lanes=n|=r,e_(e,n)}}var oH={readContext:rH,use:aG,useCallback:aF,useContext:aF,useEffect:aF,useImperativeHandle:aF,useLayoutEffect:aF,useInsertionEffect:aF,useMemo:aF,useReducer:aF,useRef:aF,useState:aF,useDebugValue:aF,useDeferredValue:aF,useTransition:aF,useSyncExternalStore:aF,useId:aF,useHostTransitionStatus:aF,useFormState:aF,useActionState:aF,useOptimistic:aF,useMemoCache:aF,useCacheRefresh:aF},oQ={readContext:rH,use:aG,useCallback:function(e,t){return aZ().memoizedState=[e,void 0===t?null:t],e},useContext:rH,useEffect:og,useImperativeHandle:function(e,t,n){n=null!=n?n.concat([e]):null,om(4194308,4,ok.bind(null,t,e),n)},useLayoutEffect:function(e,t){return om(4194308,4,e,t)},useInsertionEffect:function(e,t){om(4,2,e,t)},useMemo:function(e,t){var n=aZ();t=void 0===t?null:t;var r=e();if(aL){ed(!0);try{e()}finally{ed(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=aZ();if(void 0!==n){var a=n(t);if(aL){ed(!0);try{n(t)}finally{ed(!1)}}}else a=t;return r.memoizedState=r.baseState=a,r.queue=e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:a},e=e.dispatch=oF.bind(null,aC,e),[r.memoizedState,e]},useRef:function(e){return aZ().memoizedState=e={current:e}},useState:function(e){var t=(e=a8(e)).queue,n=oD.bind(null,aC,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ox,useDeferredValue:function(e,t){return o_(aZ(),e,t)},useTransition:function(){var e=a8(!1);return e=oT.bind(null,aC,e.queue,!0,!1),aZ().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=aC,a=aZ();if(rx){if(void 0===n)throw Error(l(407));n=n()}else{if(n=t(),null===lP)throw Error(l(349));0!=(124&lO)||a2(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,og(a3.bind(null,r,o,e),[e]),r.flags|=2048,od(9,of(),a4.bind(null,r,o,n,t),null),n},useId:function(){var e=aZ(),t=lP.identifierPrefix;if(rx){var n=rh,r=rm;t="\xab"+t+"R"+(n=(r&~(1<<32-ef(r)-1)).toString(32)+n),0<(n=aj++)&&(t+="H"+n.toString(32)),t+="\xbb"}else t="\xab"+t+"r"+(n=aI++).toString(32)+"\xbb";return e.memoizedState=t},useHostTransitionStatus:oj,useFormState:oi,useActionState:oi,useOptimistic:function(e){var t=aZ();t.memoizedState=t.baseState=e;var n={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=n,t=oM.bind(null,aC,!0,n),n.dispatch=t,[e,t]},useMemoCache:aY,useCacheRefresh:function(){return aZ().memoizedState=oI.bind(null,aC)}},oZ={readContext:rH,use:aG,useCallback:oS,useContext:rH,useEffect:ob,useImperativeHandle:ow,useInsertionEffect:oy,useLayoutEffect:ov,useMemo:oE,useReducer:aX,useRef:op,useState:function(){return aX(aK)},useDebugValue:ox,useDeferredValue:function(e,t){return oC(aV(),aT.memoizedState,e,t)},useTransition:function(){var e=aX(aK)[0],t=aV().memoizedState;return["boolean"==typeof e?e:aq(e),t]},useSyncExternalStore:a1,useId:oN,useHostTransitionStatus:oj,useFormState:ol,useActionState:ol,useOptimistic:function(e,t){return a5(aV(),aT,e,t)},useMemoCache:aY,useCacheRefresh:oR},oV={readContext:rH,use:aG,useCallback:oS,useContext:rH,useEffect:ob,useImperativeHandle:ow,useInsertionEffect:oy,useLayoutEffect:ov,useMemo:oE,useReducer:a0,useRef:op,useState:function(){return a0(aK)},useDebugValue:ox,useDeferredValue:function(e,t){var n=aV();return null===aT?o_(n,e,t):oC(n,aT.memoizedState,e,t)},useTransition:function(){var e=a0(aK)[0],t=aV().memoizedState;return["boolean"==typeof e?e:aq(e),t]},useSyncExternalStore:a1,useId:oN,useHostTransitionStatus:oj,useFormState:oc,useActionState:oc,useOptimistic:function(e,t){var n=aV();return null!==aT?a5(n,aT,e,t):(n.baseState=e,[e,n.queue.dispatch])},useMemoCache:aY,useCacheRefresh:oR},oW=null,oq=0;function oG(e){var t=oq;return oq+=1,null===oW&&(oW=[]),aa(oW,e,t)}function oY(e,t){e.ref=void 0!==(t=t.props.ref)?t:null}function oK(e,t){if(t.$$typeof===p)throw Error(l(525));throw Error(l(31,"[object Object]"===(e=Object.prototype.toString.call(t))?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function oX(e){return(0,e._init)(e._payload)}function oJ(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e){for(var t=new Map;null!==e;)null!==e.key?t.set(e.key,e):t.set(e.index,e),e=e.sibling;return t}function a(e,t){return(e=rt(e,t)).index=0,e.sibling=null,e}function o(t,n,r){return(t.index=r,e)?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=0x4000002,n):r:(t.flags|=0x4000002,n):(t.flags|=1048576,n)}function i(t){return e&&null===t.alternate&&(t.flags|=0x4000002),t}function s(e,t,n,r){return null===t||6!==t.tag?(t=ro(n,e.mode,r)).return=e:(t=a(t,n)).return=e,t}function u(e,t,n,r){var o=n.type;return o===g?d(e,t,n.props.children,r,n.key):(null!==t&&(t.elementType===o||"object"==typeof o&&null!==o&&o.$$typeof===C&&oX(o)===t.type)?oY(t=a(t,n.props),n):oY(t=rr(n.type,n.key,n.props,null,e.mode,r),n),t.return=e,t)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?(t=ri(n,e.mode,r)).return=e:(t=a(t,n.children||[])).return=e,t}function d(e,t,n,r,o){return null===t||7!==t.tag?(t=ra(n,e.mode,r,o)).return=e:(t=a(t,n)).return=e,t}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t||"bigint"==typeof t)return(t=ro(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case m:return oY(n=rr(t.type,t.key,t.props,null,e.mode,n),t),n.return=e,n;case h:return(t=ri(t,e.mode,n)).return=e,t;case C:return f(e,t=(0,t._init)(t._payload),n)}if(j(t)||O(t))return(t=ra(t,e.mode,n,null)).return=e,t;if("function"==typeof t.then)return f(e,oG(t),n);if(t.$$typeof===w)return f(e,rQ(e,t),n);oK(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n||"bigint"==typeof n)return null!==a?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case m:return n.key===a?u(e,t,n,r):null;case h:return n.key===a?c(e,t,n,r):null;case C:return p(e,t,n=(a=n._init)(n._payload),r)}if(j(n)||O(n))return null!==a?null:d(e,t,n,r,null);if("function"==typeof n.then)return p(e,t,oG(n),r);if(n.$$typeof===w)return p(e,t,rQ(e,n),r);oK(e,n)}return null}function b(e,t,n,r,a){if("string"==typeof r&&""!==r||"number"==typeof r||"bigint"==typeof r)return s(t,e=e.get(n)||null,""+r,a);if("object"==typeof r&&null!==r){switch(r.$$typeof){case m:return u(t,e=e.get(null===r.key?n:r.key)||null,r,a);case h:return c(t,e=e.get(null===r.key?n:r.key)||null,r,a);case C:return b(e,t,n,r=(0,r._init)(r._payload),a)}if(j(r)||O(r))return d(t,e=e.get(n)||null,r,a,null);if("function"==typeof r.then)return b(e,t,n,oG(r),a);if(r.$$typeof===w)return b(e,t,n,rQ(t,r),a);oK(t,r)}return null}return function(s,u,c,d){try{oq=0;var y=function s(u,c,d,y){if("object"==typeof d&&null!==d&&d.type===g&&null===d.key&&(d=d.props.children),"object"==typeof d&&null!==d){switch(d.$$typeof){case m:e:{for(var v=d.key;null!==c;){if(c.key===v){if((v=d.type)===g){if(7===c.tag){n(u,c.sibling),(y=a(c,d.props.children)).return=u,u=y;break e}}else if(c.elementType===v||"object"==typeof v&&null!==v&&v.$$typeof===C&&oX(v)===c.type){n(u,c.sibling),oY(y=a(c,d.props),d),y.return=u,u=y;break e}n(u,c);break}t(u,c),c=c.sibling}d.type===g?(y=ra(d.props.children,u.mode,y,d.key)).return=u:(oY(y=rr(d.type,d.key,d.props,null,u.mode,y),d),y.return=u),u=y}return i(u);case h:e:{for(v=d.key;null!==c;){if(c.key===v)if(4===c.tag&&c.stateNode.containerInfo===d.containerInfo&&c.stateNode.implementation===d.implementation){n(u,c.sibling),(y=a(c,d.children||[])).return=u,u=y;break e}else{n(u,c);break}t(u,c),c=c.sibling}(y=ri(d,u.mode,y)).return=u,u=y}return i(u);case C:return s(u,c,d=(v=d._init)(d._payload),y)}if(j(d))return function(a,i,l,s){for(var u=null,c=null,d=i,m=i=0,h=null;null!==d&&m<l.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var g=p(a,d,l[m],s);if(null===g){null===d&&(d=h);break}e&&d&&null===g.alternate&&t(a,d),i=o(g,i,m),null===c?u=g:c.sibling=g,c=g,d=h}if(m===l.length)return n(a,d),rx&&rg(a,m),u;if(null===d){for(;m<l.length;m++)null!==(d=f(a,l[m],s))&&(i=o(d,i,m),null===c?u=d:c.sibling=d,c=d);return rx&&rg(a,m),u}for(d=r(d);m<l.length;m++)null!==(h=b(d,a,m,l[m],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),i=o(h,i,m),null===c?u=h:c.sibling=h,c=h);return e&&d.forEach(function(e){return t(a,e)}),rx&&rg(a,m),u}(u,c,d,y);if(O(d)){if("function"!=typeof(v=O(d)))throw Error(l(150));return function(a,i,s,u){if(null==s)throw Error(l(151));for(var c=null,d=null,m=i,h=i=0,g=null,y=s.next();null!==m&&!y.done;h++,y=s.next()){m.index>h?(g=m,m=null):g=m.sibling;var v=p(a,m,y.value,u);if(null===v){null===m&&(m=g);break}e&&m&&null===v.alternate&&t(a,m),i=o(v,i,h),null===d?c=v:d.sibling=v,d=v,m=g}if(y.done)return n(a,m),rx&&rg(a,h),c;if(null===m){for(;!y.done;h++,y=s.next())null!==(y=f(a,y.value,u))&&(i=o(y,i,h),null===d?c=y:d.sibling=y,d=y);return rx&&rg(a,h),c}for(m=r(m);!y.done;h++,y=s.next())null!==(y=b(m,a,h,y.value,u))&&(e&&null!==y.alternate&&m.delete(null===y.key?h:y.key),i=o(y,i,h),null===d?c=y:d.sibling=y,d=y);return e&&m.forEach(function(e){return t(a,e)}),rx&&rg(a,h),c}(u,c,d=v.call(d),y)}if("function"==typeof d.then)return s(u,c,oG(d),y);if(d.$$typeof===w)return s(u,c,rQ(u,d),y);oK(u,d)}return"string"==typeof d&&""!==d||"number"==typeof d||"bigint"==typeof d?(d=""+d,null!==c&&6===c.tag?(n(u,c.sibling),(y=a(c,d)).return=u):(n(u,c),(y=ro(d,u.mode,y)).return=u),i(u=y)):n(u,c)}(s,u,c,d);return oW=null,y}catch(e){if(e===r5||e===ae)throw e;var v=n7(29,e,null,s.mode);return v.lanes=d,v.return=s,v}finally{}}}var o0=oJ(!0),o1=oJ(!1),o2=z(null),o4=null;function o3(e){var t=e.alternate;$(o5,1&o5.current),$(o2,e),null===o4&&(null===t||null!==ak.current?o4=e:null!==t.memoizedState&&(o4=e))}function o6(e){if(22===e.tag){if($(o5,o5.current),$(o2,e),null===o4){var t=e.alternate;null!==t&&null!==t.memoizedState&&(o4=e)}}else o9(e)}function o9(){$(o5,o5.current),$(o2,o2.current)}function o8(e){M(o2),o4===e&&(o4=null),M(o5)}var o5=z(0);function o7(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||uy(n)))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function ie(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:f({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var it={enqueueSetState:function(e,t,n){e=e._reactInternals;var r=l6(),a=ad(r);a.payload=t,null!=n&&(a.callback=n),null!==(t=af(e,a,r))&&(l8(t,e,r),ap(t,e,r))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=l6(),a=ad(r);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=af(e,a,r))&&(l8(t,e,r),ap(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=l6(),r=ad(n);r.tag=2,null!=t&&(r.callback=t),null!==(t=af(e,r,n))&&(l8(t,e,n),ap(t,e,n))}};function ir(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||!nE(n,r)||!nE(a,o)}function ia(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&it.enqueueReplaceState(t,t.state,null)}function io(e,t){var n=t;if("ref"in t)for(var r in n={},t)"ref"!==r&&(n[r]=t[r]);if(e=e.defaultProps)for(var a in n===t&&(n=f({},n)),e)void 0===n[a]&&(n[a]=e[a]);return n}var ii="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function il(e){ii(e)}function is(e){console.error(e)}function iu(e){ii(e)}function ic(e,t){try{(0,e.onUncaughtError)(t.value,{componentStack:t.stack})}catch(e){setTimeout(function(){throw e})}}function id(e,t,n){try{(0,e.onCaughtError)(n.value,{componentStack:n.stack,errorBoundary:1===t.tag?t.stateNode:null})}catch(e){setTimeout(function(){throw e})}}function ip(e,t,n){return(n=ad(n)).tag=3,n.payload={element:null},n.callback=function(){ic(e,t)},n}function im(e){return(e=ad(e)).tag=3,e}function ih(e,t,n,r){var a=n.type.getDerivedStateFromError;if("function"==typeof a){var o=r.value;e.payload=function(){return a(o)},e.callback=function(){id(t,n,r)}}var i=n.stateNode;null!==i&&"function"==typeof i.componentDidCatch&&(e.callback=function(){id(t,n,r),"function"!=typeof a&&(null===lG?lG=new Set([this]):lG.add(this));var e=r.stack;this.componentDidCatch(r.value,{componentStack:null!==e?e:""})})}var ig=Error(l(461)),ib=!1;function iy(e,t,n,r){t.child=null===e?o1(t,null,n,r):o0(t,e.child,n,r)}function iv(e,t,n,r,a){n=n.render;var o=t.ref;if("ref"in r){var i={};for(var l in r)"ref"!==l&&(i[l]=r[l])}else i=r;return(rU(t),r=az(e,t,n,i,o,a),l=aU(),null===e||ib)?(rx&&l&&ry(t),t.flags|=1,iy(e,t,r,a),t.child):(aH(e,t,a),iM(e,t,a))}function ik(e,t,n,r,a){if(null===e){var o=n.type;return"function"!=typeof o||re(o)||void 0!==o.defaultProps||null!==n.compare?((e=rr(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=o,iw(e,t,o,r,a))}if(o=e.child,!i$(e,a)){var i=o.memoizedProps;if((n=null!==(n=n.compare)?n:nE)(i,r)&&e.ref===t.ref)return iM(e,t,a)}return t.flags|=1,(e=rt(o,r)).ref=t.ref,e.return=t,t.child=e}function iw(e,t,n,r,a){if(null!==e){var o=e.memoizedProps;if(nE(o,r)&&e.ref===t.ref)if(ib=!1,t.pendingProps=r=o,!i$(e,a))return t.lanes=e.lanes,iM(e,t,a);else 0!=(131072&e.flags)&&(ib=!0)}return i_(e,t,n,r,a)}function ix(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode){if(0!=(128&t.flags)){if(r=null!==o?o.baseLanes|n:n,null!==e){for(o=0,a=t.child=e.child;null!==a;)o=o|a.lanes|a.childLanes,a=a.sibling;t.childLanes=o&~r}else t.childLanes=0,t.child=null;return iS(e,t,r,n)}if(0==(0x20000000&n))return t.lanes=t.childLanes=0x20000000,iS(e,t,null!==o?o.baseLanes|n:n,n);t.memoizedState={baseLanes:0,cachePool:null},null!==e&&r9(t,null!==o?o.cachePool:null),null!==o?ax(t,o):aS(),o6(t)}else null!==o?(r9(t,o.cachePool),ax(t,o),o9(t),t.memoizedState=null):(null!==e&&r9(t,null),aS(),o9(t));return iy(e,t,a,n),t.child}function iS(e,t,n,r){var a=r6();return t.memoizedState={baseLanes:n,cachePool:a=null===a?null:{parent:rG._currentValue,pool:a}},null!==e&&r9(t,null),aS(),o6(t),null!==e&&r$(e,t,r,!0),null}function iE(e,t){var n=t.ref;if(null===n)null!==e&&null!==e.ref&&(t.flags|=4194816);else{if("function"!=typeof n&&"object"!=typeof n)throw Error(l(284));(null===e||e.ref!==n)&&(t.flags|=4194816)}}function i_(e,t,n,r,a){return(rU(t),n=az(e,t,n,r,void 0,a),r=aU(),null===e||ib)?(rx&&r&&ry(t),t.flags|=1,iy(e,t,n,a),t.child):(aH(e,t,a),iM(e,t,a))}function iC(e,t,n,r,a,o){return(rU(t),t.updateQueue=null,n=a$(t,r,n,a),aM(e),r=aU(),null===e||ib)?(rx&&r&&ry(t),t.flags|=1,iy(e,t,n,o),t.child):(aH(e,t,o),iM(e,t,o))}function iT(e,t,n,r,a){if(rU(t),null===t.stateNode){var o=n8,i=n.contextType;"object"==typeof i&&null!==i&&(o=rH(i)),t.memoizedState=null!==(o=new n(r,o)).state&&void 0!==o.state?o.state:null,o.updater=it,t.stateNode=o,o._reactInternals=t,(o=t.stateNode).props=r,o.state=t.memoizedState,o.refs={},au(t),i=n.contextType,o.context="object"==typeof i&&null!==i?rH(i):n8,o.state=t.memoizedState,"function"==typeof(i=n.getDerivedStateFromProps)&&(ie(t,n,i,r),o.state=t.memoizedState),"function"==typeof n.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(i=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),i!==o.state&&it.enqueueReplaceState(o,o.state,null),ab(t,r,o,a),ag(),o.state=t.memoizedState),"function"==typeof o.componentDidMount&&(t.flags|=4194308),r=!0}else if(null===e){o=t.stateNode;var l=t.memoizedProps,s=io(n,l);o.props=s;var u=o.context,c=n.contextType;i=n8,"object"==typeof c&&null!==c&&(i=rH(c));var d=n.getDerivedStateFromProps;c="function"==typeof d||"function"==typeof o.getSnapshotBeforeUpdate,l=t.pendingProps!==l,c||"function"!=typeof o.UNSAFE_componentWillReceiveProps&&"function"!=typeof o.componentWillReceiveProps||(l||u!==i)&&ia(t,o,r,i),as=!1;var f=t.memoizedState;o.state=f,ab(t,r,o,a),ag(),u=t.memoizedState,l||f!==u||as?("function"==typeof d&&(ie(t,n,d,r),u=t.memoizedState),(s=as||ir(t,n,s,r,f,u,i))?(c||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||("function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount()),"function"==typeof o.componentDidMount&&(t.flags|=4194308)):("function"==typeof o.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=u),o.props=r,o.state=u,o.context=i,r=s):("function"==typeof o.componentDidMount&&(t.flags|=4194308),r=!1)}else{o=t.stateNode,ac(e,t),c=io(n,i=t.memoizedProps),o.props=c,d=t.pendingProps,f=o.context,u=n.contextType,s=n8,"object"==typeof u&&null!==u&&(s=rH(u)),(u="function"==typeof(l=n.getDerivedStateFromProps)||"function"==typeof o.getSnapshotBeforeUpdate)||"function"!=typeof o.UNSAFE_componentWillReceiveProps&&"function"!=typeof o.componentWillReceiveProps||(i!==d||f!==s)&&ia(t,o,r,s),as=!1,f=t.memoizedState,o.state=f,ab(t,r,o,a),ag();var p=t.memoizedState;i!==d||f!==p||as||null!==e&&null!==e.dependencies&&rB(e.dependencies)?("function"==typeof l&&(ie(t,n,l,r),p=t.memoizedState),(c=as||ir(t,n,c,r,f,p,s)||null!==e&&null!==e.dependencies&&rB(e.dependencies))?(u||"function"!=typeof o.UNSAFE_componentWillUpdate&&"function"!=typeof o.componentWillUpdate||("function"==typeof o.componentWillUpdate&&o.componentWillUpdate(r,p,s),"function"==typeof o.UNSAFE_componentWillUpdate&&o.UNSAFE_componentWillUpdate(r,p,s)),"function"==typeof o.componentDidUpdate&&(t.flags|=4),"function"==typeof o.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof o.componentDidUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof o.getSnapshotBeforeUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=p),o.props=r,o.state=p,o.context=s,r=c):("function"!=typeof o.componentDidUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof o.getSnapshotBeforeUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return o=r,iE(e,t),r=0!=(128&t.flags),o||r?(o=t.stateNode,n=r&&"function"!=typeof n.getDerivedStateFromError?null:o.render(),t.flags|=1,null!==e&&r?(t.child=o0(t,e.child,null,a),t.child=o0(t,null,n,a)):iy(e,t,n,a),t.memoizedState=o.state,e=t.child):e=iM(e,t,a),e}function iP(e,t,n,r){return rO(),t.flags|=256,iy(e,t,n,r),t.child}var iA={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function iO(e){return{baseLanes:e,cachePool:r8()}}function iL(e,t,n){return e=null!==e?e.childLanes&~n:0,t&&(e|=lB),e}function ij(e,t,n){var r,a=t.pendingProps,o=!1,i=0!=(128&t.flags);if((r=i)||(r=(null===e||null!==e.memoizedState)&&0!=(2&o5.current)),r&&(o=!0,t.flags&=-129),r=0!=(32&t.flags),t.flags&=-33,null===e){if(rx){if(o?o3(t):o9(t),rx){var s,u=rw;if(s=u){n:{for(s=u,u=rE;8!==s.nodeType;)if(!u||null===(s=uv(s.nextSibling))){u=null;break n}u=s}null!==u?(t.memoizedState={dehydrated:u,treeContext:null!==rp?{id:rm,overflow:rh}:null,retryLane:0x20000000,hydrationErrors:null},(s=n7(18,null,null,0)).stateNode=u,s.return=t,t.child=s,rk=t,rw=null,s=!0):s=!1}s||rC(t)}if(null!==(u=t.memoizedState)&&null!==(u=u.dehydrated))return uy(u)?t.lanes=32:t.lanes=0x20000000,null;o8(t)}return(u=a.children,a=a.fallback,o)?(o9(t),u=iR({mode:"hidden",children:u},o=t.mode),a=ra(a,o,n,null),u.return=t,a.return=t,u.sibling=a,t.child=u,(o=t.child).memoizedState=iO(n),o.childLanes=iL(e,r,n),t.memoizedState=iA,a):(o3(t),iN(t,u))}if(null!==(s=e.memoizedState)&&null!==(u=s.dehydrated)){if(i)256&t.flags?(o3(t),t.flags&=-257,t=iI(e,t,n)):null!==t.memoizedState?(o9(t),t.child=e.child,t.flags|=128,t=null):(o9(t),o=a.fallback,u=t.mode,a=iR({mode:"visible",children:a.children},u),o=ra(o,u,n,null),o.flags|=2,a.return=t,o.return=t,a.sibling=o,t.child=a,o0(t,e.child,null,n),(a=t.child).memoizedState=iO(n),a.childLanes=iL(e,r,n),t.memoizedState=iA,t=o);else if(o3(t),uy(u)){if(r=u.nextSibling&&u.nextSibling.dataset)var c=r.dgst;r=c,(a=Error(l(419))).stack="",a.digest=r,rj({value:a,source:null,stack:null}),t=iI(e,t,n)}else if(ib||r$(e,t,n,!1),r=0!=(n&e.childLanes),ib||r){if(null!==(r=lP)&&0!==(a=0!=((a=0!=(42&(a=n&-n))?1:eC(a))&(r.suspendedLanes|n))?0:a)&&a!==s.retryLane)throw s.retryLane=a,n3(e,a),l8(r,e,a),ig;"$?"===u.data||sl(),t=iI(e,t,n)}else"$?"===u.data?(t.flags|=192,t.child=e.child,t=null):(e=s.treeContext,rw=uv(u.nextSibling),rk=t,rx=!0,rS=null,rE=!1,null!==e&&(rd[rf++]=rm,rd[rf++]=rh,rd[rf++]=rp,rm=e.id,rh=e.overflow,rp=t),t=iN(t,a.children),t.flags|=4096);return t}return o?(o9(t),o=a.fallback,u=t.mode,c=(s=e.child).sibling,(a=rt(s,{mode:"hidden",children:a.children})).subtreeFlags=0x3e00000&s.subtreeFlags,null!==c?o=rt(c,o):(o=ra(o,u,n,null),o.flags|=2),o.return=t,a.return=t,a.sibling=o,t.child=a,a=o,o=t.child,null===(u=e.child.memoizedState)?u=iO(n):(null!==(s=u.cachePool)?(c=rG._currentValue,s=s.parent!==c?{parent:c,pool:c}:s):s=r8(),u={baseLanes:u.baseLanes|n,cachePool:s}),o.memoizedState=u,o.childLanes=iL(e,r,n),t.memoizedState=iA,a):(o3(t),e=(n=e.child).sibling,(n=rt(n,{mode:"visible",children:a.children})).return=t,n.sibling=null,null!==e&&(null===(r=t.deletions)?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n)}function iN(e,t){return(t=iR({mode:"visible",children:t},e.mode)).return=e,e.child=t}function iR(e,t){return(e=n7(22,e,null,t)).lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function iI(e,t,n){return o0(t,e.child,null,n),e=iN(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function iF(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),rz(e.return,t,n)}function iD(e,t,n,r,a){var o=e.memoizedState;null===o?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=a)}function iz(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(iy(e,t,r.children,n),0!=(2&(r=o5.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&iF(e,n,t);else if(19===e.tag)iF(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}switch($(o5,r),a){case"forwards":for(a=null,n=t.child;null!==n;)null!==(e=n.alternate)&&null===o7(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),iD(t,!1,a,n,o);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===o7(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}iD(t,!0,n,null,o);break;case"together":iD(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function iM(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),lz|=t.lanes,0==(n&t.childLanes)){if(null===e)return null;else if(r$(e,t,n,!1),0==(n&t.childLanes))return null}if(null!==e&&t.child!==e.child)throw Error(l(153));if(null!==t.child){for(n=rt(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=rt(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function i$(e,t){return 0!=(e.lanes&t)||!!(null!==(e=e.dependencies)&&rB(e))}function iB(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps)ib=!0;else{if(!i$(e,n)&&0==(128&t.flags))return ib=!1,function(e,t,n){switch(t.tag){case 3:Z(t,t.stateNode.containerInfo),rF(t,rG,e.memoizedState.cache),rO();break;case 27:case 5:W(t);break;case 4:Z(t,t.stateNode.containerInfo);break;case 10:rF(t,t.type,t.memoizedProps.value);break;case 13:var r=t.memoizedState;if(null!==r){if(null!==r.dehydrated)return o3(t),t.flags|=128,null;if(0!=(n&t.child.childLanes))return ij(e,t,n);return o3(t),null!==(e=iM(e,t,n))?e.sibling:null}o3(t);break;case 19:var a=0!=(128&e.flags);if((r=0!=(n&t.childLanes))||(r$(e,t,n,!1),r=0!=(n&t.childLanes)),a){if(r)return iz(e,t,n);t.flags|=128}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),$(o5,o5.current),!r)return null;break;case 22:case 23:return t.lanes=0,ix(e,t,n);case 24:rF(t,rG,e.memoizedState.cache)}return iM(e,t,n)}(e,t,n);ib=0!=(131072&e.flags)}else ib=!1,rx&&0!=(1048576&t.flags)&&rb(t,rc,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var r=t.elementType,a=r._init;if(r=a(r._payload),t.type=r,"function"==typeof r)re(r)?(e=io(r,e),t.tag=1,t=iT(null,t,r,e,n)):(t.tag=0,t=i_(null,t,r,e,n));else{if(null!=r){if((a=r.$$typeof)===x){t.tag=11,t=iv(null,t,r,e,n);break e}else if(a===_){t.tag=14,t=ik(null,t,r,e,n);break e}}throw Error(l(306,t=function e(t){if(null==t)return null;if("function"==typeof t)return t.$$typeof===L?null:t.displayName||t.name||null;if("string"==typeof t)return t;switch(t){case g:return"Fragment";case y:return"Profiler";case b:return"StrictMode";case S:return"Suspense";case E:return"SuspenseList";case T:return"Activity"}if("object"==typeof t)switch(t.$$typeof){case h:return"Portal";case w:return(t.displayName||"Context")+".Provider";case k:return(t._context.displayName||"Context")+".Consumer";case x:var n=t.render;return(t=t.displayName)||(t=""!==(t=n.displayName||n.name||"")?"ForwardRef("+t+")":"ForwardRef"),t;case _:return null!==(n=t.displayName||null)?n:e(t.type)||"Memo";case C:n=t._payload,t=t._init;try{return e(t(n))}catch(e){}}return null}(r)||r,""))}}return t;case 0:return i_(e,t,t.type,t.pendingProps,n);case 1:return a=io(r=t.type,t.pendingProps),iT(e,t,r,a,n);case 3:e:{if(Z(t,t.stateNode.containerInfo),null===e)throw Error(l(387));r=t.pendingProps;var o=t.memoizedState;a=o.element,ac(e,t),ab(t,r,null,n);var i=t.memoizedState;if(rF(t,rG,r=i.cache),r!==o.cache&&rM(t,[rG],n,!0),ag(),r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache},t.updateQueue.baseState=o,t.memoizedState=o,256&t.flags){t=iP(e,t,r,n);break e}else if(r!==a){rj(a=nK(Error(l(424)),t)),t=iP(e,t,r,n);break e}else for(rw=uv((e=9===(e=t.stateNode.containerInfo).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e).firstChild),rk=t,rx=!0,rS=null,rE=!0,n=o1(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling;else{if(rO(),r===a){t=iM(e,t,n);break e}iy(e,t,r,n)}t=t.child}return t;case 26:return iE(e,t),null===e?(n=uO(t.type,null,t.pendingProps,null))?t.memoizedState=n:rx||(n=t.type,e=t.pendingProps,(r=uo(H.current).createElement(n))[eO]=t,r[eL]=e,un(r,n,e),eH(r),t.stateNode=r):t.memoizedState=uO(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return W(t),null===e&&rx&&(r=t.stateNode=ux(t.type,t.pendingProps,H.current),rk=t,rE=!0,a=rw,uh(t.type)?(uk=a,rw=uv(r.firstChild)):rw=a),iy(e,t,t.pendingProps.children,n),iE(e,t),null===e&&(t.flags|=4194304),t.child;case 5:return null===e&&rx&&((a=r=rw)&&(null!==(r=function(e,t,n,r){for(;1===e.nodeType;){if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!r&&("INPUT"!==e.nodeName||"hidden"!==e.type))break}else if(r){if(!e[eD])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if("stylesheet"===(a=e.getAttribute("rel"))&&e.hasAttribute("data-precedence")||a!==n.rel||e.getAttribute("href")!==(null==n.href||""===n.href?null:n.href)||e.getAttribute("crossorigin")!==(null==n.crossOrigin?null:n.crossOrigin)||e.getAttribute("title")!==(null==n.title?null:n.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(((a=e.getAttribute("src"))!==(null==n.src?null:n.src)||e.getAttribute("type")!==(null==n.type?null:n.type)||e.getAttribute("crossorigin")!==(null==n.crossOrigin?null:n.crossOrigin))&&a&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else{if("input"!==t||"hidden"!==e.type)return e;var a=null==n.name?null:""+n.name;if("hidden"===n.type&&e.getAttribute("name")===a)return e}if(null===(e=uv(e.nextSibling)))break}return null}(r,t.type,t.pendingProps,rE))?(t.stateNode=r,rk=t,rw=uv(r.firstChild),rE=!1,a=!0):a=!1),a||rC(t)),W(t),a=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,r=o.children,us(a,o)?r=null:null!==i&&us(a,i)&&(t.flags|=32),null!==t.memoizedState&&(uY._currentValue=a=az(e,t,aB,null,null,n)),iE(e,t),iy(e,t,r,n),t.child;case 6:return null===e&&rx&&((e=n=rw)&&(null!==(n=function(e,t,n){if(""===t)return null;for(;3!==e.nodeType;)if((1!==e.nodeType||"INPUT"!==e.nodeName||"hidden"!==e.type)&&!n||null===(e=uv(e.nextSibling)))return null;return e}(n,t.pendingProps,rE))?(t.stateNode=n,rk=t,rw=null,e=!0):e=!1),e||rC(t)),null;case 13:return ij(e,t,n);case 4:return Z(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=o0(t,null,r,n):iy(e,t,r,n),t.child;case 11:return iv(e,t,t.type,t.pendingProps,n);case 7:return iy(e,t,t.pendingProps,n),t.child;case 8:case 12:return iy(e,t,t.pendingProps.children,n),t.child;case 10:return r=t.pendingProps,rF(t,t.type,r.value),iy(e,t,r.children,n),t.child;case 9:return a=t.type._context,r=t.pendingProps.children,rU(t),r=r(a=rH(a)),t.flags|=1,iy(e,t,r,n),t.child;case 14:return ik(e,t,t.type,t.pendingProps,n);case 15:return iw(e,t,t.type,t.pendingProps,n);case 19:return iz(e,t,n);case 31:return r=t.pendingProps,n=t.mode,r={mode:r.mode,children:r.children},null===e?(n=iR(r,n)).ref=t.ref:(n=rt(e.child,r)).ref=t.ref,t.child=n,n.return=t,t=n;case 22:return ix(e,t,n);case 24:return rU(t),r=rH(rG),null===e?(null===(a=r6())&&(a=lP,o=rY(),a.pooledCache=o,o.refCount++,null!==o&&(a.pooledCacheLanes|=n),a=o),t.memoizedState={parent:r,cache:a},au(t),rF(t,rG,a)):(0!=(e.lanes&n)&&(ac(e,t),ab(t,null,null,n),ag()),a=e.memoizedState,o=t.memoizedState,a.parent!==r?(a={parent:r,cache:r},t.memoizedState=a,0===t.lanes&&(t.memoizedState=t.updateQueue.baseState=a),rF(t,rG,r)):(rF(t,rG,r=o.cache),r!==a.cache&&rM(t,[rG],n,!0))),iy(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(l(156,t.tag))}function iU(e){e.flags|=4}function iH(e,t){if("stylesheet"!==t.type||0!=(4&t.state.loading))e.flags&=-0x1000001;else if(e.flags|=0x1000000,!uH(t)){if(null!==(t=o2.current)&&((4194048&lO)===lO?null!==o4:(0x3c00000&lO)!==lO&&0==(0x20000000&lO)||t!==o4))throw ao=at,r7;e.flags|=8192}}function iQ(e,t){null!==t&&(e.flags|=4),16384&e.flags&&(t=22!==e.tag?ew():0x20000000,e.lanes|=t,lU|=t)}function iZ(e,t){if(!rx)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function iV(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=0x3e00000&a.subtreeFlags,r|=0x3e00000&a.flags,a.return=e,a=a.sibling;else for(a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags,r|=a.flags,a.return=e,a=a.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function iW(e,t){switch(rv(t),t.tag){case 3:rD(rG),V();break;case 26:case 27:case 5:q(t);break;case 4:V();break;case 13:o8(t);break;case 19:M(o5);break;case 10:rD(t.type);break;case 22:case 23:o8(t),aE(),null!==e&&M(r3);break;case 24:rD(rG)}}function iq(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if(null!==r){var a=r.next;n=a;do{if((n.tag&e)===e){r=void 0;var o=n.create;n.inst.destroy=r=o()}n=n.next}while(n!==a)}}catch(e){sx(t,t.return,e)}}function iG(e,t,n){try{var r=t.updateQueue,a=null!==r?r.lastEffect:null;if(null!==a){var o=a.next;r=o;do{if((r.tag&e)===e){var i=r.inst,l=i.destroy;if(void 0!==l){i.destroy=void 0,a=t;try{l()}catch(e){sx(a,n,e)}}}r=r.next}while(r!==o)}}catch(e){sx(t,t.return,e)}}function iY(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{av(t,n)}catch(t){sx(e,e.return,t)}}}function iK(e,t,n){n.props=io(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){sx(e,t,n)}}function iX(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;default:r=e.stateNode}"function"==typeof n?e.refCleanup=n(r):n.current=r}}catch(n){sx(e,t,n)}}function iJ(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if("function"==typeof r)try{r()}catch(n){sx(e,t,n)}finally{e.refCleanup=null,null!=(e=e.alternate)&&(e.refCleanup=null)}else if("function"==typeof n)try{n(null)}catch(n){sx(e,t,n)}else n.current=null}function i0(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&r.focus();break;case"img":n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){sx(e,e.return,t)}}function i1(e,t,n){try{var r=e.stateNode;(function(e,t,n,r){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var a=null,o=null,i=null,s=null,u=null,c=null,d=null;for(m in n){var f=n[m];if(n.hasOwnProperty(m)&&null!=f)switch(m){case"checked":case"value":break;case"defaultValue":u=f;default:r.hasOwnProperty(m)||ue(e,t,m,null,r,f)}}for(var p in r){var m=r[p];if(f=n[p],r.hasOwnProperty(p)&&(null!=m||null!=f))switch(p){case"type":o=m;break;case"name":a=m;break;case"checked":c=m;break;case"defaultChecked":d=m;break;case"value":i=m;break;case"defaultValue":s=m;break;case"children":case"dangerouslySetInnerHTML":if(null!=m)throw Error(l(137,t));break;default:m!==f&&ue(e,t,p,m,r,f)}}tt(e,i,s,u,c,d,o,a);return;case"select":for(o in m=i=s=p=null,n)if(u=n[o],n.hasOwnProperty(o)&&null!=u)switch(o){case"value":break;case"multiple":m=u;default:r.hasOwnProperty(o)||ue(e,t,o,null,r,u)}for(a in r)if(o=r[a],u=n[a],r.hasOwnProperty(a)&&(null!=o||null!=u))switch(a){case"value":p=o;break;case"defaultValue":s=o;break;case"multiple":i=o;default:o!==u&&ue(e,t,a,o,r,u)}t=s,n=i,r=m,null!=p?ta(e,!!n,p,!1):!!r!=!!n&&(null!=t?ta(e,!!n,t,!0):ta(e,!!n,n?[]:"",!1));return;case"textarea":for(s in m=p=null,n)if(a=n[s],n.hasOwnProperty(s)&&null!=a&&!r.hasOwnProperty(s))switch(s){case"value":case"children":break;default:ue(e,t,s,null,r,a)}for(i in r)if(a=r[i],o=n[i],r.hasOwnProperty(i)&&(null!=a||null!=o))switch(i){case"value":p=a;break;case"defaultValue":m=a;break;case"children":break;case"dangerouslySetInnerHTML":if(null!=a)throw Error(l(91));break;default:a!==o&&ue(e,t,i,a,r,o)}to(e,p,m);return;case"option":for(var h in n)p=n[h],n.hasOwnProperty(h)&&null!=p&&!r.hasOwnProperty(h)&&("selected"===h?e.selected=!1:ue(e,t,h,null,r,p));for(u in r)p=r[u],m=n[u],r.hasOwnProperty(u)&&p!==m&&(null!=p||null!=m)&&("selected"===u?e.selected=p&&"function"!=typeof p&&"symbol"!=typeof p:ue(e,t,u,p,r,m));return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var g in n)p=n[g],n.hasOwnProperty(g)&&null!=p&&!r.hasOwnProperty(g)&&ue(e,t,g,null,r,p);for(c in r)if(p=r[c],m=n[c],r.hasOwnProperty(c)&&p!==m&&(null!=p||null!=m))switch(c){case"children":case"dangerouslySetInnerHTML":if(null!=p)throw Error(l(137,t));break;default:ue(e,t,c,p,r,m)}return;default:if(td(t)){for(var b in n)p=n[b],n.hasOwnProperty(b)&&void 0!==p&&!r.hasOwnProperty(b)&&ut(e,t,b,void 0,r,p);for(d in r)p=r[d],m=n[d],r.hasOwnProperty(d)&&p!==m&&(void 0!==p||void 0!==m)&&ut(e,t,d,p,r,m);return}}for(var y in n)p=n[y],n.hasOwnProperty(y)&&null!=p&&!r.hasOwnProperty(y)&&ue(e,t,y,null,r,p);for(f in r)p=r[f],m=n[f],r.hasOwnProperty(f)&&p!==m&&(null!=p||null!=m)&&ue(e,t,f,p,r,m)})(r,e.type,n,t),r[eL]=t}catch(t){sx(e,e.return,t)}}function i2(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&uh(e.type)||4===e.tag}function i4(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||i2(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(27===e.tag&&uh(e.type)||2&e.flags||null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function i3(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&(27===r&&uh(e.type)&&(n=e.stateNode),null!==(e=e.child)))for(i3(e,t,n),e=e.sibling;null!==e;)i3(e,t,n),e=e.sibling}function i6(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,a=t.attributes;a.length;)t.removeAttributeNode(a[0]);un(t,r,n),t[eO]=e,t[eL]=n}catch(t){sx(e,e.return,t)}}var i9=!1,i8=!1,i5=!1,i7="function"==typeof WeakSet?WeakSet:Set,le=null;function lt(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:lf(e,n),4&r&&iq(5,n);break;case 1:if(lf(e,n),4&r)if(e=n.stateNode,null===t)try{e.componentDidMount()}catch(e){sx(n,n.return,e)}else{var a=io(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(a,t,e.__reactInternalSnapshotBeforeUpdate)}catch(e){sx(n,n.return,e)}}64&r&&iY(n),512&r&&iX(n,n.return);break;case 3:if(lf(e,n),64&r&&null!==(e=n.updateQueue)){if(t=null,null!==n.child)switch(n.child.tag){case 27:case 5:case 1:t=n.child.stateNode}try{av(e,t)}catch(e){sx(n,n.return,e)}}break;case 27:null===t&&4&r&&i6(n);case 26:case 5:lf(e,n),null===t&&4&r&&i0(n),512&r&&iX(n,n.return);break;case 12:default:lf(e,n);break;case 13:lf(e,n),4&r&&li(e,n),64&r&&null!==(e=n.memoizedState)&&null!==(e=e.dehydrated)&&function(e,t){var n=e.ownerDocument;if("$?"!==e.data||"complete"===n.readyState)t();else{var r=function(){t(),n.removeEventListener("DOMContentLoaded",r)};n.addEventListener("DOMContentLoaded",r),e._reactRetry=r}}(e,n=sC.bind(null,n));break;case 22:if(!(r=null!==n.memoizedState||i9)){t=null!==t&&null!==t.memoizedState||i8,a=i9;var o=i8;i9=r,(i8=t)&&!o?function e(t,n,r){for(r=r&&0!=(8772&n.subtreeFlags),n=n.child;null!==n;){var a=n.alternate,o=t,i=n,l=i.flags;switch(i.tag){case 0:case 11:case 15:e(o,i,r),iq(4,i);break;case 1:if(e(o,i,r),"function"==typeof(o=(a=i).stateNode).componentDidMount)try{o.componentDidMount()}catch(e){sx(a,a.return,e)}if(null!==(o=(a=i).updateQueue)){var s=a.stateNode;try{var u=o.shared.hiddenCallbacks;if(null!==u)for(o.shared.hiddenCallbacks=null,o=0;o<u.length;o++)ay(u[o],s)}catch(e){sx(a,a.return,e)}}r&&64&l&&iY(i),iX(i,i.return);break;case 27:i6(i);case 26:case 5:e(o,i,r),r&&null===a&&4&l&&i0(i),iX(i,i.return);break;case 12:default:e(o,i,r);break;case 13:e(o,i,r),r&&4&l&&li(o,i);break;case 22:null===i.memoizedState&&e(o,i,r),iX(i,i.return);case 30:}n=n.sibling}}(e,n,0!=(8772&n.subtreeFlags)):lf(e,n),i9=a,i8=o}case 30:}}var ln=null,lr=!1;function la(e,t,n){for(n=n.child;null!==n;)lo(e,t,n),n=n.sibling}function lo(e,t,n){if(ec&&"function"==typeof ec.onCommitFiberUnmount)try{ec.onCommitFiberUnmount(eu,n)}catch(e){}switch(n.tag){case 26:i8||iJ(n,t),la(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode).parentNode.removeChild(n);break;case 27:i8||iJ(n,t);var r=ln,a=lr;uh(n.type)&&(ln=n.stateNode,lr=!1),la(e,t,n),uS(n.stateNode),ln=r,lr=a;break;case 5:i8||iJ(n,t);case 6:if(r=ln,a=lr,ln=null,la(e,t,n),ln=r,lr=a,null!==ln)if(lr)try{(9===ln.nodeType?ln.body:"HTML"===ln.nodeName?ln.ownerDocument.body:ln).removeChild(n.stateNode)}catch(e){sx(n,t,e)}else try{ln.removeChild(n.stateNode)}catch(e){sx(n,t,e)}break;case 18:null!==ln&&(lr?(ug(9===(e=ln).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e,n.stateNode),cy(e)):ug(ln,n.stateNode));break;case 4:r=ln,a=lr,ln=n.stateNode.containerInfo,lr=!0,la(e,t,n),ln=r,lr=a;break;case 0:case 11:case 14:case 15:i8||iG(2,n,t),i8||iG(4,n,t),la(e,t,n);break;case 1:i8||(iJ(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount&&iK(n,t,r)),la(e,t,n);break;case 21:default:la(e,t,n);break;case 22:i8=(r=i8)||null!==n.memoizedState,la(e,t,n),i8=r}}function li(e,t){if(null===t.memoizedState&&null!==(e=t.alternate)&&null!==(e=e.memoizedState)&&null!==(e=e.dehydrated))try{cy(e)}catch(e){sx(t,t.return,e)}}function ll(e,t){var n=function(e){switch(e.tag){case 13:case 19:var t=e.stateNode;return null===t&&(t=e.stateNode=new i7),t;case 22:return null===(t=(e=e.stateNode)._retryCache)&&(t=e._retryCache=new i7),t;default:throw Error(l(435,e.tag))}}(e);t.forEach(function(t){var r=sT.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))})}function ls(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var a=n[r],o=e,i=t,s=i;e:for(;null!==s;){switch(s.tag){case 27:if(uh(s.type)){ln=s.stateNode,lr=!1;break e}break;case 5:ln=s.stateNode,lr=!1;break e;case 3:case 4:ln=s.stateNode.containerInfo,lr=!0;break e}s=s.return}if(null===ln)throw Error(l(160));lo(o,i,a),ln=null,lr=!1,null!==(o=a.alternate)&&(o.return=null),a.return=null}if(13878&t.subtreeFlags)for(t=t.child;null!==t;)lc(t,e),t=t.sibling}var lu=null;function lc(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:ls(t,e),ld(e),4&r&&(iG(3,e,e.return),iq(3,e),iG(5,e,e.return));break;case 1:ls(t,e),ld(e),512&r&&(i8||null===n||iJ(n,n.return)),64&r&&i9&&null!==(e=e.updateQueue)&&null!==(r=e.callbacks)&&(n=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=null===n?r:n.concat(r));break;case 26:var a=lu;if(ls(t,e),ld(e),512&r&&(i8||null===n||iJ(n,n.return)),4&r){var o=null!==n?n.memoizedState:null;if(r=e.memoizedState,null===n)if(null===r)if(null===e.stateNode){e:{r=e.type,n=e.memoizedProps,a=a.ownerDocument||a;t:switch(r){case"title":(!(o=a.getElementsByTagName("title")[0])||o[eD]||o[eO]||"http://www.w3.org/2000/svg"===o.namespaceURI||o.hasAttribute("itemprop"))&&(o=a.createElement(r),a.head.insertBefore(o,a.querySelector("head > title"))),un(o,r,n),o[eO]=e,eH(o),r=o;break e;case"link":var i=uB("link","href",a).get(r+(n.href||""));if(i){for(var s=0;s<i.length;s++)if((o=i[s]).getAttribute("href")===(null==n.href||""===n.href?null:n.href)&&o.getAttribute("rel")===(null==n.rel?null:n.rel)&&o.getAttribute("title")===(null==n.title?null:n.title)&&o.getAttribute("crossorigin")===(null==n.crossOrigin?null:n.crossOrigin)){i.splice(s,1);break t}}un(o=a.createElement(r),r,n),a.head.appendChild(o);break;case"meta":if(i=uB("meta","content",a).get(r+(n.content||""))){for(s=0;s<i.length;s++)if((o=i[s]).getAttribute("content")===(null==n.content?null:""+n.content)&&o.getAttribute("name")===(null==n.name?null:n.name)&&o.getAttribute("property")===(null==n.property?null:n.property)&&o.getAttribute("http-equiv")===(null==n.httpEquiv?null:n.httpEquiv)&&o.getAttribute("charset")===(null==n.charSet?null:n.charSet)){i.splice(s,1);break t}}un(o=a.createElement(r),r,n),a.head.appendChild(o);break;default:throw Error(l(468,r))}o[eO]=e,eH(o),r=o}e.stateNode=r}else uU(a,e.type,e.stateNode);else e.stateNode=uF(a,r,e.memoizedProps);else o!==r?(null===o?null!==n.stateNode&&(n=n.stateNode).parentNode.removeChild(n):o.count--,null===r?uU(a,e.type,e.stateNode):uF(a,r,e.memoizedProps)):null===r&&null!==e.stateNode&&i1(e,e.memoizedProps,n.memoizedProps)}break;case 27:ls(t,e),ld(e),512&r&&(i8||null===n||iJ(n,n.return)),null!==n&&4&r&&i1(e,e.memoizedProps,n.memoizedProps);break;case 5:if(ls(t,e),ld(e),512&r&&(i8||null===n||iJ(n,n.return)),32&e.flags){a=e.stateNode;try{tl(a,"")}catch(t){sx(e,e.return,t)}}4&r&&null!=e.stateNode&&(a=e.memoizedProps,i1(e,a,null!==n?n.memoizedProps:a)),1024&r&&(i5=!0);break;case 6:if(ls(t,e),ld(e),4&r){if(null===e.stateNode)throw Error(l(162));r=e.memoizedProps,n=e.stateNode;try{n.nodeValue=r}catch(t){sx(e,e.return,t)}}break;case 3:if(u$=null,a=lu,lu=uC(t.containerInfo),ls(t,e),lu=a,ld(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{cy(t.containerInfo)}catch(t){sx(e,e.return,t)}i5&&(i5=!1,function e(t){if(1024&t.subtreeFlags)for(t=t.child;null!==t;){var n=t;e(n),5===n.tag&&1024&n.flags&&n.stateNode.reset(),t=t.sibling}}(e));break;case 4:r=lu,lu=uC(e.stateNode.containerInfo),ls(t,e),ld(e),lu=r;break;case 12:default:ls(t,e),ld(e);break;case 13:ls(t,e),ld(e),8192&e.child.flags&&null!==e.memoizedState!=(null!==n&&null!==n.memoizedState)&&(lV=ee()),4&r&&null!==(r=e.updateQueue)&&(e.updateQueue=null,ll(e,r));break;case 22:a=null!==e.memoizedState;var u=null!==n&&null!==n.memoizedState,c=i9,d=i8;if(i9=c||a,i8=d||u,ls(t,e),i8=d,i9=c,ld(e),8192&r)e:for((t=e.stateNode)._visibility=a?-2&t._visibility:1|t._visibility,a&&(null===n||u||i9||i8||function e(t){for(t=t.child;null!==t;){var n=t;switch(n.tag){case 0:case 11:case 14:case 15:iG(4,n,n.return),e(n);break;case 1:iJ(n,n.return);var r=n.stateNode;"function"==typeof r.componentWillUnmount&&iK(n,n.return,r),e(n);break;case 27:uS(n.stateNode);case 26:case 5:iJ(n,n.return),e(n);break;case 22:null===n.memoizedState&&e(n);break;default:e(n)}t=t.sibling}}(e)),n=null,t=e;;){if(5===t.tag||26===t.tag){if(null===n){u=n=t;try{if(o=u.stateNode,a)i=o.style,"function"==typeof i.setProperty?i.setProperty("display","none","important"):i.display="none";else{s=u.stateNode;var f=u.memoizedProps.style,p=null!=f&&f.hasOwnProperty("display")?f.display:null;s.style.display=null==p||"boolean"==typeof p?"":(""+p).trim()}}catch(e){sx(u,u.return,e)}}}else if(6===t.tag){if(null===n){u=t;try{u.stateNode.nodeValue=a?"":u.memoizedProps}catch(e){sx(u,u.return,e)}}}else if((22!==t.tag&&23!==t.tag||null===t.memoizedState||t===e)&&null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)break e;n===t&&(n=null),t=t.return}n===t&&(n=null),t.sibling.return=t.return,t=t.sibling}4&r&&null!==(r=e.updateQueue)&&null!==(n=r.retryQueue)&&(r.retryQueue=null,ll(e,n));break;case 19:ls(t,e),ld(e),4&r&&null!==(r=e.updateQueue)&&(e.updateQueue=null,ll(e,r));case 30:case 21:}}function ld(e){var t=e.flags;if(2&t){try{for(var n,r=e.return;null!==r;){if(i2(r)){n=r;break}r=r.return}if(null==n)throw Error(l(160));switch(n.tag){case 27:var a=n.stateNode,o=i4(e);i3(e,o,a);break;case 5:var i=n.stateNode;32&n.flags&&(tl(i,""),n.flags&=-33);var s=i4(e);i3(e,s,i);break;case 3:case 4:var u=n.stateNode.containerInfo,c=i4(e);!function e(t,n,r){var a=t.tag;if(5===a||6===a)t=t.stateNode,n?(9===r.nodeType?r.body:"HTML"===r.nodeName?r.ownerDocument.body:r).insertBefore(t,n):((n=9===r.nodeType?r.body:"HTML"===r.nodeName?r.ownerDocument.body:r).appendChild(t),null!=(r=r._reactRootContainer)||null!==n.onclick||(n.onclick=s7));else if(4!==a&&(27===a&&uh(t.type)&&(r=t.stateNode,n=null),null!==(t=t.child)))for(e(t,n,r),t=t.sibling;null!==t;)e(t,n,r),t=t.sibling}(e,c,u);break;default:throw Error(l(161))}}catch(t){sx(e,e.return,t)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function lf(e,t){if(8772&t.subtreeFlags)for(t=t.child;null!==t;)lt(e,t.alternate,t),t=t.sibling}function lp(e,t){var n=null;null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),e=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(e=t.memoizedState.cachePool.pool),e!==n&&(null!=e&&e.refCount++,null!=n&&rK(n))}function lm(e,t){e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&rK(e))}function lh(e,t,n,r){if(10256&t.subtreeFlags)for(t=t.child;null!==t;)lg(e,t,n,r),t=t.sibling}function lg(e,t,n,r){var a=t.flags;switch(t.tag){case 0:case 11:case 15:lh(e,t,n,r),2048&a&&iq(9,t);break;case 1:case 13:default:lh(e,t,n,r);break;case 3:lh(e,t,n,r),2048&a&&(e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&rK(e)));break;case 12:if(2048&a){lh(e,t,n,r),e=t.stateNode;try{var o=t.memoizedProps,i=o.id,l=o.onPostCommit;"function"==typeof l&&l(i,null===t.alternate?"mount":"update",e.passiveEffectDuration,-0)}catch(e){sx(t,t.return,e)}}else lh(e,t,n,r);break;case 23:break;case 22:o=t.stateNode,i=t.alternate,null!==t.memoizedState?2&o._visibility?lh(e,t,n,r):lb(e,t):2&o._visibility?lh(e,t,n,r):(o._visibility|=2,function e(t,n,r,a,o){for(o=o&&0!=(10256&n.subtreeFlags),n=n.child;null!==n;){var i=n,l=i.flags;switch(i.tag){case 0:case 11:case 15:e(t,i,r,a,o),iq(8,i);break;case 23:break;case 22:var s=i.stateNode;null!==i.memoizedState?2&s._visibility?e(t,i,r,a,o):lb(t,i):(s._visibility|=2,e(t,i,r,a,o)),o&&2048&l&&lp(i.alternate,i);break;case 24:e(t,i,r,a,o),o&&2048&l&&lm(i.alternate,i);break;default:e(t,i,r,a,o)}n=n.sibling}}(e,t,n,r,0!=(10256&t.subtreeFlags))),2048&a&&lp(i,t);break;case 24:lh(e,t,n,r),2048&a&&lm(t.alternate,t)}}function lb(e,t){if(10256&t.subtreeFlags)for(t=t.child;null!==t;){var n=t,r=n.flags;switch(n.tag){case 22:lb(e,n),2048&r&&lp(n.alternate,n);break;case 24:lb(e,n),2048&r&&lm(n.alternate,n);break;default:lb(e,n)}t=t.sibling}}var ly=8192;function lv(e){if(e.subtreeFlags&ly)for(e=e.child;null!==e;)lk(e),e=e.sibling}function lk(e){switch(e.tag){case 26:lv(e),e.flags&ly&&null!==e.memoizedState&&function(e,t,n){if(null===uQ)throw Error(l(475));var r=uQ;if("stylesheet"===t.type&&("string"!=typeof n.media||!1!==matchMedia(n.media).matches)&&0==(4&t.state.loading)){if(null===t.instance){var a=uL(n.href),o=e.querySelector(uj(a));if(o){null!==(e=o._p)&&"object"==typeof e&&"function"==typeof e.then&&(r.count++,r=uV.bind(r),e.then(r,r)),t.state.loading|=4,t.instance=o,eH(o);return}o=e.ownerDocument||e,n=uN(n),(a=uE.get(a))&&uz(n,a),eH(o=o.createElement("link"));var i=o;i._p=new Promise(function(e,t){i.onload=e,i.onerror=t}),un(o,"link",n),t.instance=o}null===r.stylesheets&&(r.stylesheets=new Map),r.stylesheets.set(t,e),(e=t.state.preload)&&0==(3&t.state.loading)&&(r.count++,t=uV.bind(r),e.addEventListener("load",t),e.addEventListener("error",t))}}(lu,e.memoizedState,e.memoizedProps);break;case 5:default:lv(e);break;case 3:case 4:var t=lu;lu=uC(e.stateNode.containerInfo),lv(e),lu=t;break;case 22:null===e.memoizedState&&(null!==(t=e.alternate)&&null!==t.memoizedState?(t=ly,ly=0x1000000,lv(e),ly=t):lv(e))}}function lw(e){var t=e.alternate;if(null!==t&&null!==(e=t.child)){t.child=null;do t=e.sibling,e.sibling=null,e=t;while(null!==e)}}function lx(e){var t=e.deletions;if(0!=(16&e.flags)){if(null!==t)for(var n=0;n<t.length;n++){var r=t[n];le=r,lE(r,e)}lw(e)}if(10256&e.subtreeFlags)for(e=e.child;null!==e;)lS(e),e=e.sibling}function lS(e){switch(e.tag){case 0:case 11:case 15:lx(e),2048&e.flags&&iG(9,e,e.return);break;case 3:case 12:default:lx(e);break;case 22:var t=e.stateNode;null!==e.memoizedState&&2&t._visibility&&(null===e.return||13!==e.return.tag)?(t._visibility&=-3,function e(t){var n=t.deletions;if(0!=(16&t.flags)){if(null!==n)for(var r=0;r<n.length;r++){var a=n[r];le=a,lE(a,t)}lw(t)}for(t=t.child;null!==t;){switch((n=t).tag){case 0:case 11:case 15:iG(8,n,n.return),e(n);break;case 22:2&(r=n.stateNode)._visibility&&(r._visibility&=-3,e(n));break;default:e(n)}t=t.sibling}}(e)):lx(e)}}function lE(e,t){for(;null!==le;){var n=le;switch(n.tag){case 0:case 11:case 15:iG(8,n,t);break;case 23:case 22:if(null!==n.memoizedState&&null!==n.memoizedState.cachePool){var r=n.memoizedState.cachePool.pool;null!=r&&r.refCount++}break;case 24:rK(n.memoizedState.cache)}if(null!==(r=n.child))r.return=n,le=r;else for(n=e;null!==le;){var a=(r=le).sibling,o=r.return;if(!function e(t){var n=t.alternate;null!==n&&(t.alternate=null,e(n)),t.child=null,t.deletions=null,t.sibling=null,5===t.tag&&null!==(n=t.stateNode)&&ez(n),t.stateNode=null,t.return=null,t.dependencies=null,t.memoizedProps=null,t.memoizedState=null,t.pendingProps=null,t.stateNode=null,t.updateQueue=null}(r),r===n){le=null;break}if(null!==a){a.return=o,le=a;break}le=o}}}var l_={getCacheForType:function(e){var t=rH(rG),n=t.data.get(e);return void 0===n&&(n=e(),t.data.set(e,n)),n}},lC="function"==typeof WeakMap?WeakMap:Map,lT=0,lP=null,lA=null,lO=0,lL=0,lj=null,lN=!1,lR=!1,lI=!1,lF=0,lD=0,lz=0,lM=0,l$=0,lB=0,lU=0,lH=null,lQ=null,lZ=!1,lV=0,lW=1/0,lq=null,lG=null,lY=0,lK=null,lX=null,lJ=0,l0=0,l1=null,l2=null,l4=0,l3=null;function l6(){if(0!=(2&lT)&&0!==lO)return lO&-lO;if(null!==N.T){var e=r0;return 0!==e?e:sB()}return eP()}function l9(){0===lB&&(lB=0==(0x20000000&lO)||rx?ek():0x20000000);var e=o2.current;return null!==e&&(e.flags|=32),lB}function l8(e,t,n){(e===lP&&(2===lL||9===lL)||null!==e.cancelPendingCommit)&&(sr(e,0),se(e,lO,lB,!1)),eS(e,n),(0==(2&lT)||e!==lP)&&(e===lP&&(0==(2&lT)&&(lM|=n),4===lD&&se(e,lO,lB,!1)),sR(e))}function l5(e,t,n){if(0!=(6&lT))throw Error(l(327));for(var r=!n&&0==(124&t)&&0==(t&e.expiredLanes)||ev(e,t),a=r?function(e,t){var n=lT;lT|=2;var r=so(),a=si();lP!==e||lO!==t?(lq=null,lW=ee()+500,sr(e,t)):lR=ev(e,t);e:for(;;)try{if(0!==lL&&null!==lA){t=lA;var o=lj;t:switch(lL){case 1:lL=0,lj=null,sd(e,t,o,1);break;case 2:case 9:if(an(o)){lL=0,lj=null,sc(t);break}t=function(){2!==lL&&9!==lL||lP!==e||(lL=7),sR(e)},o.then(t,t);break e;case 3:lL=7;break e;case 4:lL=5;break e;case 7:an(o)?(lL=0,lj=null,sc(t)):(lL=0,lj=null,sd(e,t,o,7));break;case 5:var i=null;switch(lA.tag){case 26:i=lA.memoizedState;case 5:case 27:var s=lA;if(i?uH(i):1){lL=0,lj=null;var u=s.sibling;if(null!==u)lA=u;else{var c=s.return;null!==c?(lA=c,sf(c)):lA=null}break t}}lL=0,lj=null,sd(e,t,o,5);break;case 6:lL=0,lj=null,sd(e,t,o,6);break;case 8:sn(),lD=6;break e;default:throw Error(l(462))}}for(;null!==lA&&!X();)su(lA);break}catch(t){sa(e,t)}return(rI=rR=null,N.H=r,N.A=a,lT=n,null!==lA)?0:(lP=null,lO=0,n1(),lD)}(e,t):ss(e,t,!0),o=r;;){if(0===a)lR&&!r&&se(e,t,0,!1);else{if(n=e.current.alternate,o&&!function(e){for(var t=e;;){var n=t.tag;if((0===n||11===n||15===n)&&16384&t.flags&&null!==(n=t.updateQueue)&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var a=n[r],o=a.getSnapshot;a=a.value;try{if(!nS(o(),a))return!1}catch(e){return!1}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(n)){a=ss(e,t,!1),o=!1;continue}if(2===a){if(o=t,e.errorRecoveryDisabledLanes&o)var i=0;else i=0!=(i=-0x20000001&e.pendingLanes)?i:0x20000000&i?0x20000000:0;if(0!==i){t=i;e:{a=lH;var s=e.current.memoizedState.isDehydrated;if(s&&(sr(e,i).flags|=256),2!==(i=ss(e,i,!1))){if(lI&&!s){e.errorRecoveryDisabledLanes|=o,lM|=o,a=4;break e}o=lQ,lQ=a,null!==o&&(null===lQ?lQ=o:lQ.push.apply(lQ,o))}a=i}if(o=!1,2!==a)continue}}if(1===a){sr(e,0),se(e,t,0,!0);break}e:{switch(r=e,o=a){case 0:case 1:throw Error(l(345));case 4:if((4194048&t)!==t)break;case 6:se(r,t,lB,!lN);break e;case 2:lQ=null;break;case 3:case 5:break;default:throw Error(l(329))}if((0x3c00000&t)===t&&10<(a=lV+300-ee())){if(se(r,t,lB,!lN),0!==ey(r,0,!0))break e;r.timeoutHandle=uc(l7.bind(null,r,n,lQ,lq,lZ,t,lB,lM,lU,lN,o,2,-0,0),a);break e}l7(r,n,lQ,lq,lZ,t,lB,lM,lU,lN,o,0,-0,0)}}break}sR(e)}function l7(e,t,n,r,a,o,i,s,u,c,d,f,p,m){if(e.timeoutHandle=-1,(8192&(f=t.subtreeFlags)||0x1002000==(0x1002000&f))&&(uQ={stylesheets:null,count:0,unsuspend:uZ},lk(t),null!==(f=function(){if(null===uQ)throw Error(l(475));var e=uQ;return e.stylesheets&&0===e.count&&uq(e,e.stylesheets),0<e.count?function(t){var n=setTimeout(function(){if(e.stylesheets&&uq(e,e.stylesheets),e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}},6e4);return e.unsuspend=t,function(){e.unsuspend=null,clearTimeout(n)}}:null}()))){e.cancelPendingCommit=f(sm.bind(null,e,t,o,n,r,a,i,s,u,d,1,p,m)),se(e,o,i,!c);return}sm(e,t,o,n,r,a,i,s,u)}function se(e,t,n,r){t&=~l$,t&=~lM,e.suspendedLanes|=t,e.pingedLanes&=~t,r&&(e.warmLanes|=t),r=e.expirationTimes;for(var a=t;0<a;){var o=31-ef(a),i=1<<o;r[o]=-1,a&=~i}0!==n&&eE(e,n,t)}function st(){return 0!=(6&lT)||(sI(0,!1),!1)}function sn(){if(null!==lA){if(0===lL)var e=lA.return;else e=lA,rI=rR=null,aQ(e),oW=null,oq=0,e=lA;for(;null!==e;)iW(e.alternate,e),e=e.return;lA=null}}function sr(e,t){var n=e.timeoutHandle;-1!==n&&(e.timeoutHandle=-1,ud(n)),null!==(n=e.cancelPendingCommit)&&(e.cancelPendingCommit=null,n()),sn(),lP=e,lA=n=rt(e.current,null),lO=t,lL=0,lj=null,lN=!1,lR=ev(e,t),lI=!1,lU=lB=l$=lM=lz=lD=0,lQ=lH=null,lZ=!1,0!=(8&t)&&(t|=32&t);var r=e.entangledLanes;if(0!==r)for(e=e.entanglements,r&=t;0<r;){var a=31-ef(r),o=1<<a;t|=e[a],r&=~o}return lF=t,n1(),n}function sa(e,t){aC=null,N.H=oH,t===r5||t===ae?(t=ai(),lL=3):t===r7?(t=ai(),lL=4):lL=t===ig?8:null!==t&&"object"==typeof t&&"function"==typeof t.then?6:1,lj=t,null===lA&&(lD=1,ic(e,nK(t,e.current)))}function so(){var e=N.H;return N.H=oH,null===e?oH:e}function si(){var e=N.A;return N.A=l_,e}function sl(){lD=4,lN||(4194048&lO)!==lO&&null!==o2.current||(lR=!0),0==(0x7ffffff&lz)&&0==(0x7ffffff&lM)||null===lP||se(lP,lO,lB,!1)}function ss(e,t,n){var r=lT;lT|=2;var a=so(),o=si();(lP!==e||lO!==t)&&(lq=null,sr(e,t)),t=!1;var i=lD;e:for(;;)try{if(0!==lL&&null!==lA){var l=lA,s=lj;switch(lL){case 8:sn(),i=6;break e;case 3:case 2:case 9:case 6:null===o2.current&&(t=!0);var u=lL;if(lL=0,lj=null,sd(e,l,s,u),n&&lR){i=0;break e}break;default:u=lL,lL=0,lj=null,sd(e,l,s,u)}}(function(){for(;null!==lA;)su(lA)})(),i=lD;break}catch(t){sa(e,t)}return t&&e.shellSuspendCounter++,rI=rR=null,lT=r,N.H=a,N.A=o,null===lA&&(lP=null,lO=0,n1()),i}function su(e){var t=iB(e.alternate,e,lF);e.memoizedProps=e.pendingProps,null===t?sf(e):lA=t}function sc(e){var t=e,n=t.alternate;switch(t.tag){case 15:case 0:t=iC(n,t,t.pendingProps,t.type,void 0,lO);break;case 11:t=iC(n,t,t.pendingProps,t.type.render,t.ref,lO);break;case 5:aQ(t);default:iW(n,t),t=iB(n,t=lA=rn(t,lF),lF)}e.memoizedProps=e.pendingProps,null===t?sf(e):lA=t}function sd(e,t,n,r){rI=rR=null,aQ(t),oW=null,oq=0;var a=t.return;try{if(function(e,t,n,r,a){if(n.flags|=32768,null!==r&&"object"==typeof r&&"function"==typeof r.then){if(null!==(t=n.alternate)&&r$(t,n,a,!0),null!==(n=o2.current)){switch(n.tag){case 13:return null===o4?sl():null===n.alternate&&0===lD&&(lD=3),n.flags&=-257,n.flags|=65536,n.lanes=a,r===at?n.flags|=16384:(null===(t=n.updateQueue)?n.updateQueue=new Set([r]):t.add(r),sS(e,r,a)),!1;case 22:return n.flags|=65536,r===at?n.flags|=16384:(null===(t=n.updateQueue)?(t={transitions:null,markerInstances:null,retryQueue:new Set([r])},n.updateQueue=t):null===(n=t.retryQueue)?t.retryQueue=new Set([r]):n.add(r),sS(e,r,a)),!1}throw Error(l(435,n.tag))}return sS(e,r,a),sl(),!1}if(rx)return null!==(t=o2.current)?(0==(65536&t.flags)&&(t.flags|=256),t.flags|=65536,t.lanes=a,r!==r_&&rj(nK(e=Error(l(422),{cause:r}),n))):(r!==r_&&rj(nK(t=Error(l(423),{cause:r}),n)),e=e.current.alternate,e.flags|=65536,a&=-a,e.lanes|=a,r=nK(r,n),a=ip(e.stateNode,r,a),am(e,a),4!==lD&&(lD=2)),!1;var o=Error(l(520),{cause:r});if(o=nK(o,n),null===lH?lH=[o]:lH.push(o),4!==lD&&(lD=2),null===t)return!0;r=nK(r,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=a&-a,n.lanes|=e,e=ip(n.stateNode,r,e),am(n,e),!1;case 1:if(t=n.type,o=n.stateNode,0==(128&n.flags)&&("function"==typeof t.getDerivedStateFromError||null!==o&&"function"==typeof o.componentDidCatch&&(null===lG||!lG.has(o))))return n.flags|=65536,a&=-a,n.lanes|=a,ih(a=im(a),e,n,r),am(n,a),!1}n=n.return}while(null!==n);return!1}(e,a,t,n,lO)){lD=1,ic(e,nK(n,e.current)),lA=null;return}}catch(t){if(null!==a)throw lA=a,t;lD=1,ic(e,nK(n,e.current)),lA=null;return}32768&t.flags?(rx||1===r?e=!0:lR||0!=(0x20000000&lO)?e=!1:(lN=e=!0,(2===r||9===r||3===r||6===r)&&null!==(r=o2.current)&&13===r.tag&&(r.flags|=16384)),sp(t,e)):sf(t)}function sf(e){var t=e;do{if(0!=(32768&t.flags))return void sp(t,lN);e=t.return;var n=function(e,t,n){var r=t.pendingProps;switch(rv(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:case 1:return iV(t),null;case 3:return n=t.stateNode,r=null,null!==e&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),rD(rG),V(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(null===e||null===e.child)&&(rA(t)?iU(t):null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,rL())),iV(t),null;case 26:return n=t.memoizedState,null===e?(iU(t),null!==n?(iV(t),iH(t,n)):(iV(t),t.flags&=-0x1000001)):n?n!==e.memoizedState?(iU(t),iV(t),iH(t,n)):(iV(t),t.flags&=-0x1000001):(e.memoizedProps!==r&&iU(t),iV(t),t.flags&=-0x1000001),null;case 27:q(t),n=H.current;var a=t.type;if(null!==e&&null!=t.stateNode)e.memoizedProps!==r&&iU(t);else{if(!r){if(null===t.stateNode)throw Error(l(166));return iV(t),null}e=B.current,rA(t)?rT(t,e):(e=ux(a,r,n),t.stateNode=e,iU(t))}return iV(t),null;case 5:if(q(t),n=t.type,null!==e&&null!=t.stateNode)e.memoizedProps!==r&&iU(t);else{if(!r){if(null===t.stateNode)throw Error(l(166));return iV(t),null}if(e=B.current,rA(t))rT(t,e);else{switch(a=uo(H.current),e){case 1:e=a.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=a.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=a.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=a.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":(e=a.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild);break;case"select":e="string"==typeof r.is?a.createElement("select",{is:r.is}):a.createElement("select"),r.multiple?e.multiple=!0:r.size&&(e.size=r.size);break;default:e="string"==typeof r.is?a.createElement(n,{is:r.is}):a.createElement(n)}}e[eO]=t,e[eL]=r;e:for(a=t.child;null!==a;){if(5===a.tag||6===a.tag)e.appendChild(a.stateNode);else if(4!==a.tag&&27!==a.tag&&null!==a.child){a.child.return=a,a=a.child;continue}if(a===t)break;for(;null===a.sibling;){if(null===a.return||a.return===t)break e;a=a.return}a.sibling.return=a.return,a=a.sibling}switch(t.stateNode=e,un(e,n,r),n){case"button":case"input":case"select":case"textarea":e=!!r.autoFocus;break;case"img":e=!0;break;default:e=!1}e&&iU(t)}}return iV(t),t.flags&=-0x1000001,null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&iU(t);else{if("string"!=typeof r&&null===t.stateNode)throw Error(l(166));if(e=H.current,rA(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(a=rk))switch(a.tag){case 27:case 5:r=a.memoizedProps}e[eO]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||s5(e.nodeValue,n)))||rC(t)}else(e=uo(e).createTextNode(r))[eO]=t,t.stateNode=e}return iV(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(a=rA(t),null!==r&&null!==r.dehydrated){if(null===e){if(!a)throw Error(l(318));if(!(a=null!==(a=t.memoizedState)?a.dehydrated:null))throw Error(l(317));a[eO]=t}else rO(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;iV(t),a=!1}else a=rL(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a){if(256&t.flags)return o8(t),t;return o8(t),null}}if(o8(t),0!=(128&t.flags))return t.lanes=n,t;if(n=null!==r,e=null!==e&&null!==e.memoizedState,n){r=t.child,a=null,null!==r.alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(a=r.alternate.memoizedState.cachePool.pool);var o=null;null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)}return n!==e&&n&&(t.child.flags|=8192),iQ(t,t.updateQueue),iV(t),null;case 4:return V(),null===e&&sX(t.stateNode.containerInfo),iV(t),null;case 10:return rD(t.type),iV(t),null;case 19:if(M(o5),null===(a=t.memoizedState))return iV(t),null;if(r=0!=(128&t.flags),null===(o=a.rendering))if(r)iZ(a,!1);else{if(0!==lD||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(o=o7(e))){for(t.flags|=128,iZ(a,!1),e=o.updateQueue,t.updateQueue=e,iQ(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)rn(n,e),n=n.sibling;return $(o5,1&o5.current|2),t.child}e=e.sibling}null!==a.tail&&ee()>lW&&(t.flags|=128,r=!0,iZ(a,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=o7(o))){if(t.flags|=128,r=!0,e=e.updateQueue,t.updateQueue=e,iQ(t,e),iZ(a,!0),null===a.tail&&"hidden"===a.tailMode&&!o.alternate&&!rx)return iV(t),null}else 2*ee()-a.renderingStartTime>lW&&0x20000000!==n&&(t.flags|=128,r=!0,iZ(a,!1),t.lanes=4194304);a.isBackwards?(o.sibling=t.child,t.child=o):(null!==(e=a.last)?e.sibling=o:t.child=o,a.last=o)}if(null!==a.tail)return t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=ee(),t.sibling=null,e=o5.current,$(o5,r?1&e|2:1&e),t;return iV(t),null;case 22:case 23:return o8(t),aE(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?0!=(0x20000000&n)&&0==(128&t.flags)&&(iV(t),6&t.subtreeFlags&&(t.flags|=8192)):iV(t),null!==(n=t.updateQueue)&&iQ(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&M(r3),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),rD(rG),iV(t),null;case 25:case 30:return null}throw Error(l(156,t.tag))}(t.alternate,t,lF);if(null!==n){lA=n;return}if(null!==(t=t.sibling)){lA=t;return}lA=t=e}while(null!==t);0===lD&&(lD=5)}function sp(e,t){do{var n=function(e,t){switch(rv(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return rD(rG),V(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return q(t),null;case 13:if(o8(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(l(340));rO()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return M(o5),null;case 4:return V(),null;case 10:return rD(t.type),null;case 22:case 23:return o8(t),aE(),null!==e&&M(r3),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return rD(rG),null;default:return null}}(e.alternate,e);if(null!==n){n.flags&=32767,lA=n;return}if(null!==(n=e.return)&&(n.flags|=32768,n.subtreeFlags=0,n.deletions=null),!t&&null!==(e=e.sibling)){lA=e;return}lA=e=n}while(null!==e);lD=6,lA=null}function sm(e,t,n,r,a,o,i,s,u){e.cancelPendingCommit=null;do sv();while(0!==lY);if(0!=(6&lT))throw Error(l(327));if(null!==t){if(t===e.current)throw Error(l(177));if(!function(e,t,n,r,a,o){var i=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var l=e.entanglements,s=e.expirationTimes,u=e.hiddenUpdates;for(n=i&~n;0<n;){var c=31-ef(n),d=1<<c;l[c]=0,s[c]=-1;var f=u[c];if(null!==f)for(u[c]=null,c=0;c<f.length;c++){var p=f[c];null!==p&&(p.lane&=-0x20000001)}n&=~d}0!==r&&eE(e,r,0),0!==o&&0===a&&0!==e.tag&&(e.suspendedLanes|=o&~(i&~t))}(e,n,o=t.lanes|t.childLanes|n0,i,s,u),e===lP&&(lA=lP=null,lO=0),lX=t,lK=e,lJ=n,l0=o,l1=a,l2=r,0!=(10256&t.subtreeFlags)||0!=(10256&t.flags)?(e.callbackNode=null,e.callbackPriority=0,Y(ea,function(){return sk(!0),null})):(e.callbackNode=null,e.callbackPriority=0),r=0!=(13878&t.flags),0!=(13878&t.subtreeFlags)||r){r=N.T,N.T=null,a=R.p,R.p=2,i=lT,lT|=4;try{!function(e,t){if(e=e.containerInfo,ur=u4,nP(e=nT(e))){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var a,o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(e){n=null;break e}var s=0,u=-1,c=-1,d=0,f=0,p=e,m=null;t:for(;;){for(;p!==n||0!==o&&3!==p.nodeType||(u=s+o),p!==i||0!==r&&3!==p.nodeType||(c=s+r),3===p.nodeType&&(s+=p.nodeValue.length),null!==(a=p.firstChild);)m=p,p=a;for(;;){if(p===e)break t;if(m===n&&++d===o&&(u=s),m===i&&++f===r&&(c=s),null!==(a=p.nextSibling))break;m=(p=m).parentNode}p=a}n=-1===u||-1===c?null:{start:u,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(ua={focusedElem:e,selectionRange:n},u4=!1,le=t;null!==le;)if(e=(t=le).child,0!=(1024&t.subtreeFlags)&&null!==e)e.return=t,le=e;else for(;null!==le;){switch(i=(t=le).alternate,e=t.flags,t.tag){case 0:case 11:case 15:case 5:case 26:case 27:case 6:case 4:case 17:break;case 1:if(0!=(1024&e)&&null!==i){e=void 0,n=t,o=i.memoizedProps,i=i.memoizedState,r=n.stateNode;try{var h=io(n.type,o,n.elementType===n.type);e=r.getSnapshotBeforeUpdate(h,i),r.__reactInternalSnapshotBeforeUpdate=e}catch(e){sx(n,n.return,e)}}break;case 3:if(0!=(1024&e)){if(9===(n=(e=t.stateNode.containerInfo).nodeType))ub(e);else if(1===n)switch(e.nodeName){case"HEAD":case"HTML":case"BODY":ub(e);break;default:e.textContent=""}}break;default:if(0!=(1024&e))throw Error(l(163))}if(null!==(e=t.sibling)){e.return=t.return,le=e;break}le=t.return}}(e,t,n)}finally{lT=i,R.p=a,N.T=r}}lY=1,sh(),sg(),sb()}}function sh(){if(1===lY){lY=0;var e=lK,t=lX,n=0!=(13878&t.flags);if(0!=(13878&t.subtreeFlags)||n){n=N.T,N.T=null;var r=R.p;R.p=2;var a=lT;lT|=4;try{lc(t,e);var o=ua,i=nT(e.containerInfo),l=o.focusedElem,s=o.selectionRange;if(i!==l&&l&&l.ownerDocument&&function e(t,n){return!!t&&!!n&&(t===n||(!t||3!==t.nodeType)&&(n&&3===n.nodeType?e(t,n.parentNode):"contains"in t?t.contains(n):!!t.compareDocumentPosition&&!!(16&t.compareDocumentPosition(n))))}(l.ownerDocument.documentElement,l)){if(null!==s&&nP(l)){var u=s.start,c=s.end;if(void 0===c&&(c=u),"selectionStart"in l)l.selectionStart=u,l.selectionEnd=Math.min(c,l.value.length);else{var d=l.ownerDocument||document,f=d&&d.defaultView||window;if(f.getSelection){var p=f.getSelection(),m=l.textContent.length,h=Math.min(s.start,m),g=void 0===s.end?h:Math.min(s.end,m);!p.extend&&h>g&&(i=g,g=h,h=i);var b=nC(l,h),y=nC(l,g);if(b&&y&&(1!==p.rangeCount||p.anchorNode!==b.node||p.anchorOffset!==b.offset||p.focusNode!==y.node||p.focusOffset!==y.offset)){var v=d.createRange();v.setStart(b.node,b.offset),p.removeAllRanges(),h>g?(p.addRange(v),p.extend(y.node,y.offset)):(v.setEnd(y.node,y.offset),p.addRange(v))}}}}for(d=[],p=l;p=p.parentNode;)1===p.nodeType&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for("function"==typeof l.focus&&l.focus(),l=0;l<d.length;l++){var k=d[l];k.element.scrollLeft=k.left,k.element.scrollTop=k.top}}u4=!!ur,ua=ur=null}finally{lT=a,R.p=r,N.T=n}}e.current=t,lY=2}}function sg(){if(2===lY){lY=0;var e=lK,t=lX,n=0!=(8772&t.flags);if(0!=(8772&t.subtreeFlags)||n){n=N.T,N.T=null;var r=R.p;R.p=2;var a=lT;lT|=4;try{lt(e,t.alternate,t)}finally{lT=a,R.p=r,N.T=n}}lY=3}}function sb(){if(4===lY||3===lY){lY=0,J();var e=lK,t=lX,n=lJ,r=l2;0!=(10256&t.subtreeFlags)||0!=(10256&t.flags)?lY=5:(lY=0,lX=lK=null,sy(e,e.pendingLanes));var a=e.pendingLanes;if(0===a&&(lG=null),eT(n),t=t.stateNode,ec&&"function"==typeof ec.onCommitFiberRoot)try{ec.onCommitFiberRoot(eu,t,void 0,128==(128&t.current.flags))}catch(e){}if(null!==r){t=N.T,a=R.p,R.p=2,N.T=null;try{for(var o=e.onRecoverableError,i=0;i<r.length;i++){var l=r[i];o(l.value,{componentStack:l.stack})}}finally{N.T=t,R.p=a}}0!=(3&lJ)&&sv(),sR(e),a=e.pendingLanes,0!=(4194090&n)&&0!=(42&a)?e===l3?l4++:(l4=0,l3=e):l4=0,sI(0,!1)}}function sy(e,t){0==(e.pooledCacheLanes&=t)&&null!=(t=e.pooledCache)&&(e.pooledCache=null,rK(t))}function sv(e){return sh(),sg(),sb(),sk(e)}function sk(){if(5!==lY)return!1;var e=lK,t=l0;l0=0;var n=eT(lJ),r=N.T,a=R.p;try{R.p=32>n?32:n,N.T=null,n=l1,l1=null;var o=lK,i=lJ;if(lY=0,lX=lK=null,lJ=0,0!=(6&lT))throw Error(l(331));var s=lT;if(lT|=4,lS(o.current),lg(o,o.current,i,n),lT=s,sI(0,!1),ec&&"function"==typeof ec.onPostCommitFiberRoot)try{ec.onPostCommitFiberRoot(eu,o)}catch(e){}return!0}finally{R.p=a,N.T=r,sy(e,t)}}function sw(e,t,n){t=nK(n,t),t=ip(e.stateNode,t,2),null!==(e=af(e,t,2))&&(eS(e,2),sR(e))}function sx(e,t,n){if(3===e.tag)sw(e,e,n);else for(;null!==t;){if(3===t.tag){sw(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===lG||!lG.has(r))){e=nK(n,e),null!==(r=af(t,n=im(2),2))&&(ih(n,r,t,e),eS(r,2),sR(r));break}}t=t.return}}function sS(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new lC;var a=new Set;r.set(t,a)}else void 0===(a=r.get(t))&&(a=new Set,r.set(t,a));a.has(n)||(lI=!0,a.add(n),e=sE.bind(null,e,t,n),t.then(e,e))}function sE(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,lP===e&&(lO&n)===n&&(4===lD||3===lD&&(0x3c00000&lO)===lO&&300>ee()-lV?0==(2&lT)&&sr(e,0):l$|=n,lU===lO&&(lU=0)),sR(e)}function s_(e,t){0===t&&(t=ew()),null!==(e=n3(e,t))&&(eS(e,t),sR(e))}function sC(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),s_(e,n)}function sT(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;null!==a&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(l(314))}null!==r&&r.delete(t),s_(e,n)}var sP=null,sA=null,sO=!1,sL=!1,sj=!1,sN=0;function sR(e){e!==sA&&null===e.next&&(null===sA?sP=sA=e:sA=sA.next=e),sL=!0,sO||(sO=!0,up(function(){0!=(6&lT)?Y(en,sF):sD()}))}function sI(e,t){if(!sj&&sL){sj=!0;do for(var n=!1,r=sP;null!==r;){if(!t)if(0!==e){var a=r.pendingLanes;if(0===a)var o=0;else{var i=r.suspendedLanes,l=r.pingedLanes;o=0xc000095&(o=(1<<31-ef(42|e)+1)-1&(a&~(i&~l)))?0xc000095&o|1:o?2|o:0}0!==o&&(n=!0,s$(r,o))}else o=lO,0==(3&(o=ey(r,r===lP?o:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||ev(r,o)||(n=!0,s$(r,o));r=r.next}while(n);sj=!1}}function sF(){sD()}function sD(){sL=sO=!1;var e,t=0;0!==sN&&(((e=window.event)&&"popstate"===e.type?e===uu||(uu=e,0):(uu=null,1))||(t=sN),sN=0);for(var n=ee(),r=null,a=sP;null!==a;){var o=a.next,i=sz(a,n);0===i?(a.next=null,null===r?sP=o:r.next=o,null===o&&(sA=r)):(r=a,(0!==t||0!=(3&i))&&(sL=!0)),a=o}sI(t,!1)}function sz(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,a=e.expirationTimes,o=-0x3c00001&e.pendingLanes;0<o;){var i=31-ef(o),l=1<<i,s=a[i];-1===s?(0==(l&n)||0!=(l&r))&&(a[i]=function(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return -1}}(l,t)):s<=t&&(e.expiredLanes|=l),o&=~l}if(t=lP,n=lO,n=ey(e,e===t?n:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle),r=e.callbackNode,0===n||e===t&&(2===lL||9===lL)||null!==e.cancelPendingCommit)return null!==r&&null!==r&&K(r),e.callbackNode=null,e.callbackPriority=0;if(0==(3&n)||ev(e,n)){if((t=n&-n)===e.callbackPriority)return t;switch(null!==r&&K(r),eT(n)){case 2:case 8:n=er;break;case 32:default:n=ea;break;case 0x10000000:n=ei}return n=Y(n,r=sM.bind(null,e)),e.callbackPriority=t,e.callbackNode=n,t}return null!==r&&null!==r&&K(r),e.callbackPriority=2,e.callbackNode=null,2}function sM(e,t){if(0!==lY&&5!==lY)return e.callbackNode=null,e.callbackPriority=0,null;var n=e.callbackNode;if(sv(!0)&&e.callbackNode!==n)return null;var r=lO;return 0===(r=ey(e,e===lP?r:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle))?null:(l5(e,r,t),sz(e,ee()),null!=e.callbackNode&&e.callbackNode===n?sM.bind(null,e):null)}function s$(e,t){if(sv())return null;l5(e,t,!0)}function sB(){return 0===sN&&(sN=ek()),sN}function sU(e){return null==e||"symbol"==typeof e||"boolean"==typeof e?null:"function"==typeof e?e:tm(""+e)}function sH(e,t){var n=t.ownerDocument.createElement("input");return n.name=t.name,n.value=t.value,e.id&&n.setAttribute("form",e.id),t.parentNode.insertBefore(n,t),e=new FormData(e),n.parentNode.removeChild(n),e}for(var sQ=0;sQ<nq.length;sQ++){var sZ=nq[sQ];nG(sZ.toLowerCase(),"on"+(sZ[0].toUpperCase()+sZ.slice(1)))}nG(n$,"onAnimationEnd"),nG(nB,"onAnimationIteration"),nG(nU,"onAnimationStart"),nG("dblclick","onDoubleClick"),nG("focusin","onFocus"),nG("focusout","onBlur"),nG(nH,"onTransitionRun"),nG(nQ,"onTransitionStart"),nG(nZ,"onTransitionCancel"),nG(nV,"onTransitionEnd"),eW("onMouseEnter",["mouseout","mouseover"]),eW("onMouseLeave",["mouseout","mouseover"]),eW("onPointerEnter",["pointerout","pointerover"]),eW("onPointerLeave",["pointerout","pointerover"]),eV("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),eV("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),eV("onBeforeInput",["compositionend","keypress","textInput","paste"]),eV("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),eV("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),eV("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var sV="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),sW=new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(sV));function sq(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],s=l.instance,u=l.currentTarget;if(l=l.listener,s!==o&&a.isPropagationStopped())break e;o=l,a.currentTarget=u;try{o(a)}catch(e){ii(e)}a.currentTarget=null,o=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,u=l.currentTarget,l=l.listener,s!==o&&a.isPropagationStopped())break e;o=l,a.currentTarget=u;try{o(a)}catch(e){ii(e)}a.currentTarget=null,o=s}}}}function sG(e,t){var n=t[eN];void 0===n&&(n=t[eN]=new Set);var r=e+"__bubble";n.has(r)||(sJ(t,e,2,!1),n.add(r))}function sY(e,t,n){var r=0;t&&(r|=4),sJ(n,e,r,t)}var sK="_reactListening"+Math.random().toString(36).slice(2);function sX(e){if(!e[sK]){e[sK]=!0,eQ.forEach(function(t){"selectionchange"!==t&&(sW.has(t)||sY(t,!1,e),sY(t,!0,e))});var t=9===e.nodeType?e:e.ownerDocument;null===t||t[sK]||(t[sK]=!0,sY("selectionchange",!1,t))}}function sJ(e,t,n,r){switch(ce(t)){case 2:var a=u3;break;case 8:a=u6;break;default:a=u9}n=a.bind(null,t,n,e),a=void 0,tE&&("touchstart"===t||"touchmove"===t||"wheel"===t)&&(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function s0(e,t,n,r,a){var o=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var l=r.stateNode.containerInfo;if(l===a)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&i.stateNode.containerInfo===a)return;i=i.return}for(;null!==l;){if(null===(i=eM(l)))return;if(5===(s=i.tag)||6===s||26===s||27===s){r=o=i;continue e}l=l.parentNode}}r=r.return}tw(function(){var r=o,a=tg(n),i=[];e:{var l=nW.get(e);if(void 0!==l){var s=t$,c=e;switch(e){case"keypress":if(0===tO(n))break e;case"keydown":case"keyup":s=t1;break;case"focusin":c="focus",s=tV;break;case"focusout":c="blur",s=tV;break;case"beforeblur":case"afterblur":s=tV;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=tQ;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=tZ;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=t4;break;case n$:case nB:case nU:s=tW;break;case nV:s=t3;break;case"scroll":case"scrollend":s=tU;break;case"wheel":s=t6;break;case"copy":case"cut":case"paste":s=tq;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=t2;break;case"toggle":case"beforetoggle":s=t9}var d=0!=(4&t),f=!d&&("scroll"===e||"scrollend"===e),p=d?null!==l?l+"Capture":null:l;d=[];for(var m,h=r;null!==h;){var g=h;if(m=g.stateNode,5!==(g=g.tag)&&26!==g&&27!==g||null===m||null===p||null!=(g=tx(h,p))&&d.push(s1(h,g,m)),f)break;h=h.return}0<d.length&&(l=new s(l,c,null,n,a),i.push({event:l,listeners:d}))}}if(0==(7&t)){if((l="mouseover"===e||"pointerover"===e,s="mouseout"===e||"pointerout"===e,!(l&&n!==th&&(c=n.relatedTarget||n.fromElement)&&(eM(c)||c[ej])))&&(s||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,s?(c=n.relatedTarget||n.toElement,s=r,null!==(c=c?eM(c):null)&&(f=u(c),d=c.tag,c!==f||5!==d&&27!==d&&6!==d)&&(c=null)):(s=null,c=r),s!==c)){if(d=tQ,g="onMouseLeave",p="onMouseEnter",h="mouse",("pointerout"===e||"pointerover"===e)&&(d=t2,g="onPointerLeave",p="onPointerEnter",h="pointer"),f=null==s?l:eB(s),m=null==c?l:eB(c),(l=new d(g,h+"leave",s,n,a)).target=f,l.relatedTarget=m,g=null,eM(a)===r&&((d=new d(p,h+"enter",c,n,a)).target=m,d.relatedTarget=f,g=d),f=g,s&&c)t:{for(d=s,p=c,h=0,m=d;m;m=s4(m))h++;for(m=0,g=p;g;g=s4(g))m++;for(;0<h-m;)d=s4(d),h--;for(;0<m-h;)p=s4(p),m--;for(;h--;){if(d===p||null!==p&&d===p.alternate)break t;d=s4(d),p=s4(p)}d=null}else d=null;null!==s&&s3(i,l,s,d,!1),null!==c&&null!==f&&s3(i,f,c,d,!0)}e:{if("select"===(s=(l=r?eB(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var b,y=np;else if(nl(l))if(nm)y=nx;else{y=nk;var v=nv}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)?y=nw:r&&td(r.elementType)&&(y=np);if(y&&(y=y(e,r))){ns(i,y,n,a);break e}v&&v(e,l,r),"focusout"===e&&r&&"number"===l.type&&null!=r.memoizedProps.value&&tr(l,"number",l.value)}switch(v=r?eB(r):window,e){case"focusin":(nl(v)||"true"===v.contentEditable)&&(nO=v,nL=r,nj=null);break;case"focusout":nj=nL=nO=null;break;case"mousedown":nN=!0;break;case"contextmenu":case"mouseup":case"dragend":nN=!1,nR(i,n,a);break;case"selectionchange":if(nA)break;case"keydown":case"keyup":nR(i,n,a)}if(t5)t:{switch(e){case"compositionstart":var k="onCompositionStart";break t;case"compositionend":k="onCompositionEnd";break t;case"compositionupdate":k="onCompositionUpdate";break t}k=void 0}else no?nr(e,n)&&(k="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(k="onCompositionStart");k&&(nt&&"ko"!==n.locale&&(no||"onCompositionStart"!==k?"onCompositionEnd"===k&&no&&(b=tA()):(tT="value"in(tC=a)?tC.value:tC.textContent,no=!0)),0<(v=s2(r,k)).length&&(k=new tG(k,e,null,n,a),i.push({event:k,listeners:v}),b?k.data=b:null!==(b=na(n))&&(k.data=b))),(b=ne?function(e,t){switch(e){case"compositionend":return na(t);case"keypress":if(32!==t.which)return null;return nn=!0," ";case"textInput":return" "===(e=t.data)&&nn?null:e;default:return null}}(e,n):function(e,t){if(no)return"compositionend"===e||!t5&&nr(e,t)?(e=tA(),tP=tT=tC=null,no=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return nt&&"ko"!==t.locale?null:t.data}}(e,n))&&0<(k=s2(r,"onBeforeInput")).length&&(v=new tG("onBeforeInput","beforeinput",null,n,a),i.push({event:v,listeners:k}),v.data=b);var w=e;if("submit"===w&&r&&r.stateNode===a){var x=sU((a[eL]||null).action),S=n.submitter;S&&null!==(w=(w=S[eL]||null)?sU(w.formAction):S.getAttribute("formAction"))&&(x=w,S=null);var E=new t$("action","action",null,n,a);i.push({event:E,listeners:[{instance:null,listener:function(){if(n.defaultPrevented){if(0!==sN){var e=S?sH(a,S):new FormData(a);oA(r,{pending:!0,data:e,method:a.method,action:x},null,e)}}else"function"==typeof x&&(E.preventDefault(),oA(r,{pending:!0,data:e=S?sH(a,S):new FormData(a),method:a.method,action:x},x,e))},currentTarget:a}]})}}sq(i,t)})}function s1(e,t,n){return{instance:e,listener:t,currentTarget:n}}function s2(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;if(5!==(a=a.tag)&&26!==a&&27!==a||null===o||(null!=(a=tx(e,n))&&r.unshift(s1(e,a,o)),null!=(a=tx(e,t))&&r.push(s1(e,a,o))),3===e.tag)return r;e=e.return}return[]}function s4(e){if(null===e)return null;do e=e.return;while(e&&5!==e.tag&&27!==e.tag);return e||null}function s3(e,t,n,r,a){for(var o=t._reactName,i=[];null!==n&&n!==r;){var l=n,s=l.alternate,u=l.stateNode;if(l=l.tag,null!==s&&s===r)break;5!==l&&26!==l&&27!==l||null===u||(s=u,a?null!=(u=tx(n,o))&&i.unshift(s1(n,u,s)):a||null!=(u=tx(n,o))&&i.push(s1(n,u,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var s6=/\r\n?/g,s9=/\u0000|\uFFFD/g;function s8(e){return("string"==typeof e?e:""+e).replace(s6,"\n").replace(s9,"")}function s5(e,t){return t=s8(t),s8(e)===t}function s7(){}function ue(e,t,n,r,a,o){switch(n){case"children":"string"==typeof r?"body"===t||"textarea"===t&&""===r||tl(e,r):("number"==typeof r||"bigint"==typeof r)&&"body"!==t&&tl(e,""+r);break;case"className":eX(e,"class",r);break;case"tabIndex":eX(e,"tabindex",r);break;case"dir":case"role":case"viewBox":case"width":case"height":eX(e,n,r);break;case"style":tc(e,r,o);break;case"data":if("object"!==t){eX(e,"data",r);break}case"src":case"href":if(""===r&&("a"!==t||"href"!==n)||null==r||"function"==typeof r||"symbol"==typeof r||"boolean"==typeof r){e.removeAttribute(n);break}r=tm(""+r),e.setAttribute(n,r);break;case"action":case"formAction":if("function"==typeof r){e.setAttribute(n,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}if("function"==typeof o&&("formAction"===n?("input"!==t&&ue(e,t,"name",a.name,a,null),ue(e,t,"formEncType",a.formEncType,a,null),ue(e,t,"formMethod",a.formMethod,a,null),ue(e,t,"formTarget",a.formTarget,a,null)):(ue(e,t,"encType",a.encType,a,null),ue(e,t,"method",a.method,a,null),ue(e,t,"target",a.target,a,null))),null==r||"symbol"==typeof r||"boolean"==typeof r){e.removeAttribute(n);break}r=tm(""+r),e.setAttribute(n,r);break;case"onClick":null!=r&&(e.onclick=s7);break;case"onScroll":null!=r&&sG("scroll",e);break;case"onScrollEnd":null!=r&&sG("scrollend",e);break;case"dangerouslySetInnerHTML":if(null!=r){if("object"!=typeof r||!("__html"in r))throw Error(l(61));if(null!=(n=r.__html)){if(null!=a.children)throw Error(l(60));e.innerHTML=n}}break;case"multiple":e.multiple=r&&"function"!=typeof r&&"symbol"!=typeof r;break;case"muted":e.muted=r&&"function"!=typeof r&&"symbol"!=typeof r;break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":case"autoFocus":case"innerText":case"textContent":break;case"xlinkHref":if(null==r||"function"==typeof r||"boolean"==typeof r||"symbol"==typeof r){e.removeAttribute("xlink:href");break}n=tm(""+r),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",n);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":null!=r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,""+r):e.removeAttribute(n);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,""):e.removeAttribute(n);break;case"capture":case"download":!0===r?e.setAttribute(n,""):!1!==r&&null!=r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,r):e.removeAttribute(n);break;case"cols":case"rows":case"size":case"span":null!=r&&"function"!=typeof r&&"symbol"!=typeof r&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case"rowSpan":case"start":null==r||"function"==typeof r||"symbol"==typeof r||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case"popover":sG("beforetoggle",e),sG("toggle",e),eK(e,"popover",r);break;case"xlinkActuate":eJ(e,"http://www.w3.org/1999/xlink","xlink:actuate",r);break;case"xlinkArcrole":eJ(e,"http://www.w3.org/1999/xlink","xlink:arcrole",r);break;case"xlinkRole":eJ(e,"http://www.w3.org/1999/xlink","xlink:role",r);break;case"xlinkShow":eJ(e,"http://www.w3.org/1999/xlink","xlink:show",r);break;case"xlinkTitle":eJ(e,"http://www.w3.org/1999/xlink","xlink:title",r);break;case"xlinkType":eJ(e,"http://www.w3.org/1999/xlink","xlink:type",r);break;case"xmlBase":eJ(e,"http://www.w3.org/XML/1998/namespace","xml:base",r);break;case"xmlLang":eJ(e,"http://www.w3.org/XML/1998/namespace","xml:lang",r);break;case"xmlSpace":eJ(e,"http://www.w3.org/XML/1998/namespace","xml:space",r);break;case"is":eK(e,"is",r);break;default:2<n.length&&("o"===n[0]||"O"===n[0])&&("n"===n[1]||"N"===n[1])||eK(e,n=tf.get(n)||n,r)}}function ut(e,t,n,r,a,o){switch(n){case"style":tc(e,r,o);break;case"dangerouslySetInnerHTML":if(null!=r){if("object"!=typeof r||!("__html"in r))throw Error(l(61));if(null!=(n=r.__html)){if(null!=a.children)throw Error(l(60));e.innerHTML=n}}break;case"children":"string"==typeof r?tl(e,r):("number"==typeof r||"bigint"==typeof r)&&tl(e,""+r);break;case"onScroll":null!=r&&sG("scroll",e);break;case"onScrollEnd":null!=r&&sG("scrollend",e);break;case"onClick":null!=r&&(e.onclick=s7);break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"innerHTML":case"ref":case"innerText":case"textContent":break;default:if(!eZ.hasOwnProperty(n))e:{if("o"===n[0]&&"n"===n[1]&&(a=n.endsWith("Capture"),t=n.slice(2,a?n.length-7:void 0),"function"==typeof(o=null!=(o=e[eL]||null)?o[n]:null)&&e.removeEventListener(t,o,a),"function"==typeof r)){"function"!=typeof o&&null!==o&&(n in e?e[n]=null:e.hasAttribute(n)&&e.removeAttribute(n)),e.addEventListener(t,r,a);break e}n in e?e[n]=r:!0===r?e.setAttribute(n,""):eK(e,n,r)}}}function un(e,t,n){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"img":sG("error",e),sG("load",e);var r,a=!1,o=!1;for(r in n)if(n.hasOwnProperty(r)){var i=n[r];if(null!=i)switch(r){case"src":a=!0;break;case"srcSet":o=!0;break;case"children":case"dangerouslySetInnerHTML":throw Error(l(137,t));default:ue(e,t,r,i,n,null)}}o&&ue(e,t,"srcSet",n.srcSet,n,null),a&&ue(e,t,"src",n.src,n,null);return;case"input":sG("invalid",e);var s=r=i=o=null,u=null,c=null;for(a in n)if(n.hasOwnProperty(a)){var d=n[a];if(null!=d)switch(a){case"name":o=d;break;case"type":i=d;break;case"checked":u=d;break;case"defaultChecked":c=d;break;case"value":r=d;break;case"defaultValue":s=d;break;case"children":case"dangerouslySetInnerHTML":if(null!=d)throw Error(l(137,t));break;default:ue(e,t,a,d,n,null)}}tn(e,r,s,u,c,i,o,!1),e9(e);return;case"select":for(o in sG("invalid",e),a=i=r=null,n)if(n.hasOwnProperty(o)&&null!=(s=n[o]))switch(o){case"value":r=s;break;case"defaultValue":i=s;break;case"multiple":a=s;default:ue(e,t,o,s,n,null)}t=r,n=i,e.multiple=!!a,null!=t?ta(e,!!a,t,!1):null!=n&&ta(e,!!a,n,!0);return;case"textarea":for(i in sG("invalid",e),r=o=a=null,n)if(n.hasOwnProperty(i)&&null!=(s=n[i]))switch(i){case"value":a=s;break;case"defaultValue":o=s;break;case"children":r=s;break;case"dangerouslySetInnerHTML":if(null!=s)throw Error(l(91));break;default:ue(e,t,i,s,n,null)}ti(e,a,o,r),e9(e);return;case"option":for(u in n)n.hasOwnProperty(u)&&null!=(a=n[u])&&("selected"===u?e.selected=a&&"function"!=typeof a&&"symbol"!=typeof a:ue(e,t,u,a,n,null));return;case"dialog":sG("beforetoggle",e),sG("toggle",e),sG("cancel",e),sG("close",e);break;case"iframe":case"object":sG("load",e);break;case"video":case"audio":for(a=0;a<sV.length;a++)sG(sV[a],e);break;case"image":sG("error",e),sG("load",e);break;case"details":sG("toggle",e);break;case"embed":case"source":case"link":sG("error",e),sG("load",e);case"area":case"base":case"br":case"col":case"hr":case"keygen":case"meta":case"param":case"track":case"wbr":case"menuitem":for(c in n)if(n.hasOwnProperty(c)&&null!=(a=n[c]))switch(c){case"children":case"dangerouslySetInnerHTML":throw Error(l(137,t));default:ue(e,t,c,a,n,null)}return;default:if(td(t)){for(d in n)n.hasOwnProperty(d)&&void 0!==(a=n[d])&&ut(e,t,d,a,n,void 0);return}}for(s in n)n.hasOwnProperty(s)&&null!=(a=n[s])&&ue(e,t,s,a,n,null)}var ur=null,ua=null;function uo(e){return 9===e.nodeType?e:e.ownerDocument}function ui(e){switch(e){case"http://www.w3.org/2000/svg":return 1;case"http://www.w3.org/1998/Math/MathML":return 2;default:return 0}}function ul(e,t){if(0===e)switch(t){case"svg":return 1;case"math":return 2;default:return 0}return 1===e&&"foreignObject"===t?0:e}function us(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"bigint"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var uu=null,uc="function"==typeof setTimeout?setTimeout:void 0,ud="function"==typeof clearTimeout?clearTimeout:void 0,uf="function"==typeof Promise?Promise:void 0,up="function"==typeof queueMicrotask?queueMicrotask:void 0!==uf?function(e){return uf.resolve(null).then(e).catch(um)}:uc;function um(e){setTimeout(function(){throw e})}function uh(e){return"head"===e}function ug(e,t){var n=t,r=0,a=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0<r&&8>r){n=r;var i=e.ownerDocument;if(1&n&&uS(i.documentElement),2&n&&uS(i.body),4&n)for(uS(n=i.head),i=n.firstChild;i;){var l=i.nextSibling,s=i.nodeName;i[eD]||"SCRIPT"===s||"STYLE"===s||"LINK"===s&&"stylesheet"===i.rel.toLowerCase()||n.removeChild(i),i=l}}if(0===a){e.removeChild(o),cy(t);return}a--}else"$"===n||"$?"===n||"$!"===n?a++:r=n.charCodeAt(0)-48;else r=0;n=o}while(n);cy(t)}function ub(e){var t=e.firstChild;for(t&&10===t.nodeType&&(t=t.nextSibling);t;){var n=t;switch(t=t.nextSibling,n.nodeName){case"HTML":case"HEAD":case"BODY":ub(n),ez(n);continue;case"SCRIPT":case"STYLE":continue;case"LINK":if("stylesheet"===n.rel.toLowerCase())continue}e.removeChild(n)}}function uy(e){return"$!"===e.data||"$?"===e.data&&"complete"===e.ownerDocument.readyState}function uv(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t||"F!"===t||"F"===t)break;if("/$"===t)return null}}return e}var uk=null;function uw(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}function ux(e,t,n){switch(t=uo(n),e){case"html":if(!(e=t.documentElement))throw Error(l(452));return e;case"head":if(!(e=t.head))throw Error(l(453));return e;case"body":if(!(e=t.body))throw Error(l(454));return e;default:throw Error(l(451))}}function uS(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);ez(e)}var uE=new Map,u_=new Set;function uC(e){return"function"==typeof e.getRootNode?e.getRootNode():9===e.nodeType?e:e.ownerDocument}var uT=R.d;R.d={f:function(){var e=uT.f(),t=st();return e||t},r:function(e){var t=e$(e);null!==t&&5===t.tag&&"form"===t.type?oL(t):uT.r(e)},D:function(e){uT.D(e),uA("dns-prefetch",e,null)},C:function(e,t){uT.C(e,t),uA("preconnect",e,t)},L:function(e,t,n){if(uT.L(e,t,n),uP&&e&&t){var r='link[rel="preload"][as="'+te(t)+'"]';"image"===t&&n&&n.imageSrcSet?(r+='[imagesrcset="'+te(n.imageSrcSet)+'"]',"string"==typeof n.imageSizes&&(r+='[imagesizes="'+te(n.imageSizes)+'"]')):r+='[href="'+te(e)+'"]';var a=r;switch(t){case"style":a=uL(e);break;case"script":a=uR(e)}uE.has(a)||(e=f({rel:"preload",href:"image"===t&&n&&n.imageSrcSet?void 0:e,as:t},n),uE.set(a,e),null!==uP.querySelector(r)||"style"===t&&uP.querySelector(uj(a))||"script"===t&&uP.querySelector(uI(a))||(un(t=uP.createElement("link"),"link",e),eH(t),uP.head.appendChild(t)))}},m:function(e,t){if(uT.m(e,t),uP&&e){var n=t&&"string"==typeof t.as?t.as:"script",r='link[rel="modulepreload"][as="'+te(n)+'"][href="'+te(e)+'"]',a=r;switch(n){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":a=uR(e)}if(!uE.has(a)&&(e=f({rel:"modulepreload",href:e},t),uE.set(a,e),null===uP.querySelector(r))){switch(n){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(uP.querySelector(uI(a)))return}un(n=uP.createElement("link"),"link",e),eH(n),uP.head.appendChild(n)}}},X:function(e,t){if(uT.X(e,t),uP&&e){var n=eU(uP).hoistableScripts,r=uR(e),a=n.get(r);a||((a=uP.querySelector(uI(r)))||(e=f({src:e,async:!0},t),(t=uE.get(r))&&uM(e,t),eH(a=uP.createElement("script")),un(a,"link",e),uP.head.appendChild(a)),a={type:"script",instance:a,count:1,state:null},n.set(r,a))}},S:function(e,t,n){if(uT.S(e,t,n),uP&&e){var r=eU(uP).hoistableStyles,a=uL(e);t=t||"default";var o=r.get(a);if(!o){var i={loading:0,preload:null};if(o=uP.querySelector(uj(a)))i.loading=5;else{e=f({rel:"stylesheet",href:e,"data-precedence":t},n),(n=uE.get(a))&&uz(e,n);var l=o=uP.createElement("link");eH(l),un(l,"link",e),l._p=new Promise(function(e,t){l.onload=e,l.onerror=t}),l.addEventListener("load",function(){i.loading|=1}),l.addEventListener("error",function(){i.loading|=2}),i.loading|=4,uD(o,t,uP)}o={type:"stylesheet",instance:o,count:1,state:i},r.set(a,o)}}},M:function(e,t){if(uT.M(e,t),uP&&e){var n=eU(uP).hoistableScripts,r=uR(e),a=n.get(r);a||((a=uP.querySelector(uI(r)))||(e=f({src:e,async:!0,type:"module"},t),(t=uE.get(r))&&uM(e,t),eH(a=uP.createElement("script")),un(a,"link",e),uP.head.appendChild(a)),a={type:"script",instance:a,count:1,state:null},n.set(r,a))}}};var uP="undefined"==typeof document?null:document;function uA(e,t,n){if(uP&&"string"==typeof t&&t){var r=te(t);r='link[rel="'+e+'"][href="'+r+'"]',"string"==typeof n&&(r+='[crossorigin="'+n+'"]'),u_.has(r)||(u_.add(r),e={rel:e,crossOrigin:n,href:t},null===uP.querySelector(r)&&(un(t=uP.createElement("link"),"link",e),eH(t),uP.head.appendChild(t)))}}function uO(e,t,n,r){var a=(a=H.current)?uC(a):null;if(!a)throw Error(l(446));switch(e){case"meta":case"title":return null;case"style":return"string"==typeof n.precedence&&"string"==typeof n.href?(t=uL(n.href),(r=(n=eU(a).hoistableStyles).get(t))||(r={type:"style",instance:null,count:0,state:null},n.set(t,r)),r):{type:"void",instance:null,count:0,state:null};case"link":if("stylesheet"===n.rel&&"string"==typeof n.href&&"string"==typeof n.precedence){e=uL(n.href);var o,i,s,u,c=eU(a).hoistableStyles,d=c.get(e);if(d||(a=a.ownerDocument||a,d={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},c.set(e,d),(c=a.querySelector(uj(e)))&&!c._p&&(d.instance=c,d.state.loading=5),uE.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},uE.set(e,n),c||(o=a,i=e,s=n,u=d.state,o.querySelector('link[rel="preload"][as="style"]['+i+"]")?u.loading=1:(u.preload=i=o.createElement("link"),i.addEventListener("load",function(){return u.loading|=1}),i.addEventListener("error",function(){return u.loading|=2}),un(i,"link",s),eH(i),o.head.appendChild(i))))),t&&null===r)throw Error(l(528,""));return d}if(t&&null!==r)throw Error(l(529,""));return null;case"script":return t=n.async,"string"==typeof(n=n.src)&&t&&"function"!=typeof t&&"symbol"!=typeof t?(t=uR(n),(r=(n=eU(a).hoistableScripts).get(t))||(r={type:"script",instance:null,count:0,state:null},n.set(t,r)),r):{type:"void",instance:null,count:0,state:null};default:throw Error(l(444,e))}}function uL(e){return'href="'+te(e)+'"'}function uj(e){return'link[rel="stylesheet"]['+e+"]"}function uN(e){return f({},e,{"data-precedence":e.precedence,precedence:null})}function uR(e){return'[src="'+te(e)+'"]'}function uI(e){return"script[async]"+e}function uF(e,t,n){if(t.count++,null===t.instance)switch(t.type){case"style":var r=e.querySelector('style[data-href~="'+te(n.href)+'"]');if(r)return t.instance=r,eH(r),r;var a=f({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return eH(r=(e.ownerDocument||e).createElement("style")),un(r,"style",a),uD(r,n.precedence,e),t.instance=r;case"stylesheet":a=uL(n.href);var o=e.querySelector(uj(a));if(o)return t.state.loading|=4,t.instance=o,eH(o),o;r=uN(n),(a=uE.get(a))&&uz(r,a),eH(o=(e.ownerDocument||e).createElement("link"));var i=o;return i._p=new Promise(function(e,t){i.onload=e,i.onerror=t}),un(o,"link",r),t.state.loading|=4,uD(o,n.precedence,e),t.instance=o;case"script":if(o=uR(n.src),a=e.querySelector(uI(o)))return t.instance=a,eH(a),a;return r=n,(a=uE.get(o))&&uM(r=f({},n),a),eH(a=(e=e.ownerDocument||e).createElement("script")),un(a,"link",r),e.head.appendChild(a),t.instance=a;case"void":return null;default:throw Error(l(443,t.type))}return"stylesheet"===t.type&&0==(4&t.state.loading)&&(r=t.instance,t.state.loading|=4,uD(r,n.precedence,e)),t.instance}function uD(e,t,n){for(var r=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),a=r.length?r[r.length-1]:null,o=a,i=0;i<r.length;i++){var l=r[i];if(l.dataset.precedence===t)o=l;else if(o!==a)break}o?o.parentNode.insertBefore(e,o.nextSibling):(t=9===n.nodeType?n.head:n).insertBefore(e,t.firstChild)}function uz(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.title&&(e.title=t.title)}function uM(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.integrity&&(e.integrity=t.integrity)}var u$=null;function uB(e,t,n){if(null===u$){var r=new Map,a=u$=new Map;a.set(n,r)}else(r=(a=u$).get(n))||(r=new Map,a.set(n,r));if(r.has(e))return r;for(r.set(e,null),n=n.getElementsByTagName(e),a=0;a<n.length;a++){var o=n[a];if(!(o[eD]||o[eO]||"link"===e&&"stylesheet"===o.getAttribute("rel"))&&"http://www.w3.org/2000/svg"!==o.namespaceURI){var i=o.getAttribute(t)||"";i=e+i;var l=r.get(i);l?l.push(o):r.set(i,[o])}}return r}function uU(e,t,n){(e=e.ownerDocument||e).head.insertBefore(n,"title"===t?e.querySelector("head > title"):null)}function uH(e){return"stylesheet"!==e.type||0!=(3&e.state.loading)}var uQ=null;function uZ(){}function uV(){if(this.count--,0===this.count){if(this.stylesheets)uq(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var uW=null;function uq(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,uW=new Map,t.forEach(uG,e),uW=null,uV.call(e))}function uG(e,t){if(!(4&t.state.loading)){var n=uW.get(e);if(n)var r=n.get(null);else{n=new Map,uW.set(e,n);for(var a=e.querySelectorAll("link[data-precedence],style[data-precedence]"),o=0;o<a.length;o++){var i=a[o];("LINK"===i.nodeName||"not all"!==i.getAttribute("media"))&&(n.set(i.dataset.precedence,i),r=i)}r&&n.set(null,r)}i=(a=t.instance).getAttribute("data-precedence"),(o=n.get(i)||r)===r&&n.set(null,a),n.set(i,a),this.count++,r=uV.bind(this),a.addEventListener("load",r),a.addEventListener("error",r),o?o.parentNode.insertBefore(a,o.nextSibling):(e=9===e.nodeType?e.head:e).insertBefore(a,e.firstChild),t.state.loading|=4}}var uY={$$typeof:w,Provider:null,Consumer:null,_currentValue:I,_currentValue2:I,_threadCount:0};function uK(e,t,n,r,a,o,i,l){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=ex(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ex(0),this.hiddenUpdates=ex(null),this.identifierPrefix=r,this.onUncaughtError=a,this.onCaughtError=o,this.onRecoverableError=i,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=l,this.incompleteTransitions=new Map}function uX(e,t,n,r,a,o,i,l,s,u,c,d){return e=new uK(e,t,n,i,l,s,u,d),t=1,!0===o&&(t|=24),o=n7(3,null,null,t),e.current=o,o.stateNode=e,t=rY(),t.refCount++,e.pooledCache=t,t.refCount++,o.memoizedState={element:r,isDehydrated:n,cache:t},au(o),e}function uJ(e,t,n,r,a,o){a=a?n8:n8,null===r.context?r.context=a:r.pendingContext=a,(r=ad(t)).payload={element:n},null!==(o=void 0===o?null:o)&&(r.callback=o),null!==(n=af(e,r,t))&&(l8(n,e,t),ap(n,e,t))}function u0(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function u1(e,t){u0(e,t),(e=e.alternate)&&u0(e,t)}function u2(e){if(13===e.tag){var t=n3(e,0x4000000);null!==t&&l8(t,e,0x4000000),u1(e,0x4000000)}}var u4=!0;function u3(e,t,n,r){var a=N.T;N.T=null;var o=R.p;try{R.p=2,u9(e,t,n,r)}finally{R.p=o,N.T=a}}function u6(e,t,n,r){var a=N.T;N.T=null;var o=R.p;try{R.p=8,u9(e,t,n,r)}finally{R.p=o,N.T=a}}function u9(e,t,n,r){if(u4){var a=u8(r);if(null===a)s0(e,t,r,u5,n),cu(e,r);else if(function(e,t,n,r,a){switch(t){case"focusin":return cn=cc(cn,e,t,n,r,a),!0;case"dragenter":return cr=cc(cr,e,t,n,r,a),!0;case"mouseover":return ca=cc(ca,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return co.set(o,cc(co.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,ci.set(o,cc(ci.get(o)||null,e,t,n,r,a)),!0}return!1}(a,e,t,n,r))r.stopPropagation();else if(cu(e,r),4&t&&-1<cs.indexOf(e)){for(;null!==a;){var o=e$(a);if(null!==o)switch(o.tag){case 3:if((o=o.stateNode).current.memoizedState.isDehydrated){var i=eb(o.pendingLanes);if(0!==i){var l=o;for(l.pendingLanes|=2,l.entangledLanes|=2;i;){var s=1<<31-ef(i);l.entanglements[1]|=s,i&=~s}sR(o),0==(6&lT)&&(lW=ee()+500,sI(0,!1))}}break;case 13:null!==(l=n3(o,2))&&l8(l,o,2),st(),u1(o,2)}if(null===(o=u8(r))&&s0(e,t,r,u5,n),o===a)break;a=o}null!==a&&r.stopPropagation()}else s0(e,t,r,null,n)}}function u8(e){return u7(e=tg(e))}var u5=null;function u7(e){if(u5=null,null!==(e=eM(e))){var t=u(e);if(null===t)e=null;else{var n=t.tag;if(13===n){if(null!==(e=c(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return u5=e,null}function ce(e){switch(e){case"beforetoggle":case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"toggle":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 2;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 8;case"message":switch(et()){case en:return 2;case er:return 8;case ea:case eo:return 32;case ei:return 0x10000000;default:return 32}default:return 32}}var ct=!1,cn=null,cr=null,ca=null,co=new Map,ci=new Map,cl=[],cs="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" ");function cu(e,t){switch(e){case"focusin":case"focusout":cn=null;break;case"dragenter":case"dragleave":cr=null;break;case"mouseover":case"mouseout":ca=null;break;case"pointerover":case"pointerout":co.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ci.delete(t.pointerId)}}function cc(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:o,targetContainers:[a]},null!==t&&null!==(t=e$(t))&&u2(t)):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a)),e}function cd(e){var t=eM(e.target);if(null!==t){var n=u(t);if(null!==n){if(13===(t=n.tag)){if(null!==(t=c(n))){e.blockedOn=t,function(e,t){var n=R.p;try{return R.p=e,t()}finally{R.p=n}}(e.priority,function(){if(13===n.tag){var e=l6(),t=n3(n,e=eC(e));null!==t&&l8(t,n,e),u1(n,e)}});return}}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=3===n.tag?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function cf(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=u8(e.nativeEvent);if(null!==n)return null!==(t=e$(n))&&u2(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);th=r,n.target.dispatchEvent(r),th=null,t.shift()}return!0}function cp(e,t,n){cf(e)&&n.delete(t)}function cm(){ct=!1,null!==cn&&cf(cn)&&(cn=null),null!==cr&&cf(cr)&&(cr=null),null!==ca&&cf(ca)&&(ca=null),co.forEach(cp),ci.forEach(cp)}function ch(e,t){e.blockedOn===t&&(e.blockedOn=null,ct||(ct=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,cm)))}var cg=null;function cb(e){cg!==e&&(cg=e,a.unstable_scheduleCallback(a.unstable_NormalPriority,function(){cg===e&&(cg=null);for(var t=0;t<e.length;t+=3){var n=e[t],r=e[t+1],a=e[t+2];if("function"!=typeof r)if(null===u7(r||n))continue;else break;var o=e$(n);null!==o&&(e.splice(t,3),t-=3,oA(o,{pending:!0,data:a,method:n.method,action:r},r,a))}}))}function cy(e){function t(t){return ch(t,e)}null!==cn&&ch(cn,e),null!==cr&&ch(cr,e),null!==ca&&ch(ca,e),co.forEach(t),ci.forEach(t);for(var n=0;n<cl.length;n++){var r=cl[n];r.blockedOn===e&&(r.blockedOn=null)}for(;0<cl.length&&null===(n=cl[0]).blockedOn;)cd(n),null===n.blockedOn&&cl.shift();if(null!=(n=(e.ownerDocument||e).$$reactFormReplay))for(r=0;r<n.length;r+=3){var a=n[r],o=n[r+1],i=a[eL]||null;if("function"==typeof o)i||cb(n);else if(i){var l=null;if(o&&o.hasAttribute("formAction")){if(a=o,i=o[eL]||null)l=i.formAction;else if(null!==u7(a))continue}else l=i.action;"function"==typeof l?n[r+1]=l:(n.splice(r,3),r-=3),cb(n)}}}function cv(e){this._internalRoot=e}function ck(e){this._internalRoot=e}ck.prototype.render=cv.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(l(409));uJ(t.current,l6(),e,t,null,null)},ck.prototype.unmount=cv.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;uJ(e.current,2,null,e,null,null),st(),t[ej]=null}},ck.prototype.unstable_scheduleHydration=function(e){if(e){var t=eP();e={blockedOn:null,target:e,priority:t};for(var n=0;n<cl.length&&0!==t&&t<cl[n].priority;n++);cl.splice(n,0,e),0===n&&cd(e)}};var cw=o.version;if("19.1.0"!==cw)throw Error(l(527,cw,"19.1.0"));if(R.findDOMNode=function(e){var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(l(188));throw Error(l(268,e=Object.keys(e).join(",")))}return e=null===(e=null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=u(e)))throw Error(l(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var o=a.alternate;if(null===o){if(null!==(r=a.return)){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return d(a),e;if(o===r)return d(a),t;o=o.sibling}throw Error(l(188))}if(n.return!==r.return)n=a,r=o;else{for(var i=!1,s=a.child;s;){if(s===n){i=!0,n=a,r=o;break}if(s===r){i=!0,r=a,n=o;break}s=s.sibling}if(!i){for(s=o.child;s;){if(s===n){i=!0,n=o,r=a;break}if(s===r){i=!0,r=o,n=a;break}s=s.sibling}if(!i)throw Error(l(189))}}if(n.alternate!==r)throw Error(l(190))}if(3!==n.tag)throw Error(l(188));return n.stateNode.current===n?e:t}(t))?function e(t){var n=t.tag;if(5===n||26===n||27===n||6===n)return t;for(t=t.child;null!==t;){if(null!==(n=e(t)))return n;t=t.sibling}return null}(e):null)?null:e.stateNode},"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cx=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cx.isDisabled&&cx.supportsFiber)try{eu=cx.inject({bundleType:0,version:"19.1.0",rendererPackageName:"react-dom",currentDispatcherRef:N,reconcilerVersion:"19.1.0"}),ec=cx}catch(e){}}t.createRoot=function(e,t){if(!s(e))throw Error(l(299));var n=!1,r="",a=il,o=is,i=iu,u=null;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onUncaughtError&&(a=t.onUncaughtError),void 0!==t.onCaughtError&&(o=t.onCaughtError),void 0!==t.onRecoverableError&&(i=t.onRecoverableError),void 0!==t.unstable_transitionCallbacks&&(u=t.unstable_transitionCallbacks)),t=uX(e,1,!1,null,null,n,r,a,o,i,u,null),e[ej]=t.current,sX(e),new cv(t)},t.hydrateRoot=function(e,t,n){if(!s(e))throw Error(l(299));var r=!1,a="",o=il,i=is,u=iu,c=null,d=null;return null!=n&&(!0===n.unstable_strictMode&&(r=!0),void 0!==n.identifierPrefix&&(a=n.identifierPrefix),void 0!==n.onUncaughtError&&(o=n.onUncaughtError),void 0!==n.onCaughtError&&(i=n.onCaughtError),void 0!==n.onRecoverableError&&(u=n.onRecoverableError),void 0!==n.unstable_transitionCallbacks&&(c=n.unstable_transitionCallbacks),void 0!==n.formState&&(d=n.formState)),(t=uX(e,1,!0,t,null!=n?n:null,r,a,o,i,u,c,d)).context=n8,n=t.current,(a=ad(r=eC(r=l6()))).callback=null,af(n,a,r),n=r,t.current.lanes=n,eS(t,n),sR(t),e[ej]=t.current,sX(e),new ck(t)},t.version="19.1.0"},7015:function(e,t,n){"use strict";var r=n(67294);function a(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function o(){}var i={d:{f:o,r:function(){throw Error(a(522))},D:o,C:o,L:o,m:o,X:o,S:o,M:o},p:0,findDOMNode:null},l=Symbol.for("react.portal"),s=r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function u(e,t){return"font"===e?"":"string"==typeof t?"use-credentials"===t?t:"":void 0}t.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!t||1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType)throw Error(a(299));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:l,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.flushSync=function(e){var t=s.T,n=i.p;try{if(s.T=null,i.p=2,e)return e()}finally{s.T=t,i.p=n,i.d.f()}},t.preconnect=function(e,t){"string"==typeof e&&(t=t?"string"==typeof(t=t.crossOrigin)?"use-credentials"===t?t:"":void 0:null,i.d.C(e,t))},t.prefetchDNS=function(e){"string"==typeof e&&i.d.D(e)},t.preinit=function(e,t){if("string"==typeof e&&t&&"string"==typeof t.as){var n=t.as,r=u(n,t.crossOrigin),a="string"==typeof t.integrity?t.integrity:void 0,o="string"==typeof t.fetchPriority?t.fetchPriority:void 0;"style"===n?i.d.S(e,"string"==typeof t.precedence?t.precedence:void 0,{crossOrigin:r,integrity:a,fetchPriority:o}):"script"===n&&i.d.X(e,{crossOrigin:r,integrity:a,fetchPriority:o,nonce:"string"==typeof t.nonce?t.nonce:void 0})}},t.preinitModule=function(e,t){if("string"==typeof e)if("object"==typeof t&&null!==t){if(null==t.as||"script"===t.as){var n=u(t.as,t.crossOrigin);i.d.M(e,{crossOrigin:n,integrity:"string"==typeof t.integrity?t.integrity:void 0,nonce:"string"==typeof t.nonce?t.nonce:void 0})}}else null==t&&i.d.M(e)},t.preload=function(e,t){if("string"==typeof e&&"object"==typeof t&&null!==t&&"string"==typeof t.as){var n=t.as,r=u(n,t.crossOrigin);i.d.L(e,n,{crossOrigin:r,integrity:"string"==typeof t.integrity?t.integrity:void 0,nonce:"string"==typeof t.nonce?t.nonce:void 0,type:"string"==typeof t.type?t.type:void 0,fetchPriority:"string"==typeof t.fetchPriority?t.fetchPriority:void 0,referrerPolicy:"string"==typeof t.referrerPolicy?t.referrerPolicy:void 0,imageSrcSet:"string"==typeof t.imageSrcSet?t.imageSrcSet:void 0,imageSizes:"string"==typeof t.imageSizes?t.imageSizes:void 0,media:"string"==typeof t.media?t.media:void 0})}},t.preloadModule=function(e,t){if("string"==typeof e)if(t){var n=u(t.as,t.crossOrigin);i.d.m(e,{as:"string"==typeof t.as&&"script"!==t.as?t.as:void 0,crossOrigin:n,integrity:"string"==typeof t.integrity?t.integrity:void 0})}else i.d.m(e)},t.requestFormReset=function(e){i.d.r(e)},t.unstable_batchedUpdates=function(e,t){return e(t)},t.useFormState=function(e,t,n){return s.H.useFormState(e,t,n)},t.useFormStatus=function(){return s.H.useHostTransitionStatus()},t.version="19.1.0"},20745:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(96787)},73935:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(7015)},69590:function(e){var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;e.exports=function(e,o){try{return function e(o,i){if(o===i)return!0;if(o&&i&&"object"==typeof o&&"object"==typeof i){var l,s,u,c;if(o.constructor!==i.constructor)return!1;if(Array.isArray(o)){if((l=o.length)!=i.length)return!1;for(s=l;0!=s--;)if(!e(o[s],i[s]))return!1;return!0}if(n&&o instanceof Map&&i instanceof Map){if(o.size!==i.size)return!1;for(c=o.entries();!(s=c.next()).done;)if(!i.has(s.value[0]))return!1;for(c=o.entries();!(s=c.next()).done;)if(!e(s.value[1],i.get(s.value[0])))return!1;return!0}if(r&&o instanceof Set&&i instanceof Set){if(o.size!==i.size)return!1;for(c=o.entries();!(s=c.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(o)&&ArrayBuffer.isView(i)){if((l=o.length)!=i.length)return!1;for(s=l;0!=s--;)if(o[s]!==i[s])return!1;return!0}if(o.constructor===RegExp)return o.source===i.source&&o.flags===i.flags;if(o.valueOf!==Object.prototype.valueOf&&"function"==typeof o.valueOf&&"function"==typeof i.valueOf)return o.valueOf()===i.valueOf();if(o.toString!==Object.prototype.toString&&"function"==typeof o.toString&&"function"==typeof i.toString)return o.toString()===i.toString();if((l=(u=Object.keys(o)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,u[s]))return!1;if(t&&o instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==u[s]&&"__v"!==u[s]&&"__o"!==u[s]||!o.$$typeof)&&!e(o[u[s]],i[u[s]]))return!1;return!0}return o!=o&&i!=i}(e,o)}catch(e){if((e.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw e}}},70405:function(e,t,n){"use strict";n.d(t,{B6:()=>H,ql:()=>K});var r=n(67294),a=n(45697),o=n.n(a),i=n(69590),l=n.n(i),s=n(41143),u=n.n(s),c=n(96774),d=n.n(c);function f(){return(f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return(m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},k=Object.keys(g).map(function(e){return g[e]}),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(w).reduce(function(e,t){return e[w[t]]=t,e},{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},E=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,function(){return t});var r=S(e,"defaultTitle");return t||r||void 0},_=function(e,t){return t.filter(function(t){return void 0!==t[e]}).map(function(t){return t[e]}).reduce(function(e,t){return f({},e,t)},{})},C=function(e,t,n){var r={};return n.filter(function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)}).map(function(t){return t[e]}).reverse().reduce(function(e,n){var a={};n.filter(function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var u=e[n].toLowerCase();return r[n]||(r[n]={}),a[n]||(a[n]={}),!r[n][u]&&(a[n][u]=!0,!0)}).reverse().forEach(function(t){return e.push(t)});for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],s=f({},r[l],a[l]);r[l]=s}return e},[]).reverse()},T=function(e,t){if(Array.isArray(e)&&e.length){for(var n=0;n<e.length;n+=1)if(e[n][t])return!0}return!1},P=function(e){return Array.isArray(e)?e.join(""):e},A=function(e,t){return Array.isArray(e)?e.reduce(function(e,n){return!function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.default.push(n):e.priority.push(n),e},{priority:[],default:[]}):{default:e}},O=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},L=[g.NOSCRIPT,g.SCRIPT,g.STYLE],j=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")},N=function(e){return Object.keys(e).reduce(function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r},"")},R=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce(function(t,n){return t[w[n]||n]=e[n],t},t)},I=function(e,t){return t.map(function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach(function(e){var n=w[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]}),r.createElement(e,o)})},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){var e,n,a,o;return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=R(n,a),[r.createElement(g.TITLE,o,e)]},toString:function(){var r,a,o,i;return r=t.title,a=t.titleAttributes,o=N(a),i=P(r),o?"<"+e+' data-rh="true" '+o+">"+j(i,n)+"</"+e+">":"<"+e+' data-rh="true">'+j(i,n)+"</"+e+">"}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return R(t)},toString:function(){return N(t)}};default:return{toComponent:function(){return I(e,t)},toString:function(){return t.reduce(function(t,r){var a=Object.keys(r).filter(function(e){return"innerHTML"!==e&&"cssText"!==e}).reduce(function(e,t){var a=void 0===r[t]?t:t+'="'+j(r[t],n)+'"';return e?e+" "+a:a},""),o=r.innerHTML||r.cssText||"",i=-1===L.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")},"")}}}},D=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=e.titleAttributes,u=e.linkTags,c=e.metaTags,d=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var p,m,h,k,w,x,S=(p=e.linkTags,m=e.scriptTags,h=e.encode,k=A(e.metaTags,v),w=A(p,b),x=A(m,y),{priorityMethods:{toComponent:function(){return[].concat(I(g.META,k.priority),I(g.LINK,w.priority),I(g.SCRIPT,x.priority))},toString:function(){return F(g.META,k.priority,h)+" "+F(g.LINK,w.priority,h)+" "+F(g.SCRIPT,x.priority,h)}},metaTags:k.default,linkTags:w.default,scriptTags:x.default});f=S.priorityMethods,u=S.linkTags,c=S.metaTags,d=S.scriptTags}return{priority:f,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",a,r),link:F(g.LINK,u,r),meta:F(g.META,c,r),noscript:F(g.NOSCRIPT,o,r),script:F(g.SCRIPT,d,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:void 0===l?"":l,titleAttributes:s},r)}},z=[],M=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=D({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),B=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),U="undefined"!=typeof document,H=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new M(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement($.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);H.canUseDOM=U,H.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},H.defaultProps={context:{}},H.displayName="HelmetProvider";var Q=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach(function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some(function(e,t){return n=t,r.isEqualNode(e)})?o.splice(n,1):i.push(r)}),o.forEach(function(e){return e.parentNode.removeChild(e)}),i.forEach(function(e){return r.appendChild(e)}),{oldTags:o,newTags:i}},Z=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],u=t[s]||"";n.getAttribute(s)!==u&&n.setAttribute(s,u),-1===a.indexOf(s)&&a.push(s);var c=o.indexOf(s);-1!==c&&o.splice(c,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},V=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,u=e.styleTags,c=e.title,d=e.titleAttributes;Z(g.BODY,e.bodyAttributes),Z(g.HTML,r),void 0!==c&&document.title!==c&&(document.title=P(c)),Z(g.TITLE,d);var f={baseTag:Q(g.BASE,n),linkTags:Q(g.LINK,a),metaTags:Q(g.META,o),noscriptTags:Q(g.NOSCRIPT,i),scriptTags:Q(g.SCRIPT,s),styleTags:Q(g.STYLE,u)},p={},m={};Object.keys(f).forEach(function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)}),t&&t(),l(e,p,m)},W=null,q=function(e){function t(){for(var t,n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,a=null,o={baseTag:(e=["href"],(t=n.helmetInstances.get().map(function(e){var t=f({},e.props);return delete t.context,t})).filter(function(e){return void 0!==e[g.BASE]}).map(function(e){return e[g.BASE]}).reverse().reduce(function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t},[])),bodyAttributes:_("bodyAttributes",t),defer:S(t,"defer"),encode:S(t,"encodeSpecialCharacters"),htmlAttributes:_("htmlAttributes",t),linkTags:C(g.LINK,["rel","href"],t),metaTags:C(g.META,["name","charset","http-equiv","property","itemprop"],t),noscriptTags:C(g.NOSCRIPT,["innerHTML"],t),onChangeClientState:S(t,"onChangeClientState")||function(){},scriptTags:C(g.SCRIPT,["src","innerHTML"],t),styleTags:C(g.STYLE,["cssText"],t),title:E(t),titleAttributes:_("titleAttributes",t),prioritizeSeoTags:T(t,"prioritizeSeoTags")};H.canUseDOM?(W&&cancelAnimationFrame(W),o.defer?W=requestAnimationFrame(function(){V(o,function(){W=null})}):(V(o),W=null)):D&&(a=D(o)),r(a)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);q.propTypes={context:B.isRequired},q.displayName="HelmetDispatcher";var G=["children"],Y=["children"],K=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(O(this.props,"helmetData"),O(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case g.BODY:return f({},a,{bodyAttributes:f({},o)});case g.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach(function(t){var r;n=f({},n,((r={})[t]=e[t],r))}),n},n.warnOnInvalidChildren=function(e,t){return u()(k.some(function(t){return e.type===t}),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+k.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),u()(!t||"string"==typeof t||Array.isArray(t)&&!t.some(function(e){return"string"!=typeof e}),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,a={};return r.Children.forEach(e,function(e){if(e&&e.props){var r=e.props,o=r.children,i=h(r,G),l=Object.keys(i).reduce(function(e,t){return e[x[t]||t]=i[t],e},{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,o),s){case g.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}}),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,Y),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof M||(o=new M(o.context,o.instances)),o?r.createElement(q,f({},a,{context:o.value,helmetData:void 0})):r.createElement($.Consumer,null,function(e){return r.createElement(q,f({},a,{context:e}))})},t}(r.Component);K.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},K.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},K.displayName="Helmet"},69921:function(e,t){"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,u=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,k=n?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case c:case d:case o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case u:case f:case g:case h:case s:return e;default:return t}}case a:return t}}}function x(e){return w(e)===d}t.AsyncMode=c,t.ConcurrentMode=d,t.ContextConsumer=u,t.ContextProvider=s,t.Element=r,t.ForwardRef=f,t.Fragment=o,t.Lazy=g,t.Memo=h,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return x(e)||w(e)===c},t.isConcurrentMode=x,t.isContextConsumer=function(e){return w(e)===u},t.isContextProvider=function(e){return w(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return w(e)===f},t.isFragment=function(e){return w(e)===o},t.isLazy=function(e){return w(e)===g},t.isMemo=function(e){return w(e)===h},t.isPortal=function(e){return w(e)===a},t.isProfiler=function(e){return w(e)===l},t.isStrictMode=function(e){return w(e)===i},t.isSuspense=function(e){return w(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===s||e.$$typeof===u||e.$$typeof===f||e.$$typeof===y||e.$$typeof===v||e.$$typeof===k||e.$$typeof===b)},t.typeOf=w},59864:function(e,t,n){"use strict";e.exports=n(69921)},68356:function(e,t,n){"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return(i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}var l=n(67294),s=[],u=[],c=l.createContext(null);function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then(function(e){return n.loading=!1,n.loaded=e,e}).catch(function(e){throw n.loading=!1,n.error=e,e}),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach(function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.promise.then(function(e){t.loaded[r]=e}).catch(function(e){t.error=e})})}catch(e){t.error=e}return t.promise=Promise.all(n).then(function(e){return t.loading=!1,e}).catch(function(e){throw t.loading=!1,e}),t}function p(e,t){return l.createElement(e&&e.__esModule?e.default:e,t)}function m(e,t){if(!t.loading)throw Error("react-loadable requires a `loading` component");var d,f,m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return s.push(g),"function"==typeof m.webpack&&u.push(function(){if((0,m.webpack)().every(function(e){return void 0!==e&&void 0!==n.m[e]}))return g()}),f=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()}),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context&&Array.isArray(m.modules)&&m.modules.forEach(function(t){e.context.report(t)}),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout(function(){t({pastDelay:!0})},m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout(function(){t({timedOut:!0})},m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then(function(){return n(),null}).catch(function(e){return n(),null})}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextType",c),f}function h(e){return m(d,e)}function g(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then(function(){if(e.length)return g(e)})}h.Map=function(e){if("function"!=typeof e.render)throw Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)},h.Capture=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return l.createElement(c.Provider,{value:{report:this.props.report}},l.Children.only(this.props.children))},t}(l.Component),h.preloadAll=function(){return new Promise(function(e,t){g(s).then(e,t)})},h.preloadReady=function(){return new Promise(function(e,t){g(u).then(e,e)})},e.exports=h},18790:function(e,t,n){"use strict";n.d(t,{H:()=>i,f:()=>function e(t,n,a){return void 0===a&&(a=[]),t.some(function(t){var o=t.path?(0,r.LX)(n,t):a.length?a[a.length-1].match:r.F0.computeRootMatch(n);return o&&(a.push({route:t,match:o}),t.routes&&e(t.routes,n,a)),o}),a}});var r=n(16550),a=n(16019),o=n(67294);function i(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.rs,n,e.map(function(e,n){return o.createElement(r.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.Z)({},n,t,{route:e}))}})})):null}},73727:function(e,t,n){"use strict";n.d(t,{OL:()=>k,UT:()=>d,VK:()=>c,rU:()=>b});var r=n(16550),a=n(35091),o=n(67294),i=n(31381),l=n(16019),s=n(70443),u=n(21835),c=function(e){function t(){for(var t,n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.lX)(t.props),t}return(0,a.Z)(t,e),t.prototype.render=function(){return o.createElement(r.F0,{history:this.history,children:this.props.children})},t}(o.Component),d=function(e){function t(){for(var t,n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.q_)(t.props),t}return(0,a.Z)(t,e),t.prototype.render=function(){return o.createElement(r.F0,{history:this.history,children:this.props.children})},t}(o.Component),f=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},m=function(e){return e},h=o.forwardRef;void 0===h&&(h=m);var g=h(function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,s.Z)(e,["innerRef","navigate","onClick"]),u=i.target,c=(0,l.Z)({},i,{onClick:function(e){try{a&&a(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||u&&"_self"!==u||e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||(e.preventDefault(),r())}});return m!==h?c.ref=t||n:c.ref=n,o.createElement("a",c)}),b=h(function(e,t){var n=e.component,a=void 0===n?g:n,c=e.replace,d=e.to,b=e.innerRef,y=(0,s.Z)(e,["component","replace","to","innerRef"]);return o.createElement(r.s6.Consumer,null,function(e){e||(0,u.Z)(!1);var n=e.history,r=p(f(d,e.location),e.location),s=r?n.createHref(r):"",g=(0,l.Z)({},y,{href:s,navigate:function(){var t=f(d,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(p(t));(c||r?n.replace:n.push)(t)}});return m!==h?g.ref=t||b:g.innerRef=b,o.createElement(a,g)})}),y=function(e){return e},v=o.forwardRef;void 0===v&&(v=y);var k=v(function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,c=void 0===i?"active":i,d=e.activeStyle,m=e.className,h=e.exact,g=e.isActive,k=e.location,w=e.sensitive,x=e.strict,S=e.style,E=e.to,_=e.innerRef,C=(0,s.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.s6.Consumer,null,function(e){e||(0,u.Z)(!1);var n=k||e.location,i=p(f(E,n),n),s=i.pathname,T=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),P=T?(0,r.LX)(n.pathname,{path:T,exact:h,sensitive:w,strict:x}):null,A=!!(g?g(P,n):P),O="function"==typeof m?m(A):m,L="function"==typeof S?S(A):S;A&&(O=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter(function(e){return e}).join(" ")}(O,c),L=(0,l.Z)({},L,d));var j=(0,l.Z)({"aria-current":A&&a||null,className:O,style:L,to:i},C);return y!==v?j.ref=t||_:j.innerRef=_,o.createElement(b,j)})})},16550:function(e,t,n){"use strict";n.d(t,{AW:()=>k,F0:()=>g,LX:()=>v,TH:()=>E,k6:()=>S,rs:()=>w,s6:()=>h});var r=n(35091),a=n(67294),o=n(45697),i=n.n(o),l=(n(31381),n(21835)),s=n(16019),u=n(14779),c=n.n(u);n(59864),n(70443),n(8679);var d="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{},f=a.createContext||function(e,t){var n,o,l="__create-react-context-"+(d.__global_unique_id__=(d.__global_unique_id__||0)+1)+"__",s=function(e){function n(){for(var t,n,r,a=arguments.length,o=Array(a),i=0;i<a;i++)o[i]=arguments[i];return n=(t=e.call.apply(e,[this].concat(o))||this).props.value,r=[],t.emitter={on:function(e){r.push(e)},off:function(e){r=r.filter(function(t){return t!==e})},get:function(){return n},set:function(e,t){n=e,r.forEach(function(e){return e(n,t)})}},t}(0,r.Z)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;(r===a?0!==r||1/r==1/a:r!=r&&a!=a)?n=0:0!=(n=("function"==typeof t?t(r,a):0x3fffffff)|0)&&this.emitter.set(e.value,n)}},a.render=function(){return this.props.children},n}(a.Component);(n={})[l]=i().object.isRequired,s.childContextTypes=n;var u=function(t){function n(){for(var e,n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){((0|e.observedBits)&n)!=0&&e.setState({value:e.getValue()})},e}(0,r.Z)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?0x3fffffff:t},a.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?0x3fffffff:e},a.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},a.getValue=function(){return this.context[l]?this.context[l].get():e},a.render=function(){var e;return(Array.isArray(e=this.props.children)?e[0]:e)(this.state.value)},n}(a.Component);return(o={})[l]=i().object,u.contextTypes=o,{Provider:s,Consumer:u}},p=function(e){var t=f();return t.displayName=e,t},m=p("Router-History"),h=p("Router"),g=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen(function(e){n._pendingLocation=e})),n}(0,r.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen(function(t){e._isMounted&&e.setState({location:t})})),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return a.createElement(h.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(m.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component,a.Component;var b={},y=0;function v(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,a=n.exact,o=void 0!==a&&a,i=n.strict,l=void 0!==i&&i,s=n.sensitive,u=void 0!==s&&s;return[].concat(r).reduce(function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=b[n]||(b[n]={});if(r[e])return r[e];var a=[],o={regexp:c()(e,a,t),keys:a};return y<1e4&&(r[e]=o,y++),o}(n,{end:o,strict:l,sensitive:u}),a=r.regexp,i=r.keys,s=a.exec(e);if(!s)return null;var d=s[0],f=s.slice(1),p=e===d;return o&&!p?null:{path:n,url:"/"===n&&""===d?"/":d,isExact:p,params:i.reduce(function(e,t,n){return e[t.name]=f[n],e},{})}},null)}var k=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(h.Consumer,null,function(t){t||(0,l.Z)(!1);var n,r=e.props.location||t.location,o=e.props.computedMatch?e.props.computedMatch:e.props.path?v(r.pathname,e.props):t.match,i=(0,s.Z)({},t,{location:r,match:o}),u=e.props,c=u.children,d=u.component,f=u.render;return Array.isArray(c)&&(n=c,0===a.Children.count(n))&&(c=null),a.createElement(h.Provider,{value:i},i.match?c?"function"==typeof c?c(i):c:d?a.createElement(d,i):f?f(i):null:"function"==typeof c?c(i):null)})},t}(a.Component);a.Component;var w=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(h.Consumer,null,function(t){t||(0,l.Z)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?v(o.pathname,(0,s.Z)({},e.props,{path:i})):t.match}}),r?a.cloneElement(n,{location:o,computedMatch:r}):null})},t}(a.Component),x=a.useContext;function S(){return x(m)}function E(){return x(h).location}},80631:function(e,t){"use strict";var n=Symbol.for("react.transitional.element");function r(e,t,r){var a=null;if(void 0!==r&&(a=""+r),void 0!==t.key&&(a=""+t.key),"key"in t)for(var o in r={},t)"key"!==o&&(r[o]=t[o]);else r=t;return{$$typeof:n,type:e,key:a,ref:void 0!==(t=r.ref)?t:null,props:r}}t.Fragment=Symbol.for("react.fragment"),t.jsx=r,t.jsxs=r},48405:function(e,t){"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),l=Symbol.for("react.consumer"),s=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator,m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var k=v.prototype=new y;k.constructor=v,h(k,b.prototype),k.isPureReactComponent=!0;var w=Array.isArray,x={H:null,A:null,T:null,S:null,V:null},S=Object.prototype.hasOwnProperty;function E(e,t,r,a,o,i){return{$$typeof:n,type:e,key:t,ref:void 0!==(r=i.ref)?r:null,props:i}}function _(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var C=/\/+/g;function T(e,t){var n,r;return"object"==typeof e&&null!==e&&null!=e.key?(n=""+e.key,r={"=":"=0",":":"=2"},"$"+n.replace(/[=:]/g,function(e){return r[e]})):t.toString(36)}function P(){}function A(e,t,a){if(null==e)return e;var o=[],i=0;return!function e(t,a,o,i,l){var s,u,c,d=typeof t;("undefined"===d||"boolean"===d)&&(t=null);var m=!1;if(null===t)m=!0;else switch(d){case"bigint":case"string":case"number":m=!0;break;case"object":switch(t.$$typeof){case n:case r:m=!0;break;case f:return e((m=t._init)(t._payload),a,o,i,l)}}if(m)return l=l(t),m=""===i?"."+T(t,0):i,w(l)?(o="",null!=m&&(o=m.replace(C,"$&/")+"/"),e(l,a,o,"",function(e){return e})):null!=l&&(_(l)&&(s=l,u=o+(null==l.key||t&&t.key===l.key?"":(""+l.key).replace(C,"$&/")+"/")+m,l=E(s.type,u,void 0,void 0,void 0,s.props)),a.push(l)),1;m=0;var h=""===i?".":i+":";if(w(t))for(var g=0;g<t.length;g++)d=h+T(i=t[g],g),m+=e(i,a,o,d,l);else if("function"==typeof(g=null===(c=t)||"object"!=typeof c?null:"function"==typeof(c=p&&c[p]||c["@@iterator"])?c:null))for(t=g.call(t),g=0;!(i=t.next()).done;)d=h+T(i=i.value,g++),m+=e(i,a,o,d,l);else if("object"===d){if("function"==typeof t.then)return e(function(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch("string"==typeof e.status?e.then(P,P):(e.status="pending",e.then(function(t){"pending"===e.status&&(e.status="fulfilled",e.value=t)},function(t){"pending"===e.status&&(e.status="rejected",e.reason=t)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}(t),a,o,i,l);throw Error("Objects are not valid as a React child (found: "+("[object Object]"===(a=String(t))?"object with keys {"+Object.keys(t).join(", ")+"}":a)+"). If you meant to render a collection of children, use an array instead.")}return m}(e,o,"","",function(e){return t.call(a,e,i++)}),o}function O(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){(0===e._status||-1===e._status)&&(e._status=1,e._result=t)},function(t){(0===e._status||-1===e._status)&&(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var L="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function j(){}t.Children={map:A,forEach:function(e,t,n){A(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return A(e,function(){t++}),t},toArray:function(e){return A(e,function(e){return e})||[]},only:function(e){if(!_(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=a,t.Profiler=i,t.PureComponent=v,t.StrictMode=o,t.Suspense=c,t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=x,t.__COMPILER_RUNTIME={__proto__:null,c:function(e){return x.H.useMemoCache(e)}},t.cache=function(e){return function(){return e.apply(null,arguments)}},t.cloneElement=function(e,t,n){if(null==e)throw Error("The argument must be a React element, but you passed "+e+".");var r=h({},e.props),a=e.key,o=void 0;if(null!=t)for(i in void 0!==t.ref&&(o=void 0),void 0!==t.key&&(a=""+t.key),t)S.call(t,i)&&"key"!==i&&"__self"!==i&&"__source"!==i&&("ref"!==i||void 0!==t.ref)&&(r[i]=t[i]);var i=arguments.length-2;if(1===i)r.children=n;else if(1<i){for(var l=Array(i),s=0;s<i;s++)l[s]=arguments[s+2];r.children=l}return E(e.type,a,void 0,void 0,o,r)},t.createContext=function(e){return(e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:l,_context:e},e},t.createElement=function(e,t,n){var r,a={},o=null;if(null!=t)for(r in void 0!==t.key&&(o=""+t.key),t)S.call(t,r)&&"key"!==r&&"__self"!==r&&"__source"!==r&&(a[r]=t[r]);var i=arguments.length-2;if(1===i)a.children=n;else if(1<i){for(var l=Array(i),s=0;s<i;s++)l[s]=arguments[s+2];a.children=l}if(e&&e.defaultProps)for(r in i=e.defaultProps)void 0===a[r]&&(a[r]=i[r]);return E(e,o,void 0,void 0,null,a)},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=_,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:O}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=x.T,n={};x.T=n;try{var r=e(),a=x.S;null!==a&&a(n,r),"object"==typeof r&&null!==r&&"function"==typeof r.then&&r.then(j,L)}catch(e){L(e)}finally{x.T=t}},t.unstable_useCacheRefresh=function(){return x.H.useCacheRefresh()},t.use=function(e){return x.H.use(e)},t.useActionState=function(e,t,n){return x.H.useActionState(e,t,n)},t.useCallback=function(e,t){return x.H.useCallback(e,t)},t.useContext=function(e){return x.H.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e,t){return x.H.useDeferredValue(e,t)},t.useEffect=function(e,t,n){var r=x.H;if("function"==typeof n)throw Error("useEffect CRUD overload is not enabled in this build of React.");return r.useEffect(e,t)},t.useId=function(){return x.H.useId()},t.useImperativeHandle=function(e,t,n){return x.H.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return x.H.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return x.H.useLayoutEffect(e,t)},t.useMemo=function(e,t){return x.H.useMemo(e,t)},t.useOptimistic=function(e,t){return x.H.useOptimistic(e,t)},t.useReducer=function(e,t,n){return x.H.useReducer(e,t,n)},t.useRef=function(e){return x.H.useRef(e)},t.useState=function(e){return x.H.useState(e)},t.useSyncExternalStore=function(e,t,n){return x.H.useSyncExternalStore(e,t,n)},t.useTransition=function(){return x.H.useTransition()},t.version="19.1.0"},67294:function(e,t,n){"use strict";e.exports=n(48405)},85893:function(e,t,n){"use strict";e.exports=n(80631)},56152:function(e,t){"use strict";function n(e,t){var n=e.length;for(e.push(t);0<n;){var r=n-1>>>1,a=e[r];if(0<o(a,t))e[r]=t,e[n]=a,n=r;else break}}function r(e){return 0===e.length?null:e[0]}function a(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;for(var r=0,a=e.length,i=a>>>1;r<i;){var l=2*(r+1)-1,s=e[l],u=l+1,c=e[u];if(0>o(s,n))u<a&&0>o(c,s)?(e[r]=c,e[u]=n,r=u):(e[r]=s,e[l]=n,r=l);else if(u<a&&0>o(c,n))e[r]=c,e[u]=n,r=u;else break}}return t}function o(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"==typeof performance&&"function"==typeof performance.now){var i,l=performance;t.unstable_now=function(){return l.now()}}else{var s=Date,u=s.now();t.unstable_now=function(){return s.now()-u}}var c=[],d=[],f=1,p=null,m=3,h=!1,g=!1,b=!1,y=!1,v="function"==typeof setTimeout?setTimeout:null,k="function"==typeof clearTimeout?clearTimeout:null,w="undefined"!=typeof setImmediate?setImmediate:null;function x(e){for(var t=r(d);null!==t;){if(null===t.callback)a(d);else if(t.startTime<=e)a(d),t.sortIndex=t.expirationTime,n(c,t);else break;t=r(d)}}function S(e){if(b=!1,x(e),!g)if(null!==r(c))g=!0,E||(E=!0,i());else{var t=r(d);null!==t&&j(S,t.startTime-e)}}var E=!1,_=-1,C=5,T=-1;function P(){return!!y||!(t.unstable_now()-T<C)}function A(){if(y=!1,E){var e=t.unstable_now();T=e;var n=!0;try{e:{g=!1,b&&(b=!1,k(_),_=-1),h=!0;var o=m;try{t:{for(x(e),p=r(c);null!==p&&!(p.expirationTime>e&&P());){var l=p.callback;if("function"==typeof l){p.callback=null,m=p.priorityLevel;var s=l(p.expirationTime<=e);if(e=t.unstable_now(),"function"==typeof s){p.callback=s,x(e),n=!0;break t}p===r(c)&&a(c),x(e)}else a(c);p=r(c)}if(null!==p)n=!0;else{var u=r(d);null!==u&&j(S,u.startTime-e),n=!1}}break e}finally{p=null,m=o,h=!1}}}finally{n?i():E=!1}}}if("function"==typeof w)i=function(){w(A)};else if("undefined"!=typeof MessageChannel){var O=new MessageChannel,L=O.port2;O.port1.onmessage=A,i=function(){L.postMessage(null)}}else i=function(){v(A,0)};function j(e,n){_=v(function(){e(t.unstable_now())},n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):C=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return m},t.unstable_next=function(e){switch(m){case 1:case 2:case 3:var t=3;break;default:t=m}var n=m;m=t;try{return e()}finally{m=n}},t.unstable_requestPaint=function(){y=!0},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=m;m=e;try{return t()}finally{m=n}},t.unstable_scheduleCallback=function(e,a,o){var l=t.unstable_now();switch(o="object"==typeof o&&null!==o&&"number"==typeof(o=o.delay)&&0<o?l+o:l,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=0x3fffffff;break;case 4:s=1e4;break;default:s=5e3}return s=o+s,e={id:f++,callback:a,priorityLevel:e,startTime:o,expirationTime:s,sortIndex:-1},o>l?(e.sortIndex=o,n(d,e),null===r(c)&&e===r(d)&&(b?(k(_),_=-1):b=!0,j(S,o-l))):(e.sortIndex=s,n(c,e),g||h||(g=!0,E||(E=!0,i()))),e},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(e){var t=m;return function(){var n=m;m=t;try{return e.apply(this,arguments)}finally{m=n}}}},63840:function(e,t,n){"use strict";e.exports=n(56152)},96774:function(e){e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var u=o[s];if(!l(u))return!1;var c=e[u],d=t[u];if(!1===(a=n?n.call(r,c,d,u):void 0)||void 0===a&&c!==d)return!1}return!0}},75150:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>r});let r={future:{v4:{removeLegacyPostBuildHeadAttribute:!0,useCssCascadeLayers:!1},experimental_faster:{ssgWorkerThreads:!0,rspackBundler:!0,rspackPersistentCache:!0,swcJsLoader:!1,swcJsMinimizer:!1,swcHtmlMinimizer:!1,lightningCssMinimizer:!1,mdxCrossCompilerCache:!1},experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},title:"Multi-Scrobbler",tagline:"Scrobble all the things",favicon:"img/favicon.ico",url:"https://foxxmd.github.io",baseUrl:"/multi-scrobbler/",organizationName:"foxxmd",projectName:"multi-scrobbler",trailingSlash:!0,onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},scripts:[{src:"https://ry.foxxmd.dev/api/script.js",defer:!0,"data-site-id":"3","data-session-replay":"true"}],presets:[["classic",{docs:{sidebarPath:"./sidebars.ts",routeBasePath:"/",editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/"},blog:!1,theme:{customCss:"./src/css/custom.css"}}]],themes:["docusaurus-json-schema-plugin",["@easyops-cn/docusaurus-search-local",{hashed:!0,indexBlog:!1,docsRouteBasePath:"/"}],"docusaurus-theme-github-codeblock"],plugins:[["@docusaurus/plugin-client-redirects",{redirects:[{to:"/configuration",from:"/docs/configuration"},{to:"/configuration/kitchensink",from:"/docs/configuration/kitchensink"},{to:"/installation",from:"/docs/installation"},{to:"/quickstart",from:"/docs/quickstart"},{to:"/FAQ",from:"/docs/FAQ"},{to:"/",from:"/docs"}]}]],themeConfig:{image:"img/icon.png",navbar:{title:"Multi-Scrobbler",hideOnScroll:!0,logo:{alt:"Logo",src:"img/icon.svg",height:40},items:[{type:"docSidebar",sidebarId:"tutorialSidebar",position:"left",label:"Docs"},{to:"playground",position:"left",label:"Config Playground"},{href:"https://github.com/foxxmd/multi-scrobbler",label:"GitHub",position:"right"},{href:"https://foxxmd.github.io/multi-scrobbler/",label:"Website",position:"right"}]},footer:{style:"dark",links:[{title:"Docs",items:[{label:"Overview",to:"/"},{label:"Installation",to:"/installation"},{label:"Configuration",to:"/configuration"},{label:"Development",to:"/development/dev-common"}]},{title:"More",items:[{label:"GitHub",href:"https://github.com/foxxmd/multi-scrobbler"},{label:"Website",href:"https://foxxmd.github.io/multi-scrobbler/"}]}],copyright:"Copyright \xa9 2026 Multi-Scrobbler. Built with Docusaurus."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["json","json5","typescript","docker","bash","ini","diff"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"dark",disableSwitch:!1,respectPrefersColorScheme:!1},codeblock:{showGithubLink:!0,githubLinkLabel:"View on GitHub",showRunmeLink:!1,runmeLinkLabel:"Checkout via Runme"},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},headTags:[{tagName:"meta",attributes:{name:"google-site-verification",content:"8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"}}],baseUrlIssueBanner:!0,onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},16019:function(e,t,n){"use strict";function r(){return(r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(null,arguments)}n.d(t,{Z:()=>r})},35091:function(e,t,n){"use strict";function r(e,t){return(r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{Z:()=>a})},70443:function(e,t,n){"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if(({}).hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}n.d(t,{Z:()=>r})},67026:function(e,t,n){"use strict";n.d(t,{Z:()=>r});let r=function(){for(var e,t,n=0,r="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=function e(t){var n,r,a="";if("string"==typeof t||"number"==typeof t)a+=t;else if("object"==typeof t)if(Array.isArray(t)){var o=t.length;for(n=0;n<o;n++)t[n]&&(r=e(t[n]))&&(a&&(a+=" "),a+=r)}else for(r in t)t[r]&&(a&&(a+=" "),a+=r);return a}(e))&&(r&&(r+=" "),r+=t);return r}},83229:function(e,t,n){"use strict";let r,a,o,i,l;n.d(t,{p1:()=>U,y$:()=>ev});var s,u,c,d,f,p,m,h,g,b,y,v,k,w,x,S,E,_,C=n(67294),T=n(67026),P=Object.create,A=Object.defineProperty,O=Object.defineProperties,L=Object.getOwnPropertyDescriptor,j=Object.getOwnPropertyDescriptors,N=Object.getOwnPropertyNames,R=Object.getOwnPropertySymbols,I=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty,D=Object.prototype.propertyIsEnumerable,z=(e,t,n)=>t in e?A(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,M=(e,t)=>{for(var n in t||(t={}))F.call(t,n)&&z(e,n,t[n]);if(R)for(var n of R(t))D.call(t,n)&&z(e,n,t[n]);return e},$=(e,t)=>O(e,j(t)),B=(e,t)=>{var n={};for(var r in e)F.call(e,r)&&0>t.indexOf(r)&&(n[r]=e[r]);if(null!=e&&R)for(var r of R(e))0>t.indexOf(r)&&D.call(e,r)&&(n[r]=e[r]);return n},U=(l=null!=(o=(r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var a,o;switch(n=n||{},r.util.type(t)){case"Object":if(n[o=r.util.objId(t)])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":if(n[o=r.util.objId(t)])return n[o];return a=[],n[o]=a,t.forEach(function(t,r){a[r]=e(t,n)}),a;default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var a=e.classList;if(a.contains(t))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var u=a[e];return a[e]=i,r.languages.DFS(r.languages,function(t,n){n===u&&t!=e&&(this[t]=i)}),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var s=t[l],u=r.util.type(s);"Object"!==u||o[i(s)]?"Array"!==u||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",o),!o.grammar)throw Error('The language "'+o.language+'" has no grammar.');return o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var s in n)t[s]=n[s];delete t.rest}var u=new i;return l(u,u.head,e),function e(t,n,i,s,u,c){for(var d in i)if(i.hasOwnProperty(d)&&i[d]){var f=i[d];f=Array.isArray(f)?f:[f];for(var p=0;p<f.length;++p){if(c&&c.cause==d+","+p)return;var m=f[p],h=m.inside,g=!!m.lookbehind,b=!!m.greedy,y=m.alias;if(b&&!m.pattern.global){var v=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,v+"g")}for(var k=m.pattern||m,w=s.next,x=u;w!==n.tail&&(!c||!(x>=c.reach));x+=w.value.length,w=w.next){var S,E=w.value;if(n.length>t.length)return;if(!(E instanceof a)){var _=1;if(b){if(!(S=o(k,x,t,g))||S.index>=t.length)break;var C=S.index,T=S.index+S[0].length,P=x;for(P+=w.value.length;C>=P;)P+=(w=w.next).value.length;if(P-=w.value.length,x=P,w.value instanceof a)continue;for(var A=w;A!==n.tail&&(P<T||"string"==typeof A.value);A=A.next)_++,P+=A.value.length;_--,E=t.slice(x,P),S.index-=x}else if(!(S=o(k,0,E,g)))continue;var C=S.index,O=S[0],L=E.slice(0,C),j=E.slice(C+O.length),N=x+E.length;c&&N>c.reach&&(c.reach=N);var R=w.prev;if(L&&(R=l(n,R,L),x+=L.length),function(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}(n,R,_),w=l(n,R,new a(d,h?r.tokenize(O,h):O,y,O)),j&&l(n,w,j),_>1){var I={cause:d+","+p,reach:N};e(t,n,i,w.prev,x,I),c&&I.reach>c.reach&&(c.reach=I.reach)}}}}}}(e,u,t,u.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(u)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach(function(t){a+=e(t,n)}),a}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,"&quot;")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}();t.exports=n,n.default=n}},function(){return a||(0,r[N(r)[0]])((a={exports:{}}).exports,a),a.exports})())?P(I(o)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of N(t))F.call(e,a)||a===n||A(e,a,{get:()=>t[a],enumerable:!(r=L(t,a))||r.enumerable});return e})(!i&&o&&o.__esModule?l:A(l,"default",{value:o,enumerable:!0}),o));U.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},U.languages.markup.tag.inside["attr-value"].inside.entity=U.languages.markup.entity,U.languages.markup.doctype.inside["internal-subset"].inside=U.languages.markup,U.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,"&"))}),Object.defineProperty(U.languages.markup.tag,"addInlined",{value:function(e,t){var n={},n=(n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:U.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}),t=(n["language-"+t]={pattern:/[\s\S]+/,inside:U.languages[t]},{});t[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},U.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(U.languages.markup.tag,"addAttribute",{value:function(e,t){U.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:U.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),U.languages.html=U.languages.markup,U.languages.mathml=U.languages.markup,U.languages.svg=U.languages.markup,U.languages.xml=U.languages.extend("markup",{}),U.languages.ssml=U.languages.xml,U.languages.atom=U.languages.xml,U.languages.rss=U.languages.xml,s={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},c=RegExp((c="(?:[^\\\\-]|"+(u=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/).source+")")+"-"+c),d={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"},U.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:c,inside:{escape:u,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":s,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:u}},"special-escape":s,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":d}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:u,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":d}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}},U.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},U.languages.javascript=U.languages.extend("clike",{"class-name":[U.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),U.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,U.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:U.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:U.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:U.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:U.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:U.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),U.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:U.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),U.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),U.languages.markup&&(U.languages.markup.tag.addInlined("script","javascript"),U.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),U.languages.js=U.languages.javascript,U.languages.actionscript=U.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),U.languages.actionscript["class-name"].alias="function",delete U.languages.actionscript.parameter,delete U.languages.actionscript["literal-property"],U.languages.markup&&U.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:U.languages.markup}}),f=/#(?!\{).+/,p={pattern:/#\{[^}]+\}/,alias:"variable"},U.languages.coffeescript=U.languages.extend("javascript",{comment:f,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:p}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),U.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:f,interpolation:p}}}),U.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:U.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:p}}]}),U.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete U.languages.coffeescript["template-string"],U.languages.coffee=U.languages.coffeescript,Object.defineProperty(m=U.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/},"addSupport",{value:function(e,t){(e="string"==typeof e?[e]:e).forEach(function(e){var n=function(e){e.inside||(e.inside={}),e.inside.rest=t},r="doc-comment";if(a=U.languages[e]){var a,o=a[r];if((o=o||(a=U.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[r])instanceof RegExp&&(o=a[r]={pattern:o}),Array.isArray(o))for(var i=0,l=o.length;i<l;i++)o[i]instanceof RegExp&&(o[i]={pattern:o[i]}),n(o[i]);else n(o)}})}}),m.addSupport(["java","javascript","php"],m),h=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,U.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+h.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+h.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+h.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+h.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:h,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},U.languages.css.atrule.inside.rest=U.languages.css,(h=U.languages.markup)&&(h.tag.addInlined("style","css"),h.tag.addAttribute("style","css")),g=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,U.languages.css.selector={pattern:U.languages.css.selector.pattern,lookbehind:!0,inside:g={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+g.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[g,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},U.languages.css.atrule.inside["selector-function-argument"].inside=g,U.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),g={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},b={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},U.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:g,number:b,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:g,number:b}),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ ]+"+t.source+")?|"+t.source+"(?:[ ]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){return t=(t||"").replace(/m/g,"")+"m",RegExp(/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,function(){return r}).replace(/<<value>>/g,function(){return e}),t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,function(){return r}).replace(/<<key>>/g,function(){return"(?:"+a+"|"+o+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(U),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,function(){return t}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return r}),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(t){["url","bold","italic","strike","code-snippet"].forEach(function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])})}),e.hooks.add("after-tokenize",function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var a,o=t[n];"code"!==o.type?e(o.content):(a=o.content[1],o=o.content[3],a&&o&&"code-language"===a.type&&"code-block"===o.type&&"string"==typeof a.content&&(a=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),a="language-"+(a=(/[a-z][\w-]*/i.exec(a)||[""])[0].toLowerCase()),o.alias?"string"==typeof o.alias?o.alias=[o.alias,a]:o.alias.push(a):o.alias=[a]))}}(e.tokens)}),e.hooks.add("wrap",function(t){if("code-block"===t.type){for(var n,r="",a=0,o=t.classes.length;a<o;a++){var u=t.classes[a],u=/language-(.+)/.exec(u);if(u){r=u[1];break}}var c,d=e.languages[r];d?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,function(e,t){return"#"===(t=t.toLowerCase())[0]?s("x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1))):l[t]||e}),d,r):r&&"none"!==r&&e.plugins.autoloader&&(c="md-"+new Date().valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(r,function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[r],r))}))}}),RegExp(e.languages.markup.tag.pattern.source,"gi")),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(U),U.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:U.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},U.hooks.add("after-tokenize",function(e){if("graphql"===e.language)for(var t=e.tokens.filter(function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type}),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var a=[];if(c(["definition-mutation","punctuation"])&&"("===t[n+1].content){n+=2;var o=d(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=t[n+0];"variable"===i.type&&(f(i,"variable-input"),a.push(i.content))}n=o+1}if(c(["punctuation","property-query"])&&"{"===t[n+0].content&&(f(t[++n+0],"property-mutation"),0<a.length)){var l=d(/^\{$/,/^\}$/);if(-1!==l)for(var s=n;s<l;s++){var u=t[s];"variable"===u.type&&0<=a.indexOf(u.content)&&f(u,"variable-input")}}}}function c(e,r){r=r||0;for(var a=0;a<e.length;a++){var o=t[n+(a+r)];if(!o||o.type!==e[a])return}return 1}function d(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l){if(e.test(l))a++;else if(r.test(l)&&0==--a)return o}}return -1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}}),U.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var s={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};e.hooks.add("after-tokenize",function(t){t.language in s&&function t(n){for(var i=0,s=n.length;i<s;i++){var u,c,d,f=n[i];"string"!=typeof f&&(Array.isArray(u=f.content)?"template-string"===f.type?(f=u[1],3===u.length&&"string"!=typeof f&&"embedded-code"===f.type&&(c=function e(t){return"string"==typeof t?t:Array.isArray(t)?t.map(e).join(""):e(t.content)}(f),f=Array.isArray(f=f.alias)?f[0]:f,d=e.languages[f])&&(u[1]=function(t,n,i){var s=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),u=0,c={},s=l(s.map(function(e){if("string"==typeof e)return e;for(var n,r,e=e.content;-1!==t.indexOf((r=u++,n="___"+i.toUpperCase()+"_"+r+"___")););return c[n]=e,n}).join(""),n,i),d=Object.keys(c);return u=0,function t(n){for(var o=0;o<n.length;o++){if(u>=d.length)return;var i,s,f,p,m,h,g,b=n[o];"string"==typeof b||"string"==typeof b.content?(i=d[u],-1!==(g=(h="string"==typeof b?b:b.content).indexOf(i))&&(++u,s=h.substring(0,g),m=c[i],f=void 0,(p={})["interpolation-punctuation"]=a,3===(p=e.tokenize(m,p)).length&&((f=[1,1]).push.apply(f,l(p[1],e.languages.javascript,"javascript")),p.splice.apply(p,f)),f=new e.Token("interpolation",p,r.alias,m),p=h.substring(g+i.length),m=[],s&&m.push(s),m.push(f),p&&(t(h=[p]),m.push.apply(m,h)),"string"==typeof b?(n.splice.apply(n,[o,1].concat(m)),o+=m.length-1):b.content=m)):Array.isArray(g=b.content)?t(g):t([g])}}(s),new e.Token(i,s,"language-"+i,t)}(c,d,f))):t(u):"string"!=typeof u&&t([u]))}}(t.tokens)})}(U),U.languages.typescript=U.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),U.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete U.languages.typescript.parameter,delete U.languages.typescript["literal-property"],y=U.languages.extend("typescript",{}),delete y["class-name"],U.languages.typescript["class-name"].inside=y,U.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:y}}}}),U.languages.ts=U.languages.typescript,v=U.languages.javascript,w="(@(?:arg|argument|param|property)\\s+(?:"+(k=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source)+"\\s+)?)",U.languages.jsdoc=U.languages.extend("javadoclike",{parameter:{pattern:RegExp(w+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),U.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(w+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:v,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,function(){return k})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+k),lookbehind:!0,inside:{string:v.string,number:v.number,boolean:v.boolean,keyword:U.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:v,alias:"language-javascript"}}}}),U.languages.javadoclike.addSupport("javascript",U.languages.jsdoc),U.languages.flow=U.languages.extend("javascript",{}),U.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),U.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete U.languages.flow.parameter,U.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(U.languages.flow.keyword)||(U.languages.flow.keyword=[U.languages.flow.keyword]),U.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0}),U.languages.n4js=U.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),U.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),U.languages.n4jsd=U.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var a=n[r],o=e.languages.javascript[a],a=(o="RegExp"===e.util.type(o)?e.languages.javascript[a]={pattern:o}:o).inside||{};(o.inside=a)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(U),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return RegExp(e=e.replace(/<S>/g,function(){return n}).replace(/<BRACES>/g,function(){return r}).replace(/<SPREAD>/g,function(){return a}),t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""};e.hooks.add("after-tokenize",function(t){"jsx"!==t.language&&"tsx"!==t.language||function t(n){for(var r=[],a=0;a<n.length;a++){var o=n[a],l=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<r.length&&r[r.length-1].tagName===i(o.content[0].content[1])&&r.pop():"/>"!==o.content[o.content.length-1].content&&r.push({tagName:i(o.content[0].content[1]),openedBraces:0}):0<r.length&&"punctuation"===o.type&&"{"===o.content?r[r.length-1].openedBraces++:0<r.length&&0<r[r.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?r[r.length-1].openedBraces--:l=!0),(l||"string"==typeof o)&&0<r.length&&0===r[r.length-1].openedBraces&&(l=i(o),a<n.length-1&&("string"==typeof n[a+1]||"plain-text"===n[a+1].type)&&(l+=i(n[a+1]),n.splice(a+1,1)),0<a&&("string"==typeof n[a-1]||"plain-text"===n[a-1].type)&&(l=i(n[a-1])+l,n.splice(a-1,1),a--),n[a]=new e.Token("plain-text",l,null,l)),o.content&&"string"!=typeof o.content&&t(o.content)}}(t.tokens)})}(U),x=U.util.clone(U.languages.typescript),(U.languages.tsx=U.languages.extend("jsx",x),delete U.languages.tsx.parameter,delete U.languages.tsx["literal-property"],x=U.languages.tsx.tag).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+x.pattern.source+")",x.pattern.flags),x.lookbehind=!0,U.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ ]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},U.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=U.languages.swift}),U.languages.kotlin=U.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete U.languages.kotlin["class-name"],S={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:U.languages.kotlin}},U.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:S},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:S},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete U.languages.kotlin.string,U.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),U.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),U.languages.kt=U.languages.kotlin,U.languages.kts=U.languages.kotlin,U.languages.c=U.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),U.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),U.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},U.languages.c.string],char:U.languages.c.char,comment:U.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:U.languages.c}}}}),U.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete U.languages.c.boolean,U.languages.objectivec=U.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete U.languages.objectivec["class-name"],U.languages.objc=U.languages.objectivec,U.languages.reason=U.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),U.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete U.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,function(){return t});t=t.replace(/<self>/g,function(){return/[^\s\S]/.source}),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(U),U.languages.go=U.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),U.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete U.languages.go["class-name"],E=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,_=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,function(){return E.source}),U.languages.cpp=U.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,function(){return E.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:E,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),U.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,function(){return _})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),U.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:U.languages.cpp}}}}),U.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),U.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:U.languages.extend("cpp",{})}}),U.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},U.languages.cpp["base-clause"]),U.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},U.languages.python["string-interpolation"].inside.interpolation.inside.rest=U.languages.python,U.languages.py=U.languages.python,U.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},U.languages.webmanifest=U.languages.json;var H={},Q={dracula:()=>V,duotoneDark:()=>W,duotoneLight:()=>q,github:()=>G,gruvboxMaterialDark:()=>ef,gruvboxMaterialLight:()=>ep,jettwaveDark:()=>es,jettwaveLight:()=>eu,nightOwl:()=>Y,nightOwlLight:()=>K,oceanicNext:()=>ee,okaidia:()=>et,oneDark:()=>ec,oneLight:()=>ed,palenight:()=>en,shadesOfPurple:()=>er,synthwave84:()=>ea,ultramin:()=>eo,vsDark:()=>ei,vsLight:()=>el};for(var Z in Q)A(H,Z,{get:Q[Z],enumerable:!0});var V={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},W={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},q={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},G={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},Y={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},K={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},X="#c5a5c5",J="#8dc891",ee={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:X}},{types:["attr-value"],style:{color:J}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:J}},{types:["punctuation"],style:{color:J}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:X}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},et={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},en={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},er={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},ea={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},eo={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},ei={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},el={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},es={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},eu={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},ec={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},ed={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},ef={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},ep={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},em=/\r\n|\r|\n/,eh=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},eg=(e,t)=>{let n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},eb=e=>{let t=[[]],n=[e],r=[0],a=[e.length],o=0,i=0,l=[],s=[l];for(;i>-1;){for(;(o=r[i]++)<a[i];){let e,u=t[i],c=n[i][o];if("string"==typeof c?(u=i>0?u:["plain"],e=c):(u=eg(u,c.type),c.alias&&(u=eg(u,c.alias)),e=c.content),"string"!=typeof e){i++,t.push(u),n.push(e),r.push(0),a.push(e.length);continue}let d=e.split(em),f=d.length;l.push({types:u,content:d[0]});for(let e=1;e<f;e++)eh(l),s.push(l=[]),l.push({types:u,content:d[e]})}i--,t.pop(),n.pop(),r.pop(),a.pop()}return eh(l),s},ey=({children:e,language:t,code:n,theme:r,prism:a})=>{let o=t.toLowerCase(),i=((e,t)=>{let{plain:n}=e,r=e.styles.reduce((e,n)=>{let{languages:r,style:a}=n;return r&&!r.includes(t)||n.types.forEach(t=>{let n=M(M({},e[t]),a);e[t]=n}),e},{});return r.root=n,r.plain=$(M({},n),{backgroundColor:void 0}),r})(r,o),l=(0,C.useCallback)(e=>{var{className:t,style:n,line:r}=e;let a=$(M({},B(e,["className","style","line"])),{className:(0,T.Z)("token-line",t)});return"object"==typeof i&&"plain"in i&&(a.style=i.plain),"object"==typeof n&&(a.style=M(M({},a.style||{}),n)),a},[i]),s=(e=>{let t=(0,C.useCallback)(({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map(t=>e[t]))},[e]);return(0,C.useCallback)(e=>{var{token:n,className:r,style:a}=e;let o=$(M({},B(e,["token","className","style"])),{className:(0,T.Z)("token",...n.types,r),children:n.content,style:t(n)});return null!=a&&(o.style=M(M({},o.style||{}),a)),o},[t])})(i),u=a.languages[o];return e({tokens:(({prism:e,code:t,grammar:n,language:r})=>(0,C.useMemo)(()=>{if(null==n)return eb([t]);let a={code:t,grammar:n,language:r,tokens:[]};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(t,n),e.hooks.run("after-tokenize",a),eb(a.tokens)},[t,n,r,e]))({prism:a,language:o,code:n,grammar:u}),className:`prism-code language-${o}`,style:null!=i?i.root:{},getLineProps:l,getTokenProps:s})},ev=e=>(0,C.createElement)(ey,$(M({},e),{prism:e.prism||U,theme:e.theme||ei,code:e.code,language:e.language}))},21835:function(e,t,n){"use strict";n.d(t,{Z:()=>r});function r(e,t){if(!e)throw Error("Invariant failed")}},28395:function(e,t,n){"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>I,__assign:()=>o,__asyncDelegator:()=>_,__asyncGenerator:()=>E,__asyncValues:()=>C,__await:()=>S,__awaiter:()=>m,__classPrivateFieldGet:()=>j,__classPrivateFieldIn:()=>R,__classPrivateFieldSet:()=>N,__createBinding:()=>g,__decorate:()=>l,__disposeResources:()=>D,__esDecorate:()=>u,__exportStar:()=>b,__extends:()=>a,__generator:()=>h,__importDefault:()=>L,__importStar:()=>O,__makeTemplateObject:()=>T,__metadata:()=>p,__param:()=>s,__propKey:()=>d,__read:()=>v,__rest:()=>i,__rewriteRelativeImportExtension:()=>z,__runInitializers:()=>c,__setFunctionName:()=>f,__spread:()=>k,__spreadArray:()=>x,__spreadArrays:()=>w,__values:()=>y,default:()=>M});var r=function(e,t){return(r=Object.setPrototypeOf||({__proto__:[]})instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function a(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var o=function(){return(o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}).apply(this,arguments)};function i(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&0>t.indexOf(r)&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,r=Object.getOwnPropertySymbols(e);a<r.length;a++)0>t.indexOf(r[a])&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]]);return n}function l(e,t,n,r){var a,o=arguments.length,i=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var l=e.length-1;l>=0;l--)(a=e[l])&&(i=(o<3?a(i):o>3?a(t,n,i):a(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function s(e,t){return function(n,r){t(n,r,e)}}function u(e,t,n,r,a,o){function i(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var l,s=r.kind,u="getter"===s?"get":"setter"===s?"set":"value",c=!t&&e?r.static?e:e.prototype:null,d=t||(c?Object.getOwnPropertyDescriptor(c,r.name):{}),f=!1,p=n.length-1;p>=0;p--){var m={};for(var h in r)m[h]="access"===h?{}:r[h];for(var h in r.access)m.access[h]=r.access[h];m.addInitializer=function(e){if(f)throw TypeError("Cannot add initializers after decoration has completed");o.push(i(e||null))};var g=(0,n[p])("accessor"===s?{get:d.get,set:d.set}:d[u],m);if("accessor"===s){if(void 0===g)continue;if(null===g||"object"!=typeof g)throw TypeError("Object expected");(l=i(g.get))&&(d.get=l),(l=i(g.set))&&(d.set=l),(l=i(g.init))&&a.unshift(l)}else(l=i(g))&&("field"===s?a.unshift(l):d[u]=l)}c&&Object.defineProperty(c,r.name,d),f=!0}function c(e,t,n){for(var r=arguments.length>2,a=0;a<t.length;a++)n=r?t[a].call(e,n):t[a].call(e);return r?n:void 0}function d(e){return"symbol"==typeof e?e:"".concat(e)}function f(e,t,n){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:n?"".concat(n," ",t):t})}function p(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function m(e,t,n,r){return new(n||(n=Promise))(function(a,o){function i(e){try{s(r.next(e))}catch(e){o(e)}}function l(e){try{s(r.throw(e))}catch(e){o(e)}}function s(e){var t;e.done?a(e.value):((t=e.value)instanceof n?t:new n(function(e){e(t)})).then(i,l)}s((r=r.apply(e,t||[])).next())})}function h(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return i.next=l(0),i.throw=l(1),i.return=l(2),"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(l){return function(s){var u=[l,s];if(n)throw TypeError("Generator is already executing.");for(;i&&(i=0,u[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return o.label++,{value:u[1],done:!1};case 5:o.label++,r=u[1],u=[0];continue;case 7:u=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){o=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){o.label=u[1];break}if(6===u[0]&&o.label<a[1]){o.label=a[1],a=u;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(u);break}a[2]&&o.ops.pop(),o.trys.pop();continue}u=t.call(e,o)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var g=Object.create?function(e,t,n,r){void 0===r&&(r=n);var a=Object.getOwnPropertyDescriptor(t,n);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,a)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]};function b(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||g(t,e,n)}function y(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,a,o=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)i.push(r.value)}catch(e){a={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(a)throw a.error}}return i}function k(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(v(arguments[t]));return e}function w(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;for(var r=Array(e),a=0,t=0;t<n;t++)for(var o=arguments[t],i=0,l=o.length;i<l;i++,a++)r[a]=o[i];return r}function x(e,t,n){if(n||2==arguments.length)for(var r,a=0,o=t.length;a<o;a++)!r&&a in t||(r||(r=Array.prototype.slice.call(t,0,a)),r[a]=t[a]);return e.concat(r||Array.prototype.slice.call(t))}function S(e){return this instanceof S?(this.v=e,this):new S(e)}function E(e,t,n){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var r,a=n.apply(e,t||[]),o=[];return r=Object.create(("function"==typeof AsyncIterator?AsyncIterator:Object).prototype),i("next"),i("throw"),i("return",function(e){return function(t){return Promise.resolve(t).then(e,u)}}),r[Symbol.asyncIterator]=function(){return this},r;function i(e,t){a[e]&&(r[e]=function(t){return new Promise(function(n,r){o.push([e,t,n,r])>1||l(e,t)})},t&&(r[e]=t(r[e])))}function l(e,t){try{var n;(n=a[e](t)).value instanceof S?Promise.resolve(n.value.v).then(s,u):c(o[0][2],n)}catch(e){c(o[0][3],e)}}function s(e){l("next",e)}function u(e){l("throw",e)}function c(e,t){e(t),o.shift(),o.length&&l(o[0][0],o[0][1])}}function _(e){var t,n;return t={},r("next"),r("throw",function(e){throw e}),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,a){t[r]=e[r]?function(t){return(n=!n)?{value:S(e[r](t)),done:!1}:a?a(t):t}:a}}function C(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=y(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise(function(r,a){var o,i,l;o=r,i=a,l=(t=e[n](t)).done,Promise.resolve(t.value).then(function(e){o({value:e,done:l})},i)})}}}function T(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var P=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},A=function(e){return(A=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[t.length]=n);return t})(e)};function O(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n=A(e),r=0;r<n.length;r++)"default"!==n[r]&&g(t,e,n[r]);return P(t,e),t}function L(e){return e&&e.__esModule?e:{default:e}}function j(e,t,n,r){if("a"===n&&!r)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(e):r?r.value:t.get(e)}function N(e,t,n,r,a){if("m"===r)throw TypeError("Private method is not writable");if("a"===r&&!a)throw TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?a.call(e,n):a?a.value=n:t.set(e,n),n}function R(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}function I(e,t,n){if(null!=t){var r,a;if("object"!=typeof t&&"function"!=typeof t)throw TypeError("Object expected.");if(n){if(!Symbol.asyncDispose)throw TypeError("Symbol.asyncDispose is not defined.");r=t[Symbol.asyncDispose]}if(void 0===r){if(!Symbol.dispose)throw TypeError("Symbol.dispose is not defined.");r=t[Symbol.dispose],n&&(a=r)}if("function"!=typeof r)throw TypeError("Object not disposable.");a&&(r=function(){try{a.call(this)}catch(e){return Promise.reject(e)}}),e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t}var F="function"==typeof SuppressedError?SuppressedError:function(e,t,n){var r=Error(n);return r.name="SuppressedError",r.error=e,r.suppressed=t,r};function D(e){function t(t){e.error=e.hasError?new F(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}var n,r=0;return function a(){for(;n=e.stack.pop();)try{if(!n.async&&1===r)return r=0,e.stack.push(n),Promise.resolve().then(a);if(n.dispose){var o=n.dispose.call(n.value);if(n.async)return r|=2,Promise.resolve(o).then(a,function(e){return t(e),a()})}else r|=1}catch(e){t(e)}if(1===r)return e.hasError?Promise.reject(e.error):Promise.resolve();if(e.hasError)throw e.error}()}function z(e,t){return"string"==typeof e&&/^\.\.?\//.test(e)?e.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(e,n,r,a,o){return n?t?".jsx":".js":!r||a&&o?r+a+"."+o.toLowerCase()+"js":e}):e}let M={__extends:a,__assign:o,__rest:i,__decorate:l,__param:s,__esDecorate:u,__runInitializers:c,__propKey:d,__setFunctionName:f,__metadata:p,__awaiter:m,__generator:h,__createBinding:g,__exportStar:b,__values:y,__read:v,__spread:k,__spreadArrays:w,__spreadArray:x,__await:S,__asyncGenerator:E,__asyncDelegator:_,__asyncValues:C,__makeTemplateObject:T,__importStar:O,__importDefault:L,__classPrivateFieldGet:j,__classPrivateFieldSet:N,__classPrivateFieldIn:R,__addDisposableResource:I,__disposeResources:D,__rewriteRelativeImportExtension:z}},62627:function(e){"use strict";e.exports={}},37138:function(e){"use strict";e.exports=JSON.parse('{"/multi-scrobbler/playground/-18f":{"__comp":"0ce74438","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"},"/multi-scrobbler/search/-71d":{"__comp":"1a4e3797","__context":{"plugin":"138e0e15"}},"/multi-scrobbler/-474":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/multi-scrobbler/-4fa":{"__comp":"a7bd4aaa","__props":"7d837a1d"},"/multi-scrobbler/-b5e":{"__comp":"a94703ab"},"/multi-scrobbler/category/development/-626":{"__comp":"14eb3368","__props":"97d34c1a"},"/multi-scrobbler/category/updating/-719":{"__comp":"14eb3368","__props":"4f1fc707"},"/multi-scrobbler/configuration/-230":{"__comp":"17896441","content":"04d926a5"},"/multi-scrobbler/configuration/clients/-099":{"__comp":"17896441","content":"a16703cd"},"/multi-scrobbler/configuration/clients/koito/-bcb":{"__comp":"17896441","content":"f18fd350"},"/multi-scrobbler/configuration/clients/lastfm/-5c9":{"__comp":"17896441","content":"64837553"},"/multi-scrobbler/configuration/clients/listenbrainz/-be2":{"__comp":"17896441","content":"4f7d60c5"},"/multi-scrobbler/configuration/clients/maloja/-dc4":{"__comp":"17896441","content":"cdda7d53"},"/multi-scrobbler/configuration/clients/rocksky/-489":{"__comp":"17896441","content":"e82a470f"},"/multi-scrobbler/configuration/clients/tealfm/-743":{"__comp":"17896441","content":"812e048c"},"/multi-scrobbler/configuration/kitchensink/-7d2":{"__comp":"17896441","content":"e7a53bbd"},"/multi-scrobbler/configuration/sources/-479":{"__comp":"17896441","content":"2a24ad03"},"/multi-scrobbler/configuration/sources/azuracast/-434":{"__comp":"17896441","content":"24a5b6e6"},"/multi-scrobbler/configuration/sources/deezer/-d7a":{"__comp":"17896441","content":"925abbc7"},"/multi-scrobbler/configuration/sources/google-cast/-434":{"__comp":"17896441","content":"72d905a9"},"/multi-scrobbler/configuration/sources/icecast/-dfe":{"__comp":"17896441","content":"8b39be93"},"/multi-scrobbler/configuration/sources/jellyfin/-2fe":{"__comp":"17896441","content":"5a378701"},"/multi-scrobbler/configuration/sources/jriver/-a36":{"__comp":"17896441","content":"498c77bd"},"/multi-scrobbler/configuration/sources/kodi/-ab6":{"__comp":"17896441","content":"d53edd15"},"/multi-scrobbler/configuration/sources/koito-source/-d25":{"__comp":"17896441","content":"202c4968"},"/multi-scrobbler/configuration/sources/lastfm-endpoint/-d0b":{"__comp":"17896441","content":"3827a595"},"/multi-scrobbler/configuration/sources/lastfm-source/-f93":{"__comp":"17896441","content":"9bcab3db"},"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/-b80":{"__comp":"17896441","content":"a93ae359"},"/multi-scrobbler/configuration/sources/listenbrainz-source/-8ff":{"__comp":"17896441","content":"af9480c3"},"/multi-scrobbler/configuration/sources/maloja/-ed2":{"__comp":"17896441","content":"fa357871"},"/multi-scrobbler/configuration/sources/mopidy/-b30":{"__comp":"17896441","content":"5930ad03"},"/multi-scrobbler/configuration/sources/mpd/-e96":{"__comp":"17896441","content":"91a78c9f"},"/multi-scrobbler/configuration/sources/mpris/-751":{"__comp":"17896441","content":"fee59995"},"/multi-scrobbler/configuration/sources/musikcube/-515":{"__comp":"17896441","content":"425b8dd3"},"/multi-scrobbler/configuration/sources/plex/-468":{"__comp":"17896441","content":"1fb61236"},"/multi-scrobbler/configuration/sources/rocksky-source/-c8d":{"__comp":"17896441","content":"08938dd7"},"/multi-scrobbler/configuration/sources/spotify/-0b5":{"__comp":"17896441","content":"778b0fa6"},"/multi-scrobbler/configuration/sources/subsonic/-c34":{"__comp":"17896441","content":"294f31e2"},"/multi-scrobbler/configuration/sources/tealfm-source/-912":{"__comp":"17896441","content":"30829cd8"},"/multi-scrobbler/configuration/sources/vlc/-918":{"__comp":"17896441","content":"41cd626a"},"/multi-scrobbler/configuration/sources/webscrobbler/-3e7":{"__comp":"17896441","content":"9fd2a592"},"/multi-scrobbler/configuration/sources/yamaha-musiccast/-5e1":{"__comp":"17896441","content":"493c00ca"},"/multi-scrobbler/configuration/sources/youtube-music/-e7a":{"__comp":"17896441","content":"2ecbbad4"},"/multi-scrobbler/configuration/transforms/-5d3":{"__comp":"17896441","content":"094000d3"},"/multi-scrobbler/configuration/transforms/musicbrainz/-7d6":{"__comp":"17896441","content":"e6ac3f64"},"/multi-scrobbler/configuration/transforms/native/-57a":{"__comp":"17896441","content":"dfa6d5b1"},"/multi-scrobbler/configuration/transforms/user/-9c5":{"__comp":"17896441","content":"44b2647e"},"/multi-scrobbler/development/dev-client/-d6f":{"__comp":"17896441","content":"07b3b246"},"/multi-scrobbler/development/dev-common/-878":{"__comp":"17896441","content":"c2e935db"},"/multi-scrobbler/development/dev-source/-98f":{"__comp":"17896441","content":"33c4ed3f"},"/multi-scrobbler/development/flatpak/-b8b":{"__comp":"17896441","content":"153c3ceb"},"/multi-scrobbler/FAQ/-07c":{"__comp":"17896441","content":"ad895e75"},"/multi-scrobbler/installation/-371":{"__comp":"17896441","content":"bf69edfb"},"/multi-scrobbler/installation/service/-97c":{"__comp":"17896441","content":"b46f7c12"},"/multi-scrobbler/quickstart/-cfc":{"__comp":"17896441","content":"74876495"},"/multi-scrobbler/updating/-065":{"__comp":"17896441","content":"d3a18f08"},"/multi-scrobbler/-e36":{"__comp":"17896441","content":"4edc808e"}}')}},function(e){e.O(0,["6212"],function(){return e(e.s=32073)}),e.O()}]); 38 + Possible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.`,t),l=!0),null}}(t?.persistence);return null===u?s:{get:()=>{try{return u.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{let t=u.getItem(n);u.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:u})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{let e=u.getItem(n);u.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:u})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{let t=t=>{t.storageArea===u&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(e){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,e),()=>{}}}}}function c(e,t){let[n]=(0,r.useState)(()=>null===e?s:u(e,t)),a=(0,r.useCallback)(e=>"undefined"==typeof window?()=>{}:n.listen(e),[n]);return[(0,r.useSyncExternalStore)(a,()=>n.get(),()=>null),n]}},54234:function(e,t,n){"use strict";n.d(t,{D:()=>c,pe:()=>d});var r=n(67294),a=n(72442),o=n(90095),i=n(73436),l=n(85893);let s=({title:e,siteTitle:t,titleDelimiter:n})=>{let r=e?.trim();return r&&r!==t?`${r} ${n} ${t}`:t},u=(0,r.createContext)(null);function c({formatter:e,children:t}){return(0,l.jsx)(u.Provider,{value:e,children:t})}function d(){let e=function(){let e=(0,r.useContext)(u);if(null===e)throw new i.i6("TitleFormatterProvider");return e}(),{siteConfig:t}=(0,a.default)(),{title:n,titleDelimiter:l}=t,{plugin:c}=(0,o.Z)();return{format:t=>e({title:t,siteTitle:n,titleDelimiter:l,plugin:c,defaultFormatter:s})}}},93786:function(e,t,n){"use strict";n.d(t,{l:()=>i});var r=n(72442),a=n(16550),o=n(3143);function i(){let{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.default)(),{pathname:s}=(0,a.TH)(),u=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function({locale:e,fullyQualified:n}){return`${n?t:""}${e===i?`${c}`:`${c}${e}/`}${d}`}}}},89475:function(e,t,n){"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),o=n(73436);function i(e){let t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)(()=>{n&&t!==n&&i({location:t,previousLocation:n})},[i,t,n])}},21641:function(e,t,n){"use strict";n.d(t,{L:()=>a});var r=n(72442);function a(){return(0,r.default)().siteConfig.themeConfig}},51421:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=a,t.default=function(e,t){let{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#")||void 0===n)return e;let[i]=e.split(/[#?]/),l="/"===i||i===r?i:n?a(i):o(i);return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o;let r=n(31846);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}},89064:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},3143:function(e,t,n){"use strict";t.getErrorCausalChain=t.applyTrailingSlash=void 0;let r=n(28395);var a=n(51421);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r.__importDefault(a).default}}),n(31846);var o=n(89064);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},31846:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},56358:function(e,t,n){"use strict";n.d(t,{Z:()=>o}),n(67294);var r=n(67026),a=n(85893);function o({className:e}){return(0,a.jsxs)("div",{className:(0,r.Z)("loadingRing_RJI3",e),children:[(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{})]})}},59430:function(e,t,n){"use strict";let r;n.d(t,{r:()=>S,a:()=>E});let a=Symbol("Comlink.proxy"),o=Symbol("Comlink.endpoint"),i=Symbol("Comlink.releaseProxy"),l=Symbol("Comlink.finalizer"),s=Symbol("Comlink.thrown"),u=e=>"object"==typeof e&&null!==e||"function"==typeof e,c=new Map([["proxy",{canHandle:e=>u(e)&&e[a],serialize(e){let{port1:t,port2:n}=new MessageChannel;return function e(t,n=globalThis,r=["*"]){n.addEventListener("message",function o(i){let u;if(!i||!i.data)return;if(!function(e,t){for(let n of e)if(t===n||"*"===n||n instanceof RegExp&&n.test(t))return!0;return!1}(r,i.origin))return void console.warn(`Invalid origin '${i.origin}' for comlink proxy`);let{id:c,type:f,path:p}=Object.assign({path:[]},i.data),m=(i.data.argumentList||[]).map(k);try{var h,g,b;let n=p.slice(0,-1).reduce((e,t)=>e[t],t),r=p.reduce((e,t)=>e[t],t);switch(f){case"GET":u=r;break;case"SET":n[p.slice(-1)[0]]=k(i.data.value),u=!0;break;case"APPLY":u=r.apply(n,m);break;case"CONSTRUCT":h=new r(...m),u=Object.assign(h,{[a]:!0});break;case"ENDPOINT":{let{port1:n,port2:r}=new MessageChannel;e(t,r),g=n,b=[n],y.set(g,b),u=g}break;case"RELEASE":u=void 0;break;default:return}}catch(e){u={value:e,[s]:0}}Promise.resolve(u).catch(e=>({value:e,[s]:0})).then(e=>{let[r,a]=v(e);n.postMessage(Object.assign(Object.assign({},r),{id:c}),a),"RELEASE"===f&&(n.removeEventListener("message",o),d(n),l in t&&"function"==typeof t[l]&&t[l]())}).catch(e=>{let[t,r]=v({value:TypeError("Unserializable return value"),[s]:0});n.postMessage(Object.assign(Object.assign({},t),{id:c}),r)})}),n.start&&n.start()}(e,t),[n,[n]]},deserialize:e=>(e.start(),f(e))}],["throw",{canHandle:e=>u(e)&&s in e,serialize:({value:e})=>[e instanceof Error?{isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:{isError:!1,value:e},[]],deserialize(e){if(e.isError)throw Object.assign(Error(e.value.message),e.value);throw e.value}}]]);function d(e){"MessagePort"===e.constructor.name&&e.close()}function f(e,t){let n=new Map;return e.addEventListener("message",function(e){let{data:t}=e;if(!t||!t.id)return;let r=n.get(t.id);if(r)try{r(t)}finally{n.delete(t.id)}}),function e(t,n,r=[],a=function(){}){let l=!1,s=new Proxy(a,{get(a,o){if(p(l),o===i)return()=>{g&&g.unregister(s),m(t),n.clear(),l=!0};if("then"===o){if(0===r.length)return{then:()=>s};let e=w(t,n,{type:"GET",path:r.map(e=>e.toString())}).then(k);return e.then.bind(e)}return e(t,n,[...r,o])},set(e,a,o){p(l);let[i,s]=v(o);return w(t,n,{type:"SET",path:[...r,a].map(e=>e.toString()),value:i},s).then(k)},apply(a,i,s){p(l);let u=r[r.length-1];if(u===o)return w(t,n,{type:"ENDPOINT"}).then(k);if("bind"===u)return e(t,n,r.slice(0,-1));let[c,d]=b(s);return w(t,n,{type:"APPLY",path:r.map(e=>e.toString()),argumentList:c},d).then(k)},construct(e,a){p(l);let[o,i]=b(a);return w(t,n,{type:"CONSTRUCT",path:r.map(e=>e.toString()),argumentList:o},i).then(k)}}),u=(h.get(t)||0)+1;return h.set(t,u),g&&g.register(s,t,s),s}(e,n,[],t)}function p(e){if(e)throw Error("Proxy has been released and is not useable")}function m(e){return w(e,new Map,{type:"RELEASE"}).then(()=>{d(e)})}let h=new WeakMap,g="FinalizationRegistry"in globalThis&&new FinalizationRegistry(e=>{let t=(h.get(e)||0)-1;h.set(e,t),0===t&&m(e)});function b(e){var t;let n=e.map(v);return[n.map(e=>e[0]),(t=n.map(e=>e[1]),Array.prototype.concat.apply([],t))]}let y=new WeakMap;function v(e){for(let[t,n]of c)if(n.canHandle(e)){let[r,a]=n.serialize(e);return[{type:"HANDLER",name:t,value:r},a]}return[{type:"RAW",value:e},y.get(e)||[]]}function k(e){switch(e.type){case"HANDLER":return c.get(e.name).deserialize(e.value);case"RAW":return e.value}}function w(e,t,n,r){return new Promise(a=>{let o=[,,,,].fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");t.set(o,a),e.start&&e.start(),e.postMessage(Object.assign({id:o},n),r)})}function x(){return r||(r=(async()=>{let e=f(new Worker(new URL(n.p+n.u("7971"),n.b)));return await new e})()),r}async function S(e,t){{let n=await x();await n.fetchIndexes(e,t)}}async function E(e,t,n,r){return(await x()).search(e,t,n,r)}},77160:function(e,t,n){"use strict";function r(e){return e.join(" \u203A ")}n.d(t,{e:()=>r})},68119:function(e,t,n){"use strict";function r(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}n.d(t,{X:()=>r})},557:function(e,t,n){"use strict";function r(e,t){let n=[];for(let r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort((e,t)=>e[0]-t[0]||t[1]-e[1])}n.d(t,{m:()=>r})},70203:function(e,t,n){"use strict";n.d(t,{C:()=>function e(t,n,a){let o=[];for(let a of n){let i=t.toLowerCase().indexOf(a);if(i>=0){i>0&&o.push(e(t.substr(0,i),n)),o.push(`<mark>${(0,r.X)(t.substr(i,a.length))}</mark>`);let l=i+a.length;l<t.length&&o.push(e(t.substr(l),n));break}}return 0===o.length?a?`<mark>${(0,r.X)(t)}</mark>`:(0,r.X)(t):o.join("")}});var r=n(68119)},68064:function(e,t,n){"use strict";n.d(t,{o:()=>s});var r=n(68119),a=n(70203);let o=/\w+|\p{Unified_Ideograph}/u;function i(e){let t=[],n=0,r=e;for(;r.length>0;){let a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var l=n(97642);function s(e,t,n,o=l.Hk){let{chunkIndex:u,chunks:c}=function(e,t,n){let o=[],l=0,s=0,u=-1;for(;l<t.length;){let[c,d]=t[l];if(l+=1,!(c<s)){if(c>s)for(let t of i(e.substring(s,c)).map(e=>({html:(0,r.X)(e),textLength:e.length})))o.push(t);-1===u&&(u=o.length),s=c+d,o.push({html:(0,a.C)(e.substring(c,s),n,!0),textLength:d})}}if(s<e.length)for(let t of i(e.substring(s)).map(e=>({html:(0,r.X)(e),textLength:e.length})))o.push(t);return{chunkIndex:u,chunks:o}}(e,t,n),d=c.slice(0,u),f=c[u],p=[f.html],m=c.slice(u+1),h=f.textLength,g=0,b=0,y=!1,v=!1;for(;h<o;)if((g<=b||0===m.length)&&d.length>0){let e=d.pop();h+e.textLength<=o?(p.unshift(e.html),g+=e.textLength,h+=e.textLength):(y=!0,d.length=0)}else if(m.length>0){let e=m.shift();h+e.textLength<=o?(p.push(e.html),b+=e.textLength,h+=e.textLength):(v=!0,m.length=0)}else break;return(y||d.length>0)&&p.unshift("\u2026"),(v||m.length>0)&&p.push("\u2026"),p.join("")}},43393:function(e,t,n){"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{let{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{_:()=>r})},56861:function(e,t,n){"use strict";var r,a;n.d(t,{P:()=>r}),(a=r||(r={}))[a.Title=0]="Title",a[a.Heading=1]="Heading",a[a.Description=2]="Description",a[a.Keywords=3]="Keywords",a[a.Content=4]="Content"},31381:function(e,t,n){"use strict";n.d(t,{ob:()=>p,Ep:()=>f,q_:()=>C,lX:()=>k,PP:()=>P});var r=n(16019);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;n+=1,r+=1)e[n]=e[r];e.pop()}let i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&a(e),s=t&&a(t),u=l||s;if(e&&a(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var c=i[i.length-1];n="."===c||".."===c||""===c}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(21835);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o,l,s,u,c,d;"string"==typeof e?(s="",u="",-1!==(c=(l=e||"/").indexOf("#"))&&(u=l.substr(c),l=l.substr(0,c)),-1!==(d=l.indexOf("?"))&&(s=l.substr(d),l=l.substr(0,d)),(o={pathname:l,search:"?"===s?"":s,hash:"#"===u?"":u}).state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(e){if(e instanceof URIError)throw URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.');throw e}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null,t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter(function(e){return e!==r})}},notifyListeners:function(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach(function(e){return e.apply(void 0,n)})}}}var h=!!("undefined"!=typeof window&&window.document&&window.document.createElement);function g(e,t){t(window.confirm(e))}var b="popstate",y="hashchange";function v(){try{return window.history.state||{}}catch(e){return{}}}function k(e){void 0===e&&(e={}),h||(0,l.Z)(!1);var t,n=window.history,a=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=-1!==window.navigator.userAgent.indexOf("Trident"),i=e,u=i.forceRefresh,k=void 0!==u&&u,w=i.getUserConfirmation,x=void 0===w?g:w,S=i.keyLength,E=void 0===S?6:S,_=e.basename?d(s(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return _&&(o=c(o,_)),p(o,r,n)}function T(){return Math.random().toString(36).substr(2,E)}var P=m();function A(e){(0,r.Z)(B,e),B.length=n.length,P.notifyListeners(B.location,B.action)}function O(e){(void 0!==e.state||-1!==navigator.userAgent.indexOf("CriOS"))&&N(C(e.state))}function L(){N(C(v()))}var j=!1;function N(e){j?(j=!1,A()):P.confirmTransitionTo(e,"POP",x,function(t){var n,r,a,o,i;t?A({action:"POP",location:e}):(n=e,r=B.location,-1===(a=I.indexOf(r.key))&&(a=0),-1===(o=I.indexOf(n.key))&&(o=0),(i=a-o)&&(j=!0,D(i)))})}var R=C(v()),I=[R.key];function F(e){return _+f(e)}function D(e){n.go(e)}var z=0;function M(e){1===(z+=e)&&1===e?(window.addEventListener(b,O),o&&window.addEventListener(y,L)):0===z&&(window.removeEventListener(b,O),o&&window.removeEventListener(y,L))}var $=!1,B={length:n.length,action:"POP",location:R,createHref:F,push:function(e,t){var r="PUSH",o=p(e,t,T(),B.location);P.confirmTransitionTo(o,r,x,function(e){if(e){var t=F(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),k)window.location.href=t;else{var s=I.indexOf(B.location.key),u=I.slice(0,s+1);u.push(o.key),I=u,A({action:r,location:o})}else window.location.href=t}})},replace:function(e,t){var r="REPLACE",o=p(e,t,T(),B.location);P.confirmTransitionTo(o,r,x,function(e){if(e){var t=F(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),k)window.location.replace(t);else{var s=I.indexOf(B.location.key);-1!==s&&(I[s]=o.key),A({action:r,location:o})}else window.location.replace(t)}})},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=P.setPrompt(e);return $||(M(1),$=!0),function(){return $&&($=!1,M(-1)),t()}},listen:function(e){var t=P.appendListener(e);return M(1),function(){M(-1),t()}}};return B}var w="hashchange",x={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+u(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:u,decodePath:s},slash:{encodePath:s,decodePath:s}};function S(e){var t=e.indexOf("#");return -1===t?e:e.slice(0,t)}function E(){var e=window.location.href,t=e.indexOf("#");return -1===t?"":e.substring(t+1)}function _(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),h||(0,l.Z)(!1);var t=window.history;window.navigator.userAgent.indexOf("Firefox");var n=e,a=n.getUserConfirmation,o=void 0===a?g:a,i=n.hashType,u=e.basename?d(s(e.basename)):"",b=x[void 0===i?"slash":i],y=b.encodePath,v=b.decodePath;function k(){var e=v(E());return u&&(e=c(e,u)),p(e)}var C=m();function T(e){(0,r.Z)(M,e),M.length=t.length,C.notifyListeners(M.location,M.action)}var P=!1,A=null;function O(){var e=E(),t=y(e);if(e!==t)_(t);else{var n,r=k(),a=M.location;if(!P&&a.pathname===r.pathname&&a.search===r.search&&a.hash===r.hash||A===f(r))return;A=null,n=r,P?(P=!1,T()):C.confirmTransitionTo(n,"POP",o,function(e){var t,r,a,o,i;e?T({action:"POP",location:n}):(t=n,r=M.location,-1===(a=R.lastIndexOf(f(r)))&&(a=0),-1===(o=R.lastIndexOf(f(t)))&&(o=0),(i=a-o)&&(P=!0,I(i)))})}}var L=E(),j=y(L);L!==j&&_(j);var N=k(),R=[f(N)];function I(e){t.go(e)}var F=0;function D(e){1===(F+=e)&&1===e?window.addEventListener(w,O):0===F&&window.removeEventListener(w,O)}var z=!1,M={length:t.length,action:"POP",location:N,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+y(u+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,M.location);C.confirmTransitionTo(r,n,o,function(e){if(e){var t=f(r),a=y(u+t);if(E()!==a){A=t,window.location.hash=a;var o=R.lastIndexOf(f(M.location)),i=R.slice(0,o+1);i.push(t),R=i,T({action:n,location:r})}else T()}})},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,M.location);C.confirmTransitionTo(r,n,o,function(e){if(e){var t=f(r),a=y(u+t);E()!==a&&(A=t,_(a));var o=R.indexOf(f(M.location));-1!==o&&(R[o]=t),T({action:n,location:r})}})},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=C.setPrompt(e);return z||(D(1),z=!0),function(){return z&&(z=!1,D(-1)),t()}},listen:function(e){var t=C.appendListener(e);return D(1),function(){D(-1),t()}}};return M}function T(e,t,n){return Math.min(Math.max(e,t),n)}function P(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,l=t.keyLength,s=void 0===l?6:l,u=m();function c(e){(0,r.Z)(y,e),y.length=y.entries.length,u.notifyListeners(y.location,y.action)}function d(){return Math.random().toString(36).substr(2,s)}var h=T(void 0===i?0:i,0,o.length-1),g=o.map(function(e){return"string"==typeof e?p(e,void 0,d()):p(e,void 0,e.key||d())});function b(e){var t=T(y.index+e,0,y.entries.length-1),r=y.entries[t];u.confirmTransitionTo(r,"POP",n,function(e){e?c({action:"POP",location:r,index:t}):c()})}var y={length:g.length,action:"POP",location:g[h],index:h,entries:g,createHref:f,push:function(e,t){var r="PUSH",a=p(e,t,d(),y.location);u.confirmTransitionTo(a,r,n,function(e){if(e){var t=y.index+1,n=y.entries.slice(0);n.length>t?n.splice(t,n.length-t,a):n.push(a),c({action:r,location:a,index:t,entries:n})}})},replace:function(e,t){var r="REPLACE",a=p(e,t,d(),y.location);u.confirmTransitionTo(a,r,n,function(e){e&&(y.entries[y.index]=a,c({action:r,location:a}))})},go:b,goBack:function(){b(-1)},goForward:function(){b(1)},canGo:function(e){var t=y.index+e;return t>=0&&t<y.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return y}},8679:function(e,t,n){"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g<i.length;++g){var b=i[g];if(!o[b]&&!(r&&r[b])&&!(h&&h[b])&&!(l&&l[b])){var y=f(n,b);try{u(t,b,y)}catch(e){}}}}return t}},41143:function(e){"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=Error(t.replace(/%s/g,function(){return u[c++]}))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:function(e){e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},31336:function(e){!function(){var t,n,r,a,o,i,l,s,u,c,d,f,p,m,h,g,b,y,v,k,w,x,S,E,_,C,T,P,A,O,L=function(e){var t=new L.Builder;return t.pipeline.add(L.trimmer,L.stopWordFilter,L.stemmer),t.searchPipeline.add(L.stemmer),e.call(t,t),t.build()};L.version="2.3.9",L.utils={},L.utils.warn=(t=this,function(e){t.console&&console.warn&&console.warn(e)}),L.utils.asString=function(e){return null==e?"":e.toString()},L.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r<n.length;r++){var a=n[r],o=e[a];if(Array.isArray(o)){t[a]=o.slice();continue}if("string"==typeof o||"number"==typeof o||"boolean"==typeof o){t[a]=o;continue}throw TypeError("clone is not deep and does not support nested objects")}return t},L.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},L.FieldRef.joiner="/",L.FieldRef.fromString=function(e){var t=e.indexOf(L.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),r=e.slice(t+1);return new L.FieldRef(r,n,e)},L.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+L.FieldRef.joiner+this.docRef),this._stringValue},L.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},L.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},L.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},L.Set.prototype.contains=function(e){return!!this.elements[e]},L.Set.prototype.intersect=function(e){var t,n,r,a=[];if(e===L.Set.complete)return this;if(e===L.Set.empty)return e;this.length<e.length?(t=this,n=e):(t=e,n=this),r=Object.keys(t.elements);for(var o=0;o<r.length;o++){var i=r[o];i in n.elements&&a.push(i)}return new L.Set(a)},L.Set.prototype.union=function(e){return e===L.Set.complete?L.Set.complete:e===L.Set.empty?this:new L.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},L.idf=function(e,t){var n=0;for(var r in e)"_index"!=r&&(n+=Object.keys(e[r]).length);return Math.log(1+Math.abs((t-n+.5)/(n+.5)))},L.Token=function(e,t){this.str=e||"",this.metadata=t||{}},L.Token.prototype.toString=function(){return this.str},L.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},L.Token.prototype.clone=function(e){return e=e||function(e){return e},new L.Token(e(this.str,this.metadata),this.metadata)},L.tokenizer=function(e,t){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new L.Token(L.utils.asString(e).toLowerCase(),L.utils.clone(t))});for(var n=e.toString().toLowerCase(),r=n.length,a=[],o=0,i=0;o<=r;o++){var l=n.charAt(o),s=o-i;if(l.match(L.tokenizer.separator)||o==r){if(s>0){var u=L.utils.clone(t)||{};u.position=[i,s],u.index=a.length,a.push(new L.Token(n.slice(i,o),u))}i=o+1}}return a},L.tokenizer.separator=/[\s\-]+/,L.Pipeline=function(){this._stack=[]},L.Pipeline.registeredFunctions=Object.create(null),L.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&L.utils.warn("Overwriting existing registered function: "+t),e.label=t,L.Pipeline.registeredFunctions[e.label]=e},L.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||L.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},L.Pipeline.load=function(e){var t=new L.Pipeline;return e.forEach(function(e){var n=L.Pipeline.registeredFunctions[e];if(n)t.add(n);else throw Error("Cannot load unregistered function: "+e)}),t},L.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){L.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},L.Pipeline.prototype.after=function(e,t){L.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},L.Pipeline.prototype.before=function(e,t){L.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw Error("Cannot find existingFn");this._stack.splice(n,0,t)},L.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},L.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n<t;n++){for(var r=this._stack[n],a=[],o=0;o<e.length;o++){var i=r(e[o],o,e);if(null!=i&&""!==i)if(Array.isArray(i))for(var l=0;l<i.length;l++)a.push(i[l]);else a.push(i)}e=a}return e},L.Pipeline.prototype.runString=function(e,t){var n=new L.Token(e,t);return this.run([n]).map(function(e){return e.toString()})},L.Pipeline.prototype.reset=function(){this._stack=[]},L.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return L.Pipeline.warnIfFunctionNotRegistered(e),e.label})},L.Vector=function(e){this._magnitude=0,this.elements=e||[]},L.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,n=this.elements.length/2,r=n-t,a=Math.floor(r/2),o=this.elements[2*a];r>1&&(o<e&&(t=a),o>e&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:o<e?(a+1)*2:void 0},L.Vector.prototype.insert=function(e,t){this.upsert(e,t,function(){throw"duplicate index"})},L.Vector.prototype.upsert=function(e,t,n){this._magnitude=0;var r=this.positionForIndex(e);this.elements[r]==e?this.elements[r+1]=n(this.elements[r+1],t):this.elements.splice(r,0,e,t)},L.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,n=1;n<t;n+=2){var r=this.elements[n];e+=r*r}return this._magnitude=Math.sqrt(e)},L.Vector.prototype.dot=function(e){for(var t=0,n=this.elements,r=e.elements,a=n.length,o=r.length,i=0,l=0,s=0,u=0;s<a&&u<o;)(i=n[s])<(l=r[u])?s+=2:i>l?u+=2:i==l&&(t+=n[s+1]*r[u+1],s+=2,u+=2);return t},L.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},L.Vector.prototype.toArray=function(){for(var e=Array(this.elements.length/2),t=1,n=0;t<this.elements.length;t+=2,n++)e[n]=this.elements[t];return e},L.Vector.prototype.toJSON=function(){return this.elements},n={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},r={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},l="^("+(o="[^aeiou][^aeiouy]*")+")?"+(i=(a="[aeiouy]")+"[aeiou]*")+o+"("+i+")?$",s="^("+o+")?"+i+o+i+o,u=RegExp("^("+o+")?"+i+o),c=new RegExp(s),d=new RegExp(l),f=RegExp("^("+o+")?"+a),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,h=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,b=/.$/,y=/(at|bl|iz)$/,v=RegExp("([^aeiouylsz])\\1$"),k=RegExp("^"+o+a+"[^aeiouwxy]$"),w=/^(.+?[^aeiou])y$/,x=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,S=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,E=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,C=/^(.+?)e$/,T=/ll$/,P=RegExp("^"+o+a+"[^aeiouwxy]$"),A=function(e){var t,a,o,i,l,s;if(e.length<3)return e;if("y"==(o=e.substr(0,1))&&(e=o.toUpperCase()+e.substr(1)),i=p,l=m,i.test(e)?e=e.replace(i,"$1$2"):l.test(e)&&(e=e.replace(l,"$1$2")),i=h,l=g,i.test(e)){var A=i.exec(e);(i=u).test(A[1])&&(i=b,e=e.replace(i,""))}else if(l.test(e)){var A=l.exec(e);t=A[1],(l=f).test(t)&&(e=t,l=y,s=v,l.test(e)?e+="e":s.test(e)?(i=b,e=e.replace(i,"")):k.test(e)&&(e+="e"))}if((i=w).test(e)){var A=i.exec(e);e=(t=A[1])+"i"}if((i=x).test(e)){var A=i.exec(e);t=A[1],a=A[2],(i=u).test(t)&&(e=t+n[a])}if((i=S).test(e)){var A=i.exec(e);t=A[1],a=A[2],(i=u).test(t)&&(e=t+r[a])}if(i=E,l=_,i.test(e)){var A=i.exec(e);t=A[1],(i=c).test(t)&&(e=t)}else if(l.test(e)){var A=l.exec(e);t=A[1]+A[2],(l=c).test(t)&&(e=t)}if((i=C).test(e)){var A=i.exec(e);t=A[1],i=c,l=d,s=P,(i.test(t)||l.test(t)&&!s.test(t))&&(e=t)}return i=T,l=c,i.test(e)&&l.test(e)&&(i=b,e=e.replace(i,"")),"y"==o&&(e=o.toLowerCase()+e.substr(1)),e},L.stemmer=function(e){return e.update(A)},L.Pipeline.registerFunction(L.stemmer,"stemmer"),L.generateStopWordFilter=function(e){var t=e.reduce(function(e,t){return e[t]=t,e},{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},L.stopWordFilter=L.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),L.Pipeline.registerFunction(L.stopWordFilter,"stopWordFilter"),L.trimmer=function(e){return e.update(function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")})},L.Pipeline.registerFunction(L.trimmer,"trimmer"),L.TokenSet=function(){this.final=!1,this.edges={},this.id=L.TokenSet._nextId,L.TokenSet._nextId+=1},L.TokenSet._nextId=1,L.TokenSet.fromArray=function(e){for(var t=new L.TokenSet.Builder,n=0,r=e.length;n<r;n++)t.insert(e[n]);return t.finish(),t.root},L.TokenSet.fromClause=function(e){return"editDistance"in e?L.TokenSet.fromFuzzyString(e.term,e.editDistance):L.TokenSet.fromString(e.term)},L.TokenSet.fromFuzzyString=function(e,t){for(var n=new L.TokenSet,r=[{node:n,editsRemaining:t,str:e}];r.length;){var a=r.pop();if(a.str.length>0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new L.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var l=a.node.edges["*"];else{var l=new L.TokenSet;a.node.edges["*"]=l}if(0==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var s=a.node.edges["*"];else{var s=new L.TokenSet;a.node.edges["*"]=s}1==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var u,c=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?u=a.node.edges[d]:(u=new L.TokenSet,a.node.edges[d]=u),1==a.str.length&&(u.final=!0),r.push({node:u,editsRemaining:a.editsRemaining-1,str:c+a.str.slice(2)})}}}return n},L.TokenSet.fromString=function(e){for(var t=new L.TokenSet,n=t,r=0,a=e.length;r<a;r++){var o=e[r],i=r==a-1;if("*"==o)t.edges[o]=t,t.final=i;else{var l=new L.TokenSet;l.final=i,t.edges[o]=l,t=l}}return n},L.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var n=t.pop(),r=Object.keys(n.node.edges),a=r.length;n.node.final&&(n.prefix.charAt(0),e.push(n.prefix));for(var o=0;o<a;o++){var i=r[o];t.push({prefix:n.prefix.concat(i),node:n.node.edges[i]})}}return e},L.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),n=t.length,r=0;r<n;r++){var a=t[r],o=this.edges[a];e=e+a+o.id}return e},L.TokenSet.prototype.intersect=function(e){for(var t=new L.TokenSet,n=void 0,r=[{qNode:e,output:t,node:this}];r.length;)for(var a=Object.keys((n=r.pop()).qNode.edges),o=a.length,i=Object.keys(n.node.edges),l=i.length,s=0;s<o;s++)for(var u=a[s],c=0;c<l;c++){var d=i[c];if(d==u||"*"==u){var f=n.node.edges[d],p=n.qNode.edges[u],m=f.final&&p.final,h=void 0;d in n.output.edges?(h=n.output.edges[d]).final=h.final||m:((h=new L.TokenSet).final=m,n.output.edges[d]=h),r.push({qNode:p,output:h,node:f})}}return t},L.TokenSet.Builder=function(){this.previousWord="",this.root=new L.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},L.TokenSet.Builder.prototype.insert=function(e){var t,n=0;if(e<this.previousWord)throw Error("Out of order word insertion");for(var r=0;r<e.length&&r<this.previousWord.length&&e[r]==this.previousWord[r];r++)n++;this.minimize(n),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child;for(var r=n;r<e.length;r++){var a=new L.TokenSet,o=e[r];t.edges[o]=a,this.uncheckedNodes.push({parent:t,char:o,child:a}),t=a}t.final=!0,this.previousWord=e},L.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},L.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},L.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},L.Index.prototype.search=function(e){return this.query(function(t){new L.QueryParser(e,t).parse()})},L.Index.prototype.query=function(e){for(var t=new L.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),l=0;l<this.fields.length;l++)r[this.fields[l]]=new L.Vector;e.call(t,t);for(var l=0;l<t.clauses.length;l++){var s=t.clauses[l],u=null,c=L.Set.empty;u=s.usePipeline?this.pipeline.runString(s.term,{fields:s.fields}):[s.term];for(var d=0;d<u.length;d++){s.term=u[d];var f=L.TokenSet.fromClause(s),p=this.tokenSet.intersect(f).toArray();if(0===p.length&&s.presence===L.Query.presence.REQUIRED){for(var m=0;m<s.fields.length;m++){var h=s.fields[m];o[h]=L.Set.empty}break}for(var g=0;g<p.length;g++)for(var b=p[g],y=this.invertedIndex[b],v=y._index,m=0;m<s.fields.length;m++){var h=s.fields[m],k=y[h],w=Object.keys(k),x=b+"/"+h,S=new L.Set(w);if(s.presence==L.Query.presence.REQUIRED&&(c=c.union(S),void 0===o[h]&&(o[h]=L.Set.complete)),s.presence==L.Query.presence.PROHIBITED){void 0===i[h]&&(i[h]=L.Set.empty),i[h]=i[h].union(S);continue}if(r[h].upsert(v,s.boost,function(e,t){return e+t}),!a[x]){for(var E=0;E<w.length;E++){var _,C=w[E],T=new L.FieldRef(C,h),P=k[C];void 0===(_=n[T])?n[T]=new L.MatchData(b,h,P):_.add(b,h,P)}a[x]=!0}}}if(s.presence===L.Query.presence.REQUIRED)for(var m=0;m<s.fields.length;m++){var h=s.fields[m];o[h]=o[h].intersect(c)}}for(var A=L.Set.complete,O=L.Set.empty,l=0;l<this.fields.length;l++){var h=this.fields[l];o[h]&&(A=A.intersect(o[h])),i[h]&&(O=O.union(i[h]))}var j=Object.keys(n),N=[],R=Object.create(null);if(t.isNegated()){j=Object.keys(this.fieldVectors);for(var l=0;l<j.length;l++){var T=j[l],I=L.FieldRef.fromString(T);n[T]=new L.MatchData}}for(var l=0;l<j.length;l++){var I=L.FieldRef.fromString(j[l]),F=I.docRef;if(A.contains(F)&&!O.contains(F)){var D,z=this.fieldVectors[I],M=r[I.fieldName].similarity(z);if(void 0!==(D=R[F]))D.score+=M,D.matchData.combine(n[I]);else{var $={ref:F,score:M,matchData:n[I]};R[F]=$,N.push($)}}}return N.sort(function(e,t){return t.score-e.score})},L.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map(function(e){return[e,this.invertedIndex[e]]},this),t=Object.keys(this.fieldVectors).map(function(e){return[e,this.fieldVectors[e].toJSON()]},this);return{version:L.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},L.Index.load=function(e){var t={},n={},r=e.fieldVectors,a=Object.create(null),o=e.invertedIndex,i=new L.TokenSet.Builder,l=L.Pipeline.load(e.pipeline);e.version!=L.version&&L.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+L.version+"' does not match serialized index '"+e.version+"'");for(var s=0;s<r.length;s++){var u=r[s],c=u[0],d=u[1];n[c]=new L.Vector(d)}for(var s=0;s<o.length;s++){var u=o[s],f=u[0],p=u[1];i.insert(f),a[f]=p}return i.finish(),t.fields=e.fields,t.fieldVectors=n,t.invertedIndex=a,t.tokenSet=i.root,t.pipeline=l,new L.Index(t)},L.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=L.tokenizer,this.pipeline=new L.Pipeline,this.searchPipeline=new L.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},L.Builder.prototype.ref=function(e){this._ref=e},L.Builder.prototype.field=function(e,t){if(/\//.test(e))throw RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},L.Builder.prototype.b=function(e){e<0?this._b=0:e>1?this._b=1:this._b=e},L.Builder.prototype.k1=function(e){this._k1=e},L.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a<r.length;a++){var o=r[a],i=this._fields[o].extractor,l=i?i(e):e[o],s=this.tokenizer(l,{fields:[o]}),u=this.pipeline.run(s),c=new L.FieldRef(n,o),d=Object.create(null);this.fieldTermFrequencies[c]=d,this.fieldLengths[c]=0,this.fieldLengths[c]+=u.length;for(var f=0;f<u.length;f++){var p=u[f];if(void 0==d[p]&&(d[p]=0),d[p]+=1,void 0==this.invertedIndex[p]){var m=Object.create(null);m._index=this.termIndex,this.termIndex+=1;for(var h=0;h<r.length;h++)m[r[h]]=Object.create(null);this.invertedIndex[p]=m}void 0==this.invertedIndex[p][o][n]&&(this.invertedIndex[p][o][n]=Object.create(null));for(var g=0;g<this.metadataWhitelist.length;g++){var b=this.metadataWhitelist[g],y=p.metadata[b];void 0==this.invertedIndex[p][o][n][b]&&(this.invertedIndex[p][o][n][b]=[]),this.invertedIndex[p][o][n][b].push(y)}}}},L.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,n={},r={},a=0;a<t;a++){var o=L.FieldRef.fromString(e[a]),i=o.fieldName;r[i]||(r[i]=0),r[i]+=1,n[i]||(n[i]=0),n[i]+=this.fieldLengths[o]}for(var l=Object.keys(this._fields),a=0;a<l.length;a++){var s=l[a];n[s]=n[s]/r[s]}this.averageFieldLength=n},L.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),n=t.length,r=Object.create(null),a=0;a<n;a++){for(var o=L.FieldRef.fromString(t[a]),i=o.fieldName,l=this.fieldLengths[o],s=new L.Vector,u=this.fieldTermFrequencies[o],c=Object.keys(u),d=c.length,f=this._fields[i].boost||1,p=this._documents[o.docRef].boost||1,m=0;m<d;m++){var h,g,b=c[m],y=u[b],v=this.invertedIndex[b]._index;void 0===r[b]?(h=L.idf(this.invertedIndex[b],this.documentCount),r[b]=h):h=r[b],g=Math.round(1e3*(h*((this._k1+1)*y)/(this._k1*(1-this._b+this._b*(l/this.averageFieldLength[i]))+y)*f*p))/1e3,s.insert(v,g)}e[o]=s}this.fieldVectors=e},L.Builder.prototype.createTokenSet=function(){this.tokenSet=L.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},L.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new L.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},L.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},L.MatchData=function(e,t,n){for(var r=Object.create(null),a=Object.keys(n||{}),o=0;o<a.length;o++){var i=a[o];r[i]=n[i].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=r)},L.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),n=0;n<t.length;n++){var r=t[n],a=Object.keys(e.metadata[r]);void 0==this.metadata[r]&&(this.metadata[r]=Object.create(null));for(var o=0;o<a.length;o++){var i=a[o],l=Object.keys(e.metadata[r][i]);void 0==this.metadata[r][i]&&(this.metadata[r][i]=Object.create(null));for(var s=0;s<l.length;s++){var u=l[s];void 0==this.metadata[r][i][u]?this.metadata[r][i][u]=e.metadata[r][i][u]:this.metadata[r][i][u]=this.metadata[r][i][u].concat(e.metadata[r][i][u])}}}},L.MatchData.prototype.add=function(e,t,n){if(!(e in this.metadata)){this.metadata[e]=Object.create(null),this.metadata[e][t]=n;return}if(!(t in this.metadata[e])){this.metadata[e][t]=n;return}for(var r=Object.keys(n),a=0;a<r.length;a++){var o=r[a];o in this.metadata[e][t]?this.metadata[e][t][o]=this.metadata[e][t][o].concat(n[o]):this.metadata[e][t][o]=n[o]}},L.Query=function(e){this.clauses=[],this.allFields=e},L.Query.wildcard=new String("*"),L.Query.wildcard.NONE=0,L.Query.wildcard.LEADING=1,L.Query.wildcard.TRAILING=2,L.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},L.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=L.Query.wildcard.NONE),e.wildcard&L.Query.wildcard.LEADING&&e.term.charAt(0)!=L.Query.wildcard&&(e.term="*"+e.term),e.wildcard&L.Query.wildcard.TRAILING&&e.term.slice(-1)!=L.Query.wildcard&&(e.term=""+e.term+"*"),"presence"in e||(e.presence=L.Query.presence.OPTIONAL),this.clauses.push(e),this},L.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=L.Query.presence.PROHIBITED)return!1;return!0},L.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach(function(e){this.term(e,L.utils.clone(t))},this),this;var n=t||{};return n.term=e.toString(),this.clause(n),this},L.QueryParseError=function(e,t,n){this.name="QueryParseError",this.message=e,this.start=t,this.end=n},L.QueryParseError.prototype=Error(),L.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},L.QueryLexer.prototype.run=function(){for(var e=L.QueryLexer.lexText;e;)e=e(this)},L.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,n=this.pos,r=0;r<this.escapeCharPositions.length;r++)n=this.escapeCharPositions[r],e.push(this.str.slice(t,n)),t=n+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},L.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},L.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},L.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return L.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},L.QueryLexer.prototype.width=function(){return this.pos-this.start},L.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},L.QueryLexer.prototype.backup=function(){this.pos-=1},L.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do t=(e=this.next()).charCodeAt(0);while(t>47&&t<58);e!=L.QueryLexer.EOS&&this.backup()},L.QueryLexer.prototype.more=function(){return this.pos<this.length},L.QueryLexer.EOS="EOS",L.QueryLexer.FIELD="FIELD",L.QueryLexer.TERM="TERM",L.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",L.QueryLexer.BOOST="BOOST",L.QueryLexer.PRESENCE="PRESENCE",L.QueryLexer.lexField=function(e){return e.backup(),e.emit(L.QueryLexer.FIELD),e.ignore(),L.QueryLexer.lexText},L.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(L.QueryLexer.TERM)),e.ignore(),e.more())return L.QueryLexer.lexText},L.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(L.QueryLexer.EDIT_DISTANCE),L.QueryLexer.lexText},L.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(L.QueryLexer.BOOST),L.QueryLexer.lexText},L.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(L.QueryLexer.TERM)},L.QueryLexer.termSeparator=L.tokenizer.separator,L.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==L.QueryLexer.EOS)return L.QueryLexer.lexEOS;if(92==t.charCodeAt(0)){e.escapeCharacter();continue}if(":"==t)return L.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(L.QueryLexer.TERM),L.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(L.QueryLexer.TERM),L.QueryLexer.lexBoost;if("+"==t&&1===e.width()||"-"==t&&1===e.width())return e.emit(L.QueryLexer.PRESENCE),L.QueryLexer.lexText;if(t.match(L.QueryLexer.termSeparator))return L.QueryLexer.lexTerm}},L.QueryParser=function(e,t){this.lexer=new L.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},L.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=L.QueryParser.parseClause;e;)e=e(this);return this.query},L.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},L.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},L.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},L.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case L.QueryLexer.PRESENCE:return L.QueryParser.parsePresence;case L.QueryLexer.FIELD:return L.QueryParser.parseField;case L.QueryLexer.TERM:return L.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new L.QueryParseError(n,t.start,t.end)}},L.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(void 0!=t){switch(t.str){case"-":e.currentClause.presence=L.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=L.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new L.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(void 0==r){var n="expecting term or field, found nothing";throw new L.QueryParseError(n,t.start,t.end)}switch(r.type){case L.QueryLexer.FIELD:return L.QueryParser.parseField;case L.QueryLexer.TERM:return L.QueryParser.parseTerm;default:var n="expecting term or field, found '"+r.type+"'";throw new L.QueryParseError(n,r.start,r.end)}}},L.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new L.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(void 0==a){var r="expecting term, found nothing";throw new L.QueryParseError(r,t.start,t.end)}if(a.type===L.QueryLexer.TERM)return L.QueryParser.parseTerm;var r="expecting term, found '"+a.type+"'";throw new L.QueryParseError(r,a.start,a.end)}},L.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case L.QueryLexer.TERM:return e.nextClause(),L.QueryParser.parseTerm;case L.QueryLexer.FIELD:return e.nextClause(),L.QueryParser.parseField;case L.QueryLexer.EDIT_DISTANCE:return L.QueryParser.parseEditDistance;case L.QueryLexer.BOOST:return L.QueryParser.parseBoost;case L.QueryLexer.PRESENCE:return e.nextClause(),L.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new L.QueryParseError(r,n.start,n.end)}}},L.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new L.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(void 0==a)return void e.nextClause();switch(a.type){case L.QueryLexer.TERM:return e.nextClause(),L.QueryParser.parseTerm;case L.QueryLexer.FIELD:return e.nextClause(),L.QueryParser.parseField;case L.QueryLexer.EDIT_DISTANCE:return L.QueryParser.parseEditDistance;case L.QueryLexer.BOOST:return L.QueryParser.parseBoost;case L.QueryLexer.PRESENCE:return e.nextClause(),L.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+a.type+"'";throw new L.QueryParseError(r,a.start,a.end)}}},L.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new L.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(void 0==a)return void e.nextClause();switch(a.type){case L.QueryLexer.TERM:return e.nextClause(),L.QueryParser.parseTerm;case L.QueryLexer.FIELD:return e.nextClause(),L.QueryParser.parseField;case L.QueryLexer.EDIT_DISTANCE:return L.QueryParser.parseEditDistance;case L.QueryLexer.BOOST:return L.QueryParser.parseBoost;case L.QueryLexer.PRESENCE:return e.nextClause(),L.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+a.type+"'";throw new L.QueryParseError(r,a.start,a.end)}}},O=function(){return L},"function"==typeof define&&define.amd?define(O):e.exports=O()}()},74865:function(e){var t;t=function(){var e,t,n,r={};r.version="0.2.0";var a=r.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}r.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(a[t]=n);return this},r.status=null,r.set=function(e){var t=r.isStarted();r.status=1===(e=o(e,a.minimum,1))?null:e;var n=r.render(!t),s=n.querySelector(a.barSelector),u=a.speed,c=a.easing;return n.offsetWidth,i(function(t){var o,i,d,f;""===a.positionUsing&&(a.positionUsing=r.getPositioningCSS()),l(s,(o=e,i=u,d=c,(f="translate3d"===a.positionUsing?{transform:"translate3d("+(-1+o)*100+"%,0,0)"}:"translate"===a.positionUsing?{transform:"translate("+(-1+o)*100+"%,0)"}:{"margin-left":(-1+o)*100+"%"}).transition="all "+i+"ms "+d,f)),1===e?(l(n,{transition:"none",opacity:1}),n.offsetWidth,setTimeout(function(){l(n,{transition:"all "+u+"ms linear",opacity:0}),setTimeout(function(){r.remove(),t()},u)},u)):setTimeout(t,u)}),this},r.isStarted=function(){return"number"==typeof r.status},r.start=function(){r.status||r.set(0);var e=function(){setTimeout(function(){r.status&&(r.trickle(),e())},a.trickleSpeed)};return a.trickle&&e(),this},r.done=function(e){return e||r.status?r.inc(.3+.5*Math.random()).set(1):this},r.inc=function(e){var t=r.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),r.set(t)):r.start()},r.trickle=function(){return r.inc(Math.random()*a.trickleRate)},e=0,t=0,r.promise=function(n){return n&&"resolved"!==n.state()&&(0===t&&r.start(),e++,t++,n.always(function(){0==--t?(e=0,r.done()):r.set((e-t)/e)})),this},r.render=function(e){if(r.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=a.template;var n,o=t.querySelector(a.barSelector),i=e?"-100":(-1+(r.status||0))*100,s=document.querySelector(a.parent);return l(o,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),!a.showSpinner&&(n=t.querySelector(a.spinnerSelector))&&f(n),s!=document.body&&u(s,"nprogress-custom-parent"),s.appendChild(t),t},r.remove=function(){c(document.documentElement,"nprogress-busy"),c(document.querySelector(a.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},r.isRendered=function(){return!!document.getElementById("nprogress")},r.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var i=(n=[],function(e){n.push(e),1==n.length&&function e(){var t=n.shift();t&&t(e)}()}),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(n,r,a){var o;r=t[o=(o=r).replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(e,t){return t.toUpperCase()})]||(t[o]=function(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}(o)),n.style[r]=a}return function(e,t){var r,a,o=arguments;if(2==o.length)for(r in t)void 0!==(a=t[r])&&t.hasOwnProperty(r)&&n(e,r,a);else n(e,o[1],o[2])}}();function s(e,t){return("string"==typeof e?e:d(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=d(e),r=n+t;s(n,t)||(e.className=r.substring(1))}function c(e,t){var n,r=d(e);s(e,t)&&(e.className=(n=r.replace(" "+t+" "," ")).substring(1,n.length-1))}function d(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return r},"function"==typeof define&&define.amd?define(t):e.exports=t()},14779:function(e,t,n){var r=n(5826);e.exports=function e(t,n,a){if(r(n)||(a=n||a,n=[]),a=a||{},t instanceof RegExp){var i,l,s=n,d=t.source.match(/\((?!\?)/g);if(d)for(var f=0;f<d.length;f++)s.push({name:f,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return t.keys=s,t}if(r(t)){for(var p,m=n,h=a,g=[],b=0;b<t.length;b++)g.push(e(t[b],m,h).source);return(p=RegExp("(?:"+g.join("|")+")",u(h))).keys=m,p}return i=n,c(o(t,l=a),i,l)},e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=c;var a=RegExp("(\\\\.)|([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))","g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var c,d,f=n[0],p=n[1],m=n.index;if(l+=e.slice(i,m),i=m+f.length,p){l+=p[1];continue}var h=e[i],g=n[2],b=n[3],y=n[4],v=n[5],k=n[6],w=n[7];l&&(r.push(l),l="");var x=null!=g&&null!=h&&h!==g,S="+"===k||"*"===k,E="?"===k||"*"===k,_=g||u,C=y||v,T=g||("string"==typeof r[r.length-1]?r[r.length-1]:"");r.push({name:b||o++,prefix:g||"",delimiter:_,optional:E,repeat:S,partial:x,asterisk:!!w,pattern:C?C.replace(/([=!:$\/()])/g,"\\$1"):w?".*":(c=_,!(d=T)||d.indexOf(c)>-1?"[^"+s(c)+"]+?":s(d)+"|(?:(?!"+s(d)+")[^"+s(c)+"])+?")})}return i<e.length&&(l+=e.substr(i)),l&&r.push(l),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function l(e,t){for(var n=Array(e.length),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=RegExp("^(?:"+e[a].pattern+")$",u(t)));return function(t,a){for(var o="",l=t||{},s=(a||{}).pretty?i:encodeURIComponent,u=0;u<e.length;u++){var c,d=e[u];if("string"==typeof d){o+=d;continue}var f=l[d.name];if(null==f)if(d.optional){d.partial&&(o+=d.prefix);continue}else throw TypeError('Expected "'+d.name+'" to be defined');if(r(f)){if(!d.repeat)throw TypeError('Expected "'+d.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length)if(d.optional)continue;else throw TypeError('Expected "'+d.name+'" to not be empty');for(var p=0;p<f.length;p++){if(c=s(f[p]),!n[u].test(c))throw TypeError('Expected all "'+d.name+'" to match "'+d.pattern+'", but received `'+JSON.stringify(c)+"`");o+=(0===p?d.prefix:d.delimiter)+c}continue}if(c=d.asterisk?encodeURI(f).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}):s(f),!n[u].test(c))throw TypeError('Expected "'+d.name+'" to match "'+d.pattern+'", but received "'+c+'"');o+=d.prefix+c}return o}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function u(e){return e&&e.sensitive?"":"i"}function c(e,t,n){r(t)||(n=t||n,t=[]);for(var a,o=(n=n||{}).strict,i=!1!==n.end,l="",c=0;c<e.length;c++){var d=e[c];if("string"==typeof d)l+=s(d);else{var f=s(d.prefix),p="(?:"+d.pattern+")";t.push(d),d.repeat&&(p+="(?:"+f+p+")*"),l+=p=d.optional?d.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=s(n.delimiter||"/"),h=l.slice(-m.length)===m;return o||(l=(h?l.slice(0,-m.length):l)+"(?:"+m+"(?=$))?"),i?l+="$":l+=o&&h?"":"(?="+m+"|$)",(a=RegExp("^"+l,u(n))).keys=t,a}},57874:function(){!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism)},40728:function(){var e,t;(e=Prism).languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]},Object.keys(t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"}).forEach(function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}}),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})},77158:function(){!function(e){var t=/\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source,n=/(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)/.source.replace(/<SP_BS>/g,function(){return t}),r=/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source,a=/--[\w-]+=(?:<STR>|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(/<STR>/g,function(){return r}),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function l(e,t){return RegExp(e=e.replace(/<OPT>/g,function(){return a}).replace(/<SP>/g,function(){return n}),t)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:l(/(^(?:ONBUILD<SP>)?\w+<SP>)<OPT>(?:<SP><OPT>)*/.source,"i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:l(/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\b/.source,"i"),lookbehind:!0,greedy:!0},{pattern:l(/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\]+<SP>)AS/.source,"i"),lookbehind:!0,greedy:!0},{pattern:l(/(^ONBUILD<SP>)\w+/.source,"i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism)},29525:function(){Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}},74277:function(){Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},22444:function(){var e,t;t=/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/,(e=Prism).languages.json5=e.languages.extend("json",{property:[{pattern:RegExp(t.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:t,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})},96854:function(){var e=Prism;function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(a>=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return l}(n.tokens)}}}})},96836:function(){var e,t;(e=Prism).languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"],t=e.languages.extend("typescript",{}),delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript},81032:function(e,t,n){var r={"./prism-bash":"57874","./prism-diff":"40728","./prism-docker":"77158","./prism-ini":"29525","./prism-json":"74277","./prism-json5":"22444","./prism-typescript":"96836"};function a(e){return n(o(e))}function o(e){if(!n.o(r,e)){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=81032},92703:function(e,t,n){"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:function(e,t,n){e.exports=n(92703)()},50414:function(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},96787:function(e,t,n){"use strict";var r,a=n(63840),o=n(67294),i=n(73935);function l(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function s(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function u(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do 0!=(4098&(t=e).flags)&&(n=t.return),e=t.return;while(e)}return 3===t.tag?n:null}function c(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==(e=e.alternate)&&(t=e.memoizedState),null!==t)return t.dehydrated}return null}function d(e){if(u(e)!==e)throw Error(l(188))}var f=Object.assign,p=Symbol.for("react.element"),m=Symbol.for("react.transitional.element"),h=Symbol.for("react.portal"),g=Symbol.for("react.fragment"),b=Symbol.for("react.strict_mode"),y=Symbol.for("react.profiler"),v=Symbol.for("react.provider"),k=Symbol.for("react.consumer"),w=Symbol.for("react.context"),x=Symbol.for("react.forward_ref"),S=Symbol.for("react.suspense"),E=Symbol.for("react.suspense_list"),_=Symbol.for("react.memo"),C=Symbol.for("react.lazy");Symbol.for("react.scope");var T=Symbol.for("react.activity");Symbol.for("react.legacy_hidden"),Symbol.for("react.tracing_marker");var P=Symbol.for("react.memo_cache_sentinel");Symbol.for("react.view_transition");var A=Symbol.iterator;function O(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=A&&e[A]||e["@@iterator"])?e:null}var L=Symbol.for("react.client.reference"),j=Array.isArray,N=o.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,R=i.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,I={pending:!1,data:null,method:null,action:null},F=[],D=-1;function z(e){return{current:e}}function M(e){0>D||(e.current=F[D],F[D]=null,D--)}function $(e,t){F[++D]=e.current,e.current=t}var B=z(null),U=z(null),H=z(null),Q=z(null);function Z(e,t){switch($(H,t),$(U,e),$(B,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?ui(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=ul(t=ui(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}M(B),$(B,e)}function V(){M(B),M(U),M(H)}function W(e){null!==e.memoizedState&&$(Q,e);var t=B.current,n=ul(t,e.type);t!==n&&($(U,e),$(B,n))}function q(e){U.current===e&&(M(B),M(U)),Q.current===e&&(M(Q),uY._currentValue=I)}var G=Object.prototype.hasOwnProperty,Y=a.unstable_scheduleCallback,K=a.unstable_cancelCallback,X=a.unstable_shouldYield,J=a.unstable_requestPaint,ee=a.unstable_now,et=a.unstable_getCurrentPriorityLevel,en=a.unstable_ImmediatePriority,er=a.unstable_UserBlockingPriority,ea=a.unstable_NormalPriority,eo=a.unstable_LowPriority,ei=a.unstable_IdlePriority,el=a.log,es=a.unstable_setDisableYieldValue,eu=null,ec=null;function ed(e){if("function"==typeof el&&es(e),ec&&"function"==typeof ec.setStrictMode)try{ec.setStrictMode(eu,e)}catch(e){}}var ef=Math.clz32?Math.clz32:function(e){return 0==(e>>>=0)?32:31-(ep(e)/em|0)|0},ep=Math.log,em=Math.LN2,eh=256,eg=4194304;function eb(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194048&e;case 4194304:case 8388608:case 0x1000000:case 0x2000000:return 0x3c00000&e;case 0x4000000:return 0x4000000;case 0x8000000:return 0x8000000;case 0x10000000:return 0x10000000;case 0x20000000:return 0x20000000;case 0x40000000:return 0;default:return e}}function ey(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var a=0,o=e.suspendedLanes,i=e.pingedLanes;e=e.warmLanes;var l=0x7ffffff&r;return 0!==l?0!=(r=l&~o)?a=eb(r):0!=(i&=l)?a=eb(i):n||0!=(n=l&~e)&&(a=eb(n)):0!=(l=r&~o)?a=eb(l):0!==i?a=eb(i):n||0!=(n=r&~e)&&(a=eb(n)),0===a?0:0!==t&&t!==a&&0==(t&o)&&((o=a&-a)>=(n=t&-t)||32===o&&0!=(4194048&n))?t:a}function ev(e,t){return 0==(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function ek(){var e=eh;return 0==(4194048&(eh<<=1))&&(eh=256),e}function ew(){var e=eg;return 0==(0x3c00000&(eg<<=1))&&(eg=4194304),e}function ex(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function eS(e,t){e.pendingLanes|=t,0x10000000!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function eE(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-ef(t);e.entangledLanes|=t,e.entanglements[r]=0x40000000|e.entanglements[r]|4194090&n}function e_(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-ef(n),a=1<<r;a&t|e[r]&t&&(e[r]|=t),n&=~a}}function eC(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 0x1000000:case 0x2000000:e=128;break;case 0x10000000:e=0x8000000;break;default:e=0}return e}function eT(e){return 2<(e&=-e)?8<e?0!=(0x7ffffff&e)?32:0x10000000:8:2}function eP(){var e=R.p;return 0!==e?e:void 0===(e=window.event)?32:ce(e.type)}var eA=Math.random().toString(36).slice(2),eO="__reactFiber$"+eA,eL="__reactProps$"+eA,ej="__reactContainer$"+eA,eN="__reactEvents$"+eA,eR="__reactListeners$"+eA,eI="__reactHandles$"+eA,eF="__reactResources$"+eA,eD="__reactMarker$"+eA;function ez(e){delete e[eO],delete e[eL],delete e[eN],delete e[eR],delete e[eI]}function eM(e){var t=e[eO];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ej]||n[eO]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uw(e);null!==e;){if(n=e[eO])return n;e=uw(e)}return t}n=(e=n).parentNode}return null}function e$(e){if(e=e[eO]||e[ej]){var t=e.tag;if(5===t||6===t||13===t||26===t||27===t||3===t)return e}return null}function eB(e){var t=e.tag;if(5===t||26===t||27===t||6===t)return e.stateNode;throw Error(l(33))}function eU(e){var t=e[eF];return t||(t=e[eF]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function eH(e){e[eD]=!0}var eQ=new Set,eZ={};function eV(e,t){eW(e,t),eW(e+"Capture",t)}function eW(e,t){for(eZ[e]=t,e=0;e<t.length;e++)eQ.add(t[e])}var eq=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),eG={},eY={};function eK(e,t,n){if(G.call(eY,t)||!G.call(eG,t)&&(eq.test(t)?eY[t]=!0:(eG[t]=!0,!1)))if(null===n)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var r=t.toLowerCase().slice(0,5);if("data-"!==r&&"aria-"!==r)return void e.removeAttribute(t)}e.setAttribute(t,""+n)}}function eX(e,t,n){if(null===n)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,""+n)}}function eJ(e,t,n,r){if(null===r)e.removeAttribute(n);else{switch(typeof r){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(n);return}e.setAttributeNS(t,n,""+r)}}function e0(e){if(void 0===tR)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);tR=t&&t[1]||"",tI=-1<e.stack.indexOf("\n at")?" (<anonymous>)":-1<e.stack.indexOf("@")?"@unknown:0:0":""}return"\n"+tR+e+tI}var e1=!1;function e2(e,t){if(!e||e1)return"";e1=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var r={DetermineComponentFrameRoot:function(){try{if(t){var n=function(){throw Error()};if(Object.defineProperty(n.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(n,[])}catch(e){var r=e}Reflect.construct(e,[],n)}else{try{n.call()}catch(e){r=e}e.call(n.prototype)}}else{try{throw Error()}catch(e){r=e}(n=e())&&"function"==typeof n.catch&&n.catch(function(){})}}catch(e){if(e&&r&&"string"==typeof e.stack)return[e.stack,r.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var a=Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,"name");a&&a.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var o=r.DetermineComponentFrameRoot(),i=o[0],l=o[1];if(i&&l){var s=i.split("\n"),u=l.split("\n");for(a=r=0;r<s.length&&!s[r].includes("DetermineComponentFrameRoot");)r++;for(;a<u.length&&!u[a].includes("DetermineComponentFrameRoot");)a++;if(r===s.length||a===u.length)for(r=s.length-1,a=u.length-1;1<=r&&0<=a&&s[r]!==u[a];)a--;for(;1<=r&&0<=a;r--,a--)if(s[r]!==u[a]){if(1!==r||1!==a)do if(r--,a--,0>a||s[r]!==u[a]){var c="\n"+s[r].replace(" at new "," at ");return e.displayName&&c.includes("<anonymous>")&&(c=c.replace("<anonymous>",e.displayName)),c}while(1<=r&&0<=a);break}}}finally{e1=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?e0(n):""}function e4(e){try{var t="";do t+=function(e){switch(e.tag){case 26:case 27:case 5:return e0(e.type);case 16:return e0("Lazy");case 13:return e0("Suspense");case 19:return e0("SuspenseList");case 0:case 15:return e2(e.type,!1);case 11:return e2(e.type.render,!1);case 1:return e2(e.type,!0);case 31:return e0("Activity");default:return""}}(e),e=e.return;while(e);return t}catch(e){return"\nError generating stack: "+e.message+"\n"+e.stack}}function e3(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function e6(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function e9(e){e._valueTracker||(e._valueTracker=function(e){var t=e6(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function e8(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=e6(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function e5(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}var e7=/[\n"\\]/g;function te(e){return e.replace(e7,function(e){return"\\"+e.charCodeAt(0).toString(16)+" "})}function tt(e,t,n,r,a,o,i,l){e.name="",null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i?e.type=i:e.removeAttribute("type"),null!=t?"number"===i?(0===t&&""===e.value||e.value!=t)&&(e.value=""+e3(t)):e.value!==""+e3(t)&&(e.value=""+e3(t)):"submit"!==i&&"reset"!==i||e.removeAttribute("value"),null!=t?tr(e,i,e3(t)):null!=n?tr(e,i,e3(n)):null!=r&&e.removeAttribute("value"),null==a&&null!=o&&(e.defaultChecked=!!o),null!=a&&(e.checked=a&&"function"!=typeof a&&"symbol"!=typeof a),null!=l&&"function"!=typeof l&&"symbol"!=typeof l&&"boolean"!=typeof l?e.name=""+e3(l):e.removeAttribute("name")}function tn(e,t,n,r,a,o,i,l){if(null!=o&&"function"!=typeof o&&"symbol"!=typeof o&&"boolean"!=typeof o&&(e.type=o),null!=t||null!=n){if(("submit"===o||"reset"===o)&&null==t)return;n=null!=n?""+e3(n):"",t=null!=t?""+e3(t):n,l||t===e.value||(e.value=t),e.defaultValue=t}r="function"!=typeof(r=null!=r?r:a)&&"symbol"!=typeof r&&!!r,e.checked=l?e.checked:!!r,e.defaultChecked=!!r,null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i&&(e.name=i)}function tr(e,t,n){"number"===t&&e5(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function ta(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(a=0,n=""+e3(n),t=null;a<e.length;a++){if(e[a].value===n){e[a].selected=!0,r&&(e[a].defaultSelected=!0);return}null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function to(e,t,n){if(null!=t&&((t=""+e3(t))!==e.value&&(e.value=t),null==n)){e.defaultValue!==t&&(e.defaultValue=t);return}e.defaultValue=null!=n?""+e3(n):""}function ti(e,t,n,r){if(null==t){if(null!=r){if(null!=n)throw Error(l(92));if(j(r)){if(1<r.length)throw Error(l(93));r=r[0]}n=r}null==n&&(n=""),t=n}e.defaultValue=n=e3(t),(r=e.textContent)===n&&""!==r&&null!==r&&(e.value=r)}function tl(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType){n.nodeValue=t;return}}e.textContent=t}var ts=new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" "));function tu(e,t,n){var r=0===t.indexOf("--");null==n||"boolean"==typeof n||""===n?r?e.setProperty(t,""):"float"===t?e.cssFloat="":e[t]="":r?e.setProperty(t,n):"number"!=typeof n||0===n||ts.has(t)?"float"===t?e.cssFloat=n:e[t]=(""+n).trim():e[t]=n+"px"}function tc(e,t,n){if(null!=t&&"object"!=typeof t)throw Error(l(62));if(e=e.style,null!=n){for(var r in n)!n.hasOwnProperty(r)||null!=t&&t.hasOwnProperty(r)||(0===r.indexOf("--")?e.setProperty(r,""):"float"===r?e.cssFloat="":e[r]="");for(var a in t)r=t[a],t.hasOwnProperty(a)&&n[a]!==r&&tu(e,a,r)}else for(var o in t)t.hasOwnProperty(o)&&tu(e,o,t[o])}function td(e){if(-1===e.indexOf("-"))return!1;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var tf=new Map([["acceptCharset","accept-charset"],["htmlFor","for"],["httpEquiv","http-equiv"],["crossOrigin","crossorigin"],["accentHeight","accent-height"],["alignmentBaseline","alignment-baseline"],["arabicForm","arabic-form"],["baselineShift","baseline-shift"],["capHeight","cap-height"],["clipPath","clip-path"],["clipRule","clip-rule"],["colorInterpolation","color-interpolation"],["colorInterpolationFilters","color-interpolation-filters"],["colorProfile","color-profile"],["colorRendering","color-rendering"],["dominantBaseline","dominant-baseline"],["enableBackground","enable-background"],["fillOpacity","fill-opacity"],["fillRule","fill-rule"],["floodColor","flood-color"],["floodOpacity","flood-opacity"],["fontFamily","font-family"],["fontSize","font-size"],["fontSizeAdjust","font-size-adjust"],["fontStretch","font-stretch"],["fontStyle","font-style"],["fontVariant","font-variant"],["fontWeight","font-weight"],["glyphName","glyph-name"],["glyphOrientationHorizontal","glyph-orientation-horizontal"],["glyphOrientationVertical","glyph-orientation-vertical"],["horizAdvX","horiz-adv-x"],["horizOriginX","horiz-origin-x"],["imageRendering","image-rendering"],["letterSpacing","letter-spacing"],["lightingColor","lighting-color"],["markerEnd","marker-end"],["markerMid","marker-mid"],["markerStart","marker-start"],["overlinePosition","overline-position"],["overlineThickness","overline-thickness"],["paintOrder","paint-order"],["panose-1","panose-1"],["pointerEvents","pointer-events"],["renderingIntent","rendering-intent"],["shapeRendering","shape-rendering"],["stopColor","stop-color"],["stopOpacity","stop-opacity"],["strikethroughPosition","strikethrough-position"],["strikethroughThickness","strikethrough-thickness"],["strokeDasharray","stroke-dasharray"],["strokeDashoffset","stroke-dashoffset"],["strokeLinecap","stroke-linecap"],["strokeLinejoin","stroke-linejoin"],["strokeMiterlimit","stroke-miterlimit"],["strokeOpacity","stroke-opacity"],["strokeWidth","stroke-width"],["textAnchor","text-anchor"],["textDecoration","text-decoration"],["textRendering","text-rendering"],["transformOrigin","transform-origin"],["underlinePosition","underline-position"],["underlineThickness","underline-thickness"],["unicodeBidi","unicode-bidi"],["unicodeRange","unicode-range"],["unitsPerEm","units-per-em"],["vAlphabetic","v-alphabetic"],["vHanging","v-hanging"],["vIdeographic","v-ideographic"],["vMathematical","v-mathematical"],["vectorEffect","vector-effect"],["vertAdvY","vert-adv-y"],["vertOriginX","vert-origin-x"],["vertOriginY","vert-origin-y"],["wordSpacing","word-spacing"],["writingMode","writing-mode"],["xmlnsXlink","xmlns:xlink"],["xHeight","x-height"]]),tp=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;function tm(e){return tp.test(""+e)?"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')":e}var th=null;function tg(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var tb=null,ty=null;function tv(e){var t=e$(e);if(t&&(e=t.stateNode)){var n=e[eL]||null;switch(e=t.stateNode,t.type){case"input":if(tt(e,n.value,n.defaultValue,n.defaultValue,n.checked,n.defaultChecked,n.type,n.name),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll('input[name="'+te(""+t)+'"][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var a=r[eL]||null;if(!a)throw Error(l(90));tt(r,a.value,a.defaultValue,a.defaultValue,a.checked,a.defaultChecked,a.type,a.name)}}for(t=0;t<n.length;t++)(r=n[t]).form===e.form&&e8(r)}break;case"textarea":to(e,n.value,n.defaultValue);break;case"select":null!=(t=n.value)&&ta(e,!!n.multiple,t,!1)}}}var tk=!1;function tw(e,t,n){if(tk)return e(t,n);tk=!0;try{return e(t)}finally{if(tk=!1,(null!==tb||null!==ty)&&(st(),tb&&(t=tb,e=ty,ty=tb=null,tv(t),e)))for(t=0;t<e.length;t++)tv(e[t])}}function tx(e,t){var n=e.stateNode;if(null===n)return null;var r=n[eL]||null;if(null===r)return null;switch(n=r[t],t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r="button"!==(e=e.type)&&"input"!==e&&"select"!==e&&"textarea"!==e),e=!r;break;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(l(231,t,typeof n));return n}var tS="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement,tE=!1;if(tS)try{var t_={};Object.defineProperty(t_,"passive",{get:function(){tE=!0}}),window.addEventListener("test",t_,t_),window.removeEventListener("test",t_,t_)}catch(e){tE=!1}var tC=null,tT=null,tP=null;function tA(){if(tP)return tP;var e,t,n=tT,r=n.length,a="value"in tC?tC.value:tC.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return tP=a.slice(e,1<t?1-t:void 0)}function tO(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function tL(){return!0}function tj(){return!1}function tN(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?tL:tj,this.isPropagationStopped=tj,this}return f(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=tL)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=tL)},persist:function(){},isPersistent:tL}),t}var tR,tI,tF,tD,tz,tM={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},t$=tN(tM),tB=f({},tM,{view:0,detail:0}),tU=tN(tB),tH=f({},tB,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:t0,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==tz&&(tz&&"mousemove"===e.type?(tF=e.screenX-tz.screenX,tD=e.screenY-tz.screenY):tD=tF=0,tz=e),tF)},movementY:function(e){return"movementY"in e?e.movementY:tD}}),tQ=tN(tH),tZ=tN(f({},tH,{dataTransfer:0})),tV=tN(f({},tB,{relatedTarget:0})),tW=tN(f({},tM,{animationName:0,elapsedTime:0,pseudoElement:0})),tq=tN(f({},tM,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}})),tG=tN(f({},tM,{data:0})),tY={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},tK={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},tX={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function tJ(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=tX[e])&&!!t[e]}function t0(){return tJ}var t1=tN(f({},tB,{key:function(e){if(e.key){var t=tY[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tO(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?tK[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:t0,charCode:function(e){return"keypress"===e.type?tO(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tO(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}})),t2=tN(f({},tH,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),t4=tN(f({},tB,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:t0})),t3=tN(f({},tM,{propertyName:0,elapsedTime:0,pseudoElement:0})),t6=tN(f({},tH,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0})),t9=tN(f({},tM,{newState:0,oldState:0})),t8=[9,13,27,32],t5=tS&&"CompositionEvent"in window,t7=null;tS&&"documentMode"in document&&(t7=document.documentMode);var ne=tS&&"TextEvent"in window&&!t7,nt=tS&&(!t5||t7&&8<t7&&11>=t7),nn=!1;function nr(e,t){switch(e){case"keyup":return -1!==t8.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function na(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var no=!1,ni={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function nl(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!ni[e.type]:"textarea"===t}function ns(e,t,n,r){tb?ty?ty.push(r):ty=[r]:tb=r,0<(t=s2(t,"onChange")).length&&(n=new t$("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var nu=null,nc=null;function nd(e){sq(e,0)}function nf(e){if(e8(eB(e)))return e}function np(e,t){if("change"===e)return t}var nm=!1;if(tS){if(tS){var nh="oninput"in document;if(!nh){var ng=document.createElement("div");ng.setAttribute("oninput","return;"),nh="function"==typeof ng.oninput}r=nh}else r=!1;nm=r&&(!document.documentMode||9<document.documentMode)}function nb(){nu&&(nu.detachEvent("onpropertychange",ny),nc=nu=null)}function ny(e){if("value"===e.propertyName&&nf(nc)){var t=[];ns(t,nc,e,tg(e)),tw(nd,t)}}function nv(e,t,n){"focusin"===e?(nb(),nu=t,nc=n,nu.attachEvent("onpropertychange",ny)):"focusout"===e&&nb()}function nk(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return nf(nc)}function nw(e,t){if("click"===e)return nf(t)}function nx(e,t){if("input"===e||"change"===e)return nf(t)}var nS="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function nE(e,t){if(nS(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var a=n[r];if(!G.call(t,a)||!nS(e[a],t[a]))return!1}return!0}function n_(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function nC(e,t){var n,r=n_(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=n_(r)}}function nT(e){e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window;for(var t=e5(e.document);t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(n)e=t.contentWindow;else break;t=e5(e.document)}return t}function nP(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var nA=tS&&"documentMode"in document&&11>=document.documentMode,nO=null,nL=null,nj=null,nN=!1;function nR(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;nN||null==nO||nO!==e5(r)||(r="selectionStart"in(r=nO)&&nP(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},nj&&nE(nj,r)||(nj=r,0<(r=s2(nL,"onSelect")).length&&(t=new t$("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=nO)))}function nI(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var nF={animationend:nI("Animation","AnimationEnd"),animationiteration:nI("Animation","AnimationIteration"),animationstart:nI("Animation","AnimationStart"),transitionrun:nI("Transition","TransitionRun"),transitionstart:nI("Transition","TransitionStart"),transitioncancel:nI("Transition","TransitionCancel"),transitionend:nI("Transition","TransitionEnd")},nD={},nz={};function nM(e){if(nD[e])return nD[e];if(!nF[e])return e;var t,n=nF[e];for(t in n)if(n.hasOwnProperty(t)&&t in nz)return nD[e]=n[t];return e}tS&&(nz=document.createElement("div").style,"AnimationEvent"in window||(delete nF.animationend.animation,delete nF.animationiteration.animation,delete nF.animationstart.animation),"TransitionEvent"in window||delete nF.transitionend.transition);var n$=nM("animationend"),nB=nM("animationiteration"),nU=nM("animationstart"),nH=nM("transitionrun"),nQ=nM("transitionstart"),nZ=nM("transitioncancel"),nV=nM("transitionend"),nW=new Map,nq="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function nG(e,t){nW.set(e,t),eV(t,[e])}nq.push("scrollEnd");var nY=new WeakMap;function nK(e,t){if("object"==typeof e&&null!==e){var n=nY.get(e);return void 0!==n?n:(t={value:e,source:t,stack:e4(t)},nY.set(e,t),t)}return{value:e,source:t,stack:e4(t)}}var nX=[],nJ=0,n0=0;function n1(){for(var e=nJ,t=n0=nJ=0;t<e;){var n=nX[t];nX[t++]=null;var r=nX[t];nX[t++]=null;var a=nX[t];nX[t++]=null;var o=nX[t];if(nX[t++]=null,null!==r&&null!==a){var i=r.pending;null===i?a.next=a:(a.next=i.next,i.next=a),r.pending=a}0!==o&&n6(n,a,o)}}function n2(e,t,n,r){nX[nJ++]=e,nX[nJ++]=t,nX[nJ++]=n,nX[nJ++]=r,n0|=r,e.lanes|=r,null!==(e=e.alternate)&&(e.lanes|=r)}function n4(e,t,n,r){return n2(e,t,n,r),n9(e)}function n3(e,t){return n2(e,null,null,t),n9(e)}function n6(e,t,n){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n);for(var a=!1,o=e.return;null!==o;)o.childLanes|=n,null!==(r=o.alternate)&&(r.childLanes|=n),22===o.tag&&(null===(e=o.stateNode)||1&e._visibility||(a=!0)),e=o,o=o.return;return 3===e.tag?(o=e.stateNode,a&&null!==t&&(a=31-ef(n),null===(r=(e=o.hiddenUpdates)[a])?e[a]=[t]:r.push(t),t.lane=0x20000000|n),o):null}function n9(e){if(50<l4)throw l4=0,l3=null,Error(l(185));for(var t=e.return;null!==t;)t=(e=t).return;return 3===e.tag?e.stateNode:null}var n8={};function n5(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function n7(e,t,n,r){return new n5(e,t,n,r)}function re(e){return!(!(e=e.prototype)||!e.isReactComponent)}function rt(e,t){var n=e.alternate;return null===n?((n=n7(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=0x3e00000&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n.refCleanup=e.refCleanup,n}function rn(e,t){e.flags&=0x3e00002;var n=e.alternate;return null===n?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=n.childLanes,e.lanes=n.lanes,e.child=n.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=n.memoizedProps,e.memoizedState=n.memoizedState,e.updateQueue=n.updateQueue,e.type=n.type,e.dependencies=null===(t=n.dependencies)?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function rr(e,t,n,r,a,o){var i=0;if(r=e,"function"==typeof e)re(e)&&(i=1);else if("string"==typeof e)i=!function(e,t,n){if(1===n||null!=t.itemProp)return!1;switch(e){case"meta":case"title":return!0;case"style":if("string"!=typeof t.precedence||"string"!=typeof t.href||""===t.href)break;return!0;case"link":if("string"!=typeof t.rel||"string"!=typeof t.href||""===t.href||t.onLoad||t.onError)break;if("stylesheet"===t.rel)return e=t.disabled,"string"==typeof t.precedence&&null==e;return!0;case"script":if(t.async&&"function"!=typeof t.async&&"symbol"!=typeof t.async&&!t.onLoad&&!t.onError&&t.src&&"string"==typeof t.src)return!0}return!1}(e,n,B.current)?"html"===e||"head"===e||"body"===e?27:5:26;else e:switch(e){case T:return(e=n7(31,n,t,a)).elementType=T,e.lanes=o,e;case g:return ra(n.children,a,o,t);case b:i=8,a|=24;break;case y:return(e=n7(12,n,t,2|a)).elementType=y,e.lanes=o,e;case S:return(e=n7(13,n,t,a)).elementType=S,e.lanes=o,e;case E:return(e=n7(19,n,t,a)).elementType=E,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case v:case w:i=10;break e;case k:i=9;break e;case x:i=11;break e;case _:i=14;break e;case C:i=16,r=null;break e}i=29,n=Error(l(130,null===e?"null":typeof e,"")),r=null}return(t=n7(i,n,t,a)).elementType=e,t.type=r,t.lanes=o,t}function ra(e,t,n,r){return(e=n7(7,e,r,t)).lanes=n,e}function ro(e,t,n){return(e=n7(6,e,null,t)).lanes=n,e}function ri(e,t,n){return(t=n7(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var rl=[],rs=0,ru=null,rc=0,rd=[],rf=0,rp=null,rm=1,rh="";function rg(e,t){rl[rs++]=rc,rl[rs++]=ru,ru=e,rc=t}function rb(e,t,n){rd[rf++]=rm,rd[rf++]=rh,rd[rf++]=rp,rp=e;var r=rm;e=rh;var a=32-ef(r)-1;r&=~(1<<a),n+=1;var o=32-ef(t)+a;if(30<o){var i=a-a%5;o=(r&(1<<i)-1).toString(32),r>>=i,a-=i,rm=1<<32-ef(t)+a|n<<a|r,rh=o+e}else rm=1<<o|n<<a|r,rh=e}function ry(e){null!==e.return&&(rg(e,1),rb(e,1,0))}function rv(e){for(;e===ru;)ru=rl[--rs],rl[rs]=null,rc=rl[--rs],rl[rs]=null;for(;e===rp;)rp=rd[--rf],rd[rf]=null,rh=rd[--rf],rd[rf]=null,rm=rd[--rf],rd[rf]=null}var rk=null,rw=null,rx=!1,rS=null,rE=!1,r_=Error(l(519));function rC(e){throw rj(nK(Error(l(418,"")),e)),r_}function rT(e){var t=e.stateNode,n=e.type,r=e.memoizedProps;switch(t[eO]=e,t[eL]=r,n){case"dialog":sG("cancel",t),sG("close",t);break;case"iframe":case"object":case"embed":sG("load",t);break;case"video":case"audio":for(n=0;n<sV.length;n++)sG(sV[n],t);break;case"source":sG("error",t);break;case"img":case"image":case"link":sG("error",t),sG("load",t);break;case"details":sG("toggle",t);break;case"input":sG("invalid",t),tn(t,r.value,r.defaultValue,r.checked,r.defaultChecked,r.type,r.name,!0),e9(t);break;case"select":sG("invalid",t);break;case"textarea":sG("invalid",t),ti(t,r.value,r.defaultValue,r.children),e9(t)}"string"!=typeof(n=r.children)&&"number"!=typeof n&&"bigint"!=typeof n||t.textContent===""+n||!0===r.suppressHydrationWarning||s5(t.textContent,n)?(null!=r.popover&&(sG("beforetoggle",t),sG("toggle",t)),null!=r.onScroll&&sG("scroll",t),null!=r.onScrollEnd&&sG("scrollend",t),null!=r.onClick&&(t.onclick=s7),t=!0):t=!1,t||rC(e)}function rP(e){for(rk=e.return;rk;)switch(rk.tag){case 5:case 13:rE=!1;return;case 27:case 3:rE=!0;return;default:rk=rk.return}}function rA(e){if(e!==rk)return!1;if(!rx)return rP(e),rx=!0,!1;var t,n=e.tag;if((t=3!==n&&27!==n)&&((t=5===n)&&(t="form"===(t=e.type)||"button"===t||us(e.type,e.memoizedProps)),t=!t),t&&rw&&rC(e),rP(e),13===n){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(l(317));e:{for(n=0,e=e.nextSibling;e;){if(8===e.nodeType)if("/$"===(t=e.data)){if(0===n){rw=uv(e.nextSibling);break e}n--}else"$"!==t&&"$!"!==t&&"$?"!==t||n++;e=e.nextSibling}rw=null}}else 27===n?(n=rw,uh(e.type)?(e=uk,uk=null,rw=e):rw=n):rw=rk?uv(e.stateNode.nextSibling):null;return!0}function rO(){rw=rk=null,rx=!1}function rL(){var e=rS;return null!==e&&(null===lQ?lQ=e:lQ.push.apply(lQ,e),rS=null),e}function rj(e){null===rS?rS=[e]:rS.push(e)}var rN=z(null),rR=null,rI=null;function rF(e,t,n){$(rN,t._currentValue),t._currentValue=n}function rD(e){e._currentValue=rN.current,M(rN)}function rz(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function rM(e,t,n,r){var a=e.child;for(null!==a&&(a.return=e);null!==a;){var o=a.dependencies;if(null!==o){var i=a.child;o=o.firstContext;e:for(;null!==o;){var s=o;o=a;for(var u=0;u<t.length;u++)if(s.context===t[u]){o.lanes|=n,null!==(s=o.alternate)&&(s.lanes|=n),rz(o.return,n,e),r||(i=null);break e}o=s.next}}else if(18===a.tag){if(null===(i=a.return))throw Error(l(341));i.lanes|=n,null!==(o=i.alternate)&&(o.lanes|=n),rz(i,n,e),i=null}else i=a.child;if(null!==i)i.return=a;else for(i=a;null!==i;){if(i===e){i=null;break}if(null!==(a=i.sibling)){a.return=i.return,i=a;break}i=i.return}a=i}}function r$(e,t,n,r){e=null;for(var a=t,o=!1;null!==a;){if(!o){if(0!=(524288&a.flags))o=!0;else if(0!=(262144&a.flags))break}if(10===a.tag){var i=a.alternate;if(null===i)throw Error(l(387));if(null!==(i=i.memoizedProps)){var s=a.type;nS(a.pendingProps.value,i.value)||(null!==e?e.push(s):e=[s])}}else if(a===Q.current){if(null===(i=a.alternate))throw Error(l(387));i.memoizedState.memoizedState!==a.memoizedState.memoizedState&&(null!==e?e.push(uY):e=[uY])}a=a.return}null!==e&&rM(t,e,n,r),t.flags|=262144}function rB(e){for(e=e.firstContext;null!==e;){if(!nS(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function rU(e){rR=e,rI=null,null!==(e=e.dependencies)&&(e.firstContext=null)}function rH(e){return rZ(rR,e)}function rQ(e,t){return null===rR&&rU(e),rZ(e,t)}function rZ(e,t){var n=t._currentValue;if(t={context:t,memoizedValue:n,next:null},null===rI){if(null===e)throw Error(l(308));rI=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else rI=rI.next=t;return n}var rV="undefined"!=typeof AbortController?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(t,n){e.push(n)}};this.abort=function(){t.aborted=!0,e.forEach(function(e){return e()})}},rW=a.unstable_scheduleCallback,rq=a.unstable_NormalPriority,rG={$$typeof:w,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function rY(){return{controller:new rV,data:new Map,refCount:0}}function rK(e){e.refCount--,0===e.refCount&&rW(rq,function(){e.controller.abort()})}var rX=null,rJ=0,r0=0,r1=null;function r2(){if(0==--rJ&&null!==rX){null!==r1&&(r1.status="fulfilled");var e=rX;rX=null,r0=0,r1=null;for(var t=0;t<e.length;t++)(0,e[t])()}}var r4=N.S;N.S=function(e,t){"object"==typeof t&&null!==t&&"function"==typeof t.then&&function(e,t){if(null===rX){var n=rX=[];rJ=0,r0=sB(),r1={status:"pending",value:void 0,then:function(e){n.push(e)}}}rJ++,t.then(r2,r2)}(0,t),null!==r4&&r4(e,t)};var r3=z(null);function r6(){var e=r3.current;return null!==e?e:lP.pooledCache}function r9(e,t){null===t?$(r3,r3.current):$(r3,t.pool)}function r8(){var e=r6();return null===e?null:{parent:rG._currentValue,pool:e}}var r5=Error(l(460)),r7=Error(l(474)),ae=Error(l(542)),at={then:function(){}};function an(e){return"fulfilled"===(e=e.status)||"rejected"===e}function ar(){}function aa(e,t,n){switch(void 0===(n=e[n])?e.push(t):n!==t&&(t.then(ar,ar),t=n),t.status){case"fulfilled":return t.value;case"rejected":throw al(e=t.reason),e;default:if("string"==typeof t.status)t.then(ar,ar);else{if(null!==(e=lP)&&100<e.shellSuspendCounter)throw Error(l(482));(e=t).status="pending",e.then(function(e){if("pending"===t.status){var n=t;n.status="fulfilled",n.value=e}},function(e){if("pending"===t.status){var n=t;n.status="rejected",n.reason=e}})}switch(t.status){case"fulfilled":return t.value;case"rejected":throw al(e=t.reason),e}throw ao=t,r5}}var ao=null;function ai(){if(null===ao)throw Error(l(459));var e=ao;return ao=null,e}function al(e){if(e===r5||e===ae)throw Error(l(483))}var as=!1;function au(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function ac(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function ad(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function af(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&lT)){var a=r.pending;return null===a?t.next=t:(t.next=a.next,a.next=t),r.pending=t,t=n9(e),n6(e,null,n),t}return n2(e,r,t,n),n9(e)}function ap(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194048&n))){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,e_(e,n)}}function am(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};null===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var ah=!1;function ag(){if(ah){var e=r1;if(null!==e)throw e}}function ab(e,t,n,r){ah=!1;var a=e.updateQueue;as=!1;var o=a.firstBaseUpdate,i=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var s=l,u=s.next;s.next=null,null===i?o=u:i.next=u,i=s;var c=e.alternate;null!==c&&(l=(c=c.updateQueue).lastBaseUpdate)!==i&&(null===l?c.firstBaseUpdate=u:l.next=u,c.lastBaseUpdate=s)}if(null!==o){var d=a.baseState;for(i=0,c=u=s=null,l=o;;){var p=-0x20000001&l.lane,m=p!==l.lane;if(m?(lO&p)===p:(r&p)===p){0!==p&&p===r0&&(ah=!0),null!==c&&(c=c.next={lane:0,tag:l.tag,payload:l.payload,callback:null,next:null});e:{var h=e,g=l;switch(p=t,g.tag){case 1:if("function"==typeof(h=g.payload)){d=h.call(n,d,p);break e}d=h;break e;case 3:h.flags=-65537&h.flags|128;case 0:if(null==(p="function"==typeof(h=g.payload)?h.call(n,d,p):h))break e;d=f({},d,p);break e;case 2:as=!0}}null!==(p=l.callback)&&(e.flags|=64,m&&(e.flags|=8192),null===(m=a.callbacks)?a.callbacks=[p]:m.push(p))}else m={lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===c?(u=c=m,s=d):c=c.next=m,i|=p;if(null===(l=l.next))if(null===(l=a.shared.pending))break;else l=(m=l).next,m.next=null,a.lastBaseUpdate=m,a.shared.pending=null}null===c&&(s=d),a.baseState=s,a.firstBaseUpdate=u,a.lastBaseUpdate=c,null===o&&(a.shared.lanes=0),lz|=i,e.lanes=i,e.memoizedState=d}}function ay(e,t){if("function"!=typeof e)throw Error(l(191,e));e.call(t)}function av(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;e<n.length;e++)ay(n[e],t)}var ak=z(null),aw=z(0);function ax(e,t){$(aw,e=lF),$(ak,t),lF=e|t.baseLanes}function aS(){$(aw,lF),$(ak,ak.current)}function aE(){lF=aw.current,M(ak),M(aw)}var a_=0,aC=null,aT=null,aP=null,aA=!1,aO=!1,aL=!1,aj=0,aN=0,aR=null,aI=0;function aF(){throw Error(l(321))}function aD(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!nS(e[n],t[n]))return!1;return!0}function az(e,t,n,r,a,o){return a_=o,aC=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,N.H=null===e||null===e.memoizedState?oQ:oZ,aL=!1,o=n(r,a),aL=!1,aO&&(o=a$(t,n,r,a)),aM(e),o}function aM(e){N.H=oH;var t=null!==aT&&null!==aT.next;if(a_=0,aP=aT=aC=null,aA=!1,aN=0,aR=null,t)throw Error(l(300));null===e||ib||null!==(e=e.dependencies)&&rB(e)&&(ib=!0)}function a$(e,t,n,r){aC=e;var a=0;do{if(aO&&(aR=null),aN=0,aO=!1,25<=a)throw Error(l(301));if(a+=1,aP=aT=null,null!=e.updateQueue){var o=e.updateQueue;o.lastEffect=null,o.events=null,o.stores=null,null!=o.memoCache&&(o.memoCache.index=0)}N.H=oV,o=t(n,r)}while(aO);return o}function aB(){var e=N.H,t=e.useState()[0];return t="function"==typeof t.then?aq(t):t,e=e.useState()[0],(null!==aT?aT.memoizedState:null)!==e&&(aC.flags|=1024),t}function aU(){var e=0!==aj;return aj=0,e}function aH(e,t,n){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n}function aQ(e){if(aA){for(e=e.memoizedState;null!==e;){var t=e.queue;null!==t&&(t.pending=null),e=e.next}aA=!1}a_=0,aP=aT=aC=null,aO=!1,aN=aj=0,aR=null}function aZ(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===aP?aC.memoizedState=aP=e:aP=aP.next=e,aP}function aV(){if(null===aT){var e=aC.alternate;e=null!==e?e.memoizedState:null}else e=aT.next;var t=null===aP?aC.memoizedState:aP.next;if(null!==t)aP=t,aT=e;else{if(null===e){if(null===aC.alternate)throw Error(l(467));throw Error(l(310))}e={memoizedState:(aT=e).memoizedState,baseState:aT.baseState,baseQueue:aT.baseQueue,queue:aT.queue,next:null},null===aP?aC.memoizedState=aP=e:aP=aP.next=e}return aP}function aW(){return{lastEffect:null,events:null,stores:null,memoCache:null}}function aq(e){var t=aN;return aN+=1,null===aR&&(aR=[]),e=aa(aR,e,t),t=aC,null===(null===aP?t.memoizedState:aP.next)&&(N.H=null===(t=t.alternate)||null===t.memoizedState?oQ:oZ),e}function aG(e){if(null!==e&&"object"==typeof e){if("function"==typeof e.then)return aq(e);if(e.$$typeof===w)return rH(e)}throw Error(l(438,String(e)))}function aY(e){var t=null,n=aC.updateQueue;if(null!==n&&(t=n.memoCache),null==t){var r=aC.alternate;null!==r&&null!==(r=r.updateQueue)&&null!=(r=r.memoCache)&&(t={data:r.data.map(function(e){return e.slice()}),index:0})}if(null==t&&(t={data:[],index:0}),null===n&&(n=aW(),aC.updateQueue=n),n.memoCache=t,void 0===(n=t.data[t.index]))for(n=t.data[t.index]=Array(e),r=0;r<e;r++)n[r]=P;return t.index++,n}function aK(e,t){return"function"==typeof t?t(e):t}function aX(e){return aJ(aV(),aT,e)}function aJ(e,t,n){var r=e.queue;if(null===r)throw Error(l(311));r.lastRenderedReducer=n;var a=e.baseQueue,o=r.pending;if(null!==o){if(null!==a){var i=a.next;a.next=o.next,o.next=i}t.baseQueue=a=o,r.pending=null}if(o=e.baseState,null===a)e.memoizedState=o;else{t=a.next;var s=i=null,u=null,c=t,d=!1;do{var f=-0x20000001&c.lane;if(f!==c.lane?(lO&f)===f:(a_&f)===f){var p=c.revertLane;if(0===p)null!==u&&(u=u.next={lane:0,revertLane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),f===r0&&(d=!0);else if((a_&p)===p){c=c.next,p===r0&&(d=!0);continue}else f={lane:0,revertLane:c.revertLane,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null},null===u?(s=u=f,i=o):u=u.next=f,aC.lanes|=p,lz|=p;f=c.action,aL&&n(o,f),o=c.hasEagerState?c.eagerState:n(o,f)}else p={lane:f,revertLane:c.revertLane,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null},null===u?(s=u=p,i=o):u=u.next=p,aC.lanes|=f,lz|=f;c=c.next}while(null!==c&&c!==t);if(null===u?i=o:u.next=s,!nS(o,e.memoizedState)&&(ib=!0,d&&null!==(n=r1)))throw n;e.memoizedState=o,e.baseState=i,e.baseQueue=u,r.lastRenderedState=o}return null===a&&(r.lanes=0),[e.memoizedState,r.dispatch]}function a0(e){var t=aV(),n=t.queue;if(null===n)throw Error(l(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,o=t.memoizedState;if(null!==a){n.pending=null;var i=a=a.next;do o=e(o,i.action),i=i.next;while(i!==a);nS(o,t.memoizedState)||(ib=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function a1(e,t,n){var r=aC,a=aV(),o=rx;if(o){if(void 0===n)throw Error(l(407));n=n()}else n=t();var i=!nS((aT||a).memoizedState,n);if(i&&(a.memoizedState=n,ib=!0),a=a.queue,oh(2048,8,a3.bind(null,r,a,e),[e]),a.getSnapshot!==t||i||null!==aP&&1&aP.memoizedState.tag){if(r.flags|=2048,od(9,of(),a4.bind(null,r,a,n,t),null),null===lP)throw Error(l(349));o||0!=(124&a_)||a2(r,t,n)}return n}function a2(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=aC.updateQueue)?(t=aW(),aC.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function a4(e,t,n,r){t.value=n,t.getSnapshot=r,a6(t)&&a9(e)}function a3(e,t,n){return n(function(){a6(t)&&a9(e)})}function a6(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!nS(e,n)}catch(e){return!0}}function a9(e){var t=n3(e,2);null!==t&&l8(t,e,2)}function a8(e){var t=aZ();if("function"==typeof e){var n=e;if(e=n(),aL){ed(!0);try{n()}finally{ed(!1)}}}return t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:aK,lastRenderedState:e},t}function a5(e,t,n,r){return e.baseState=n,aJ(e,aT,"function"==typeof r?r:aK)}function a7(e,t,n,r,a){if(o$(e))throw Error(l(485));if(null!==(e=t.action)){var o={payload:a,action:e,next:null,isTransition:!0,status:"pending",value:null,reason:null,listeners:[],then:function(e){o.listeners.push(e)}};null!==N.T?n(!0):o.isTransition=!1,r(o),null===(n=t.pending)?(o.next=t.pending=o,oe(t,o)):(o.next=n.next,t.pending=n.next=o)}}function oe(e,t){var n=t.action,r=t.payload,a=e.state;if(t.isTransition){var o=N.T,i={};N.T=i;try{var l=n(a,r),s=N.S;null!==s&&s(i,l),ot(e,t,l)}catch(n){or(e,t,n)}finally{N.T=o}}else try{o=n(a,r),ot(e,t,o)}catch(n){or(e,t,n)}}function ot(e,t,n){null!==n&&"object"==typeof n&&"function"==typeof n.then?n.then(function(n){on(e,t,n)},function(n){return or(e,t,n)}):on(e,t,n)}function on(e,t,n){t.status="fulfilled",t.value=n,oa(t),e.state=n,null!==(t=e.pending)&&((n=t.next)===t?e.pending=null:(n=n.next,t.next=n,oe(e,n)))}function or(e,t,n){var r=e.pending;if(e.pending=null,null!==r){r=r.next;do t.status="rejected",t.reason=n,oa(t),t=t.next;while(t!==r)}e.action=null}function oa(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}function oo(e,t){return t}function oi(e,t){if(rx){var n=lP.formState;if(null!==n){e:{var r=aC;if(rx){if(rw){t:{for(var a=rw,o=rE;8!==a.nodeType;)if(!o||null===(a=uv(a.nextSibling))){a=null;break t}a="F!"===(o=a.data)||"F"===o?a:null}if(a){rw=uv(a.nextSibling),r="F!"===a.data;break e}}rC(r)}r=!1}r&&(t=n[0])}}return(n=aZ()).memoizedState=n.baseState=t,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:oo,lastRenderedState:t},n.queue=r,n=oD.bind(null,aC,r),r.dispatch=n,r=a8(!1),o=oM.bind(null,aC,!1,r.queue),r=aZ(),a={state:t,dispatch:null,action:e,pending:null},r.queue=a,n=a7.bind(null,aC,a,o,n),a.dispatch=n,r.memoizedState=e,[t,n,!1]}function ol(e){return os(aV(),aT,e)}function os(e,t,n){if(t=aJ(e,t,oo)[0],e=aX(aK)[0],"object"==typeof t&&null!==t&&"function"==typeof t.then)try{var r=aq(t)}catch(e){if(e===r5)throw ae;throw e}else r=t;var a=(t=aV()).queue,o=a.dispatch;return n!==t.memoizedState&&(aC.flags|=2048,od(9,of(),ou.bind(null,a,n),null)),[r,o,e]}function ou(e,t){e.action=t}function oc(e){var t=aV(),n=aT;if(null!==n)return os(t,n,e);aV(),t=t.memoizedState;var r=(n=aV()).queue.dispatch;return n.memoizedState=e,[t,r,!1]}function od(e,t,n,r){return e={tag:e,create:n,deps:r,inst:t,next:null},null===(t=aC.updateQueue)&&(t=aW(),aC.updateQueue=t),null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function of(){return{destroy:void 0,resource:void 0}}function op(){return aV().memoizedState}function om(e,t,n,r){var a=aZ();r=void 0===r?null:r,aC.flags|=e,a.memoizedState=od(1|t,of(),n,r)}function oh(e,t,n,r){var a=aV();r=void 0===r?null:r;var o=a.memoizedState.inst;null!==aT&&null!==r&&aD(r,aT.memoizedState.deps)?a.memoizedState=od(t,o,n,r):(aC.flags|=e,a.memoizedState=od(1|t,o,n,r))}function og(e,t){om(8390656,8,e,t)}function ob(e,t){oh(2048,8,e,t)}function oy(e,t){return oh(4,2,e,t)}function ov(e,t){return oh(4,4,e,t)}function ok(e,t){if("function"==typeof t){var n=t(e=e());return function(){"function"==typeof n?n():t(null)}}if(null!=t)return t.current=e=e(),function(){t.current=null}}function ow(e,t,n){n=null!=n?n.concat([e]):null,oh(4,4,ok.bind(null,t,e),n)}function ox(){}function oS(e,t){var n=aV();t=void 0===t?null:t;var r=n.memoizedState;return null!==t&&aD(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function oE(e,t){var n=aV();t=void 0===t?null:t;var r=n.memoizedState;if(null!==t&&aD(t,r[1]))return r[0];if(r=e(),aL){ed(!0);try{e()}finally{ed(!1)}}return n.memoizedState=[r,t],r}function o_(e,t,n){return void 0===n||0!=(0x40000000&a_)?e.memoizedState=t:(e.memoizedState=n,e=l9(),aC.lanes|=e,lz|=e,n)}function oC(e,t,n,r){return nS(n,t)?n:null!==ak.current?(nS(e=o_(e,n,r),t)||(ib=!0),e):0==(42&a_)?(ib=!0,e.memoizedState=n):(e=l9(),aC.lanes|=e,lz|=e,t)}function oT(e,t,n,r,a){var o=R.p;R.p=0!==o&&8>o?o:8;var i=N.T,l={};N.T=l,oM(e,!1,t,n);try{var s=a(),u=N.S;if(null!==u&&u(l,s),null!==s&&"object"==typeof s&&"function"==typeof s.then){var c,d,f=(c=[],d={status:"pending",value:null,reason:null,then:function(e){c.push(e)}},s.then(function(){d.status="fulfilled",d.value=r;for(var e=0;e<c.length;e++)(0,c[e])(r)},function(e){for(d.status="rejected",d.reason=e,e=0;e<c.length;e++)(0,c[e])(void 0)}),d);oz(e,t,f,l6(e))}else oz(e,t,r,l6(e))}catch(n){oz(e,t,{then:function(){},status:"rejected",reason:n},l6())}finally{R.p=o,N.T=i}}function oP(){}function oA(e,t,n,r){if(5!==e.tag)throw Error(l(476));var a=oO(e).queue;oT(e,a,t,I,null===n?oP:function(){return oL(e),n(r)})}function oO(e){var t=e.memoizedState;if(null!==t)return t;var n={};return(t={memoizedState:I,baseState:I,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:aK,lastRenderedState:I},next:null}).next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:aK,lastRenderedState:n},next:null},e.memoizedState=t,null!==(e=e.alternate)&&(e.memoizedState=t),t}function oL(e){var t=oO(e).next.queue;oz(e,t,{},l6())}function oj(){return rH(uY)}function oN(){return aV().memoizedState}function oR(){return aV().memoizedState}function oI(e){for(var t=e.return;null!==t;){switch(t.tag){case 24:case 3:var n=l6(),r=af(t,e=ad(n),n);null!==r&&(l8(r,t,n),ap(r,t,n)),t={cache:rY()},e.payload=t;return}t=t.return}}function oF(e,t,n){var r=l6();n={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},o$(e)?oB(t,n):null!==(n=n4(e,t,n,r))&&(l8(n,e,r),oU(n,t,r))}function oD(e,t,n){oz(e,t,n,l6())}function oz(e,t,n,r){var a={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(o$(e))oB(t,a);else{var o=e.alternate;if(0===e.lanes&&(null===o||0===o.lanes)&&null!==(o=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=o(i,n);if(a.hasEagerState=!0,a.eagerState=l,nS(l,i))return n2(e,t,a,0),null===lP&&n1(),!1}catch(e){}finally{}if(null!==(n=n4(e,t,a,r)))return l8(n,e,r),oU(n,t,r),!0}return!1}function oM(e,t,n,r){if(r={lane:2,revertLane:sB(),action:r,hasEagerState:!1,eagerState:null,next:null},o$(e)){if(t)throw Error(l(479))}else null!==(t=n4(e,n,r,2))&&l8(t,e,2)}function o$(e){var t=e.alternate;return e===aC||null!==t&&t===aC}function oB(e,t){aO=aA=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function oU(e,t,n){if(0!=(4194048&n)){var r=t.lanes;r&=e.pendingLanes,t.lanes=n|=r,e_(e,n)}}var oH={readContext:rH,use:aG,useCallback:aF,useContext:aF,useEffect:aF,useImperativeHandle:aF,useLayoutEffect:aF,useInsertionEffect:aF,useMemo:aF,useReducer:aF,useRef:aF,useState:aF,useDebugValue:aF,useDeferredValue:aF,useTransition:aF,useSyncExternalStore:aF,useId:aF,useHostTransitionStatus:aF,useFormState:aF,useActionState:aF,useOptimistic:aF,useMemoCache:aF,useCacheRefresh:aF},oQ={readContext:rH,use:aG,useCallback:function(e,t){return aZ().memoizedState=[e,void 0===t?null:t],e},useContext:rH,useEffect:og,useImperativeHandle:function(e,t,n){n=null!=n?n.concat([e]):null,om(4194308,4,ok.bind(null,t,e),n)},useLayoutEffect:function(e,t){return om(4194308,4,e,t)},useInsertionEffect:function(e,t){om(4,2,e,t)},useMemo:function(e,t){var n=aZ();t=void 0===t?null:t;var r=e();if(aL){ed(!0);try{e()}finally{ed(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=aZ();if(void 0!==n){var a=n(t);if(aL){ed(!0);try{n(t)}finally{ed(!1)}}}else a=t;return r.memoizedState=r.baseState=a,r.queue=e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:a},e=e.dispatch=oF.bind(null,aC,e),[r.memoizedState,e]},useRef:function(e){return aZ().memoizedState=e={current:e}},useState:function(e){var t=(e=a8(e)).queue,n=oD.bind(null,aC,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ox,useDeferredValue:function(e,t){return o_(aZ(),e,t)},useTransition:function(){var e=a8(!1);return e=oT.bind(null,aC,e.queue,!0,!1),aZ().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=aC,a=aZ();if(rx){if(void 0===n)throw Error(l(407));n=n()}else{if(n=t(),null===lP)throw Error(l(349));0!=(124&lO)||a2(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,og(a3.bind(null,r,o,e),[e]),r.flags|=2048,od(9,of(),a4.bind(null,r,o,n,t),null),n},useId:function(){var e=aZ(),t=lP.identifierPrefix;if(rx){var n=rh,r=rm;t="\xab"+t+"R"+(n=(r&~(1<<32-ef(r)-1)).toString(32)+n),0<(n=aj++)&&(t+="H"+n.toString(32)),t+="\xbb"}else t="\xab"+t+"r"+(n=aI++).toString(32)+"\xbb";return e.memoizedState=t},useHostTransitionStatus:oj,useFormState:oi,useActionState:oi,useOptimistic:function(e){var t=aZ();t.memoizedState=t.baseState=e;var n={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=n,t=oM.bind(null,aC,!0,n),n.dispatch=t,[e,t]},useMemoCache:aY,useCacheRefresh:function(){return aZ().memoizedState=oI.bind(null,aC)}},oZ={readContext:rH,use:aG,useCallback:oS,useContext:rH,useEffect:ob,useImperativeHandle:ow,useInsertionEffect:oy,useLayoutEffect:ov,useMemo:oE,useReducer:aX,useRef:op,useState:function(){return aX(aK)},useDebugValue:ox,useDeferredValue:function(e,t){return oC(aV(),aT.memoizedState,e,t)},useTransition:function(){var e=aX(aK)[0],t=aV().memoizedState;return["boolean"==typeof e?e:aq(e),t]},useSyncExternalStore:a1,useId:oN,useHostTransitionStatus:oj,useFormState:ol,useActionState:ol,useOptimistic:function(e,t){return a5(aV(),aT,e,t)},useMemoCache:aY,useCacheRefresh:oR},oV={readContext:rH,use:aG,useCallback:oS,useContext:rH,useEffect:ob,useImperativeHandle:ow,useInsertionEffect:oy,useLayoutEffect:ov,useMemo:oE,useReducer:a0,useRef:op,useState:function(){return a0(aK)},useDebugValue:ox,useDeferredValue:function(e,t){var n=aV();return null===aT?o_(n,e,t):oC(n,aT.memoizedState,e,t)},useTransition:function(){var e=a0(aK)[0],t=aV().memoizedState;return["boolean"==typeof e?e:aq(e),t]},useSyncExternalStore:a1,useId:oN,useHostTransitionStatus:oj,useFormState:oc,useActionState:oc,useOptimistic:function(e,t){var n=aV();return null!==aT?a5(n,aT,e,t):(n.baseState=e,[e,n.queue.dispatch])},useMemoCache:aY,useCacheRefresh:oR},oW=null,oq=0;function oG(e){var t=oq;return oq+=1,null===oW&&(oW=[]),aa(oW,e,t)}function oY(e,t){e.ref=void 0!==(t=t.props.ref)?t:null}function oK(e,t){if(t.$$typeof===p)throw Error(l(525));throw Error(l(31,"[object Object]"===(e=Object.prototype.toString.call(t))?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function oX(e){return(0,e._init)(e._payload)}function oJ(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e){for(var t=new Map;null!==e;)null!==e.key?t.set(e.key,e):t.set(e.index,e),e=e.sibling;return t}function a(e,t){return(e=rt(e,t)).index=0,e.sibling=null,e}function o(t,n,r){return(t.index=r,e)?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=0x4000002,n):r:(t.flags|=0x4000002,n):(t.flags|=1048576,n)}function i(t){return e&&null===t.alternate&&(t.flags|=0x4000002),t}function s(e,t,n,r){return null===t||6!==t.tag?(t=ro(n,e.mode,r)).return=e:(t=a(t,n)).return=e,t}function u(e,t,n,r){var o=n.type;return o===g?d(e,t,n.props.children,r,n.key):(null!==t&&(t.elementType===o||"object"==typeof o&&null!==o&&o.$$typeof===C&&oX(o)===t.type)?oY(t=a(t,n.props),n):oY(t=rr(n.type,n.key,n.props,null,e.mode,r),n),t.return=e,t)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?(t=ri(n,e.mode,r)).return=e:(t=a(t,n.children||[])).return=e,t}function d(e,t,n,r,o){return null===t||7!==t.tag?(t=ra(n,e.mode,r,o)).return=e:(t=a(t,n)).return=e,t}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t||"bigint"==typeof t)return(t=ro(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case m:return oY(n=rr(t.type,t.key,t.props,null,e.mode,n),t),n.return=e,n;case h:return(t=ri(t,e.mode,n)).return=e,t;case C:return f(e,t=(0,t._init)(t._payload),n)}if(j(t)||O(t))return(t=ra(t,e.mode,n,null)).return=e,t;if("function"==typeof t.then)return f(e,oG(t),n);if(t.$$typeof===w)return f(e,rQ(e,t),n);oK(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n||"bigint"==typeof n)return null!==a?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case m:return n.key===a?u(e,t,n,r):null;case h:return n.key===a?c(e,t,n,r):null;case C:return p(e,t,n=(a=n._init)(n._payload),r)}if(j(n)||O(n))return null!==a?null:d(e,t,n,r,null);if("function"==typeof n.then)return p(e,t,oG(n),r);if(n.$$typeof===w)return p(e,t,rQ(e,n),r);oK(e,n)}return null}function b(e,t,n,r,a){if("string"==typeof r&&""!==r||"number"==typeof r||"bigint"==typeof r)return s(t,e=e.get(n)||null,""+r,a);if("object"==typeof r&&null!==r){switch(r.$$typeof){case m:return u(t,e=e.get(null===r.key?n:r.key)||null,r,a);case h:return c(t,e=e.get(null===r.key?n:r.key)||null,r,a);case C:return b(e,t,n,r=(0,r._init)(r._payload),a)}if(j(r)||O(r))return d(t,e=e.get(n)||null,r,a,null);if("function"==typeof r.then)return b(e,t,n,oG(r),a);if(r.$$typeof===w)return b(e,t,n,rQ(t,r),a);oK(t,r)}return null}return function(s,u,c,d){try{oq=0;var y=function s(u,c,d,y){if("object"==typeof d&&null!==d&&d.type===g&&null===d.key&&(d=d.props.children),"object"==typeof d&&null!==d){switch(d.$$typeof){case m:e:{for(var v=d.key;null!==c;){if(c.key===v){if((v=d.type)===g){if(7===c.tag){n(u,c.sibling),(y=a(c,d.props.children)).return=u,u=y;break e}}else if(c.elementType===v||"object"==typeof v&&null!==v&&v.$$typeof===C&&oX(v)===c.type){n(u,c.sibling),oY(y=a(c,d.props),d),y.return=u,u=y;break e}n(u,c);break}t(u,c),c=c.sibling}d.type===g?(y=ra(d.props.children,u.mode,y,d.key)).return=u:(oY(y=rr(d.type,d.key,d.props,null,u.mode,y),d),y.return=u),u=y}return i(u);case h:e:{for(v=d.key;null!==c;){if(c.key===v)if(4===c.tag&&c.stateNode.containerInfo===d.containerInfo&&c.stateNode.implementation===d.implementation){n(u,c.sibling),(y=a(c,d.children||[])).return=u,u=y;break e}else{n(u,c);break}t(u,c),c=c.sibling}(y=ri(d,u.mode,y)).return=u,u=y}return i(u);case C:return s(u,c,d=(v=d._init)(d._payload),y)}if(j(d))return function(a,i,l,s){for(var u=null,c=null,d=i,m=i=0,h=null;null!==d&&m<l.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var g=p(a,d,l[m],s);if(null===g){null===d&&(d=h);break}e&&d&&null===g.alternate&&t(a,d),i=o(g,i,m),null===c?u=g:c.sibling=g,c=g,d=h}if(m===l.length)return n(a,d),rx&&rg(a,m),u;if(null===d){for(;m<l.length;m++)null!==(d=f(a,l[m],s))&&(i=o(d,i,m),null===c?u=d:c.sibling=d,c=d);return rx&&rg(a,m),u}for(d=r(d);m<l.length;m++)null!==(h=b(d,a,m,l[m],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),i=o(h,i,m),null===c?u=h:c.sibling=h,c=h);return e&&d.forEach(function(e){return t(a,e)}),rx&&rg(a,m),u}(u,c,d,y);if(O(d)){if("function"!=typeof(v=O(d)))throw Error(l(150));return function(a,i,s,u){if(null==s)throw Error(l(151));for(var c=null,d=null,m=i,h=i=0,g=null,y=s.next();null!==m&&!y.done;h++,y=s.next()){m.index>h?(g=m,m=null):g=m.sibling;var v=p(a,m,y.value,u);if(null===v){null===m&&(m=g);break}e&&m&&null===v.alternate&&t(a,m),i=o(v,i,h),null===d?c=v:d.sibling=v,d=v,m=g}if(y.done)return n(a,m),rx&&rg(a,h),c;if(null===m){for(;!y.done;h++,y=s.next())null!==(y=f(a,y.value,u))&&(i=o(y,i,h),null===d?c=y:d.sibling=y,d=y);return rx&&rg(a,h),c}for(m=r(m);!y.done;h++,y=s.next())null!==(y=b(m,a,h,y.value,u))&&(e&&null!==y.alternate&&m.delete(null===y.key?h:y.key),i=o(y,i,h),null===d?c=y:d.sibling=y,d=y);return e&&m.forEach(function(e){return t(a,e)}),rx&&rg(a,h),c}(u,c,d=v.call(d),y)}if("function"==typeof d.then)return s(u,c,oG(d),y);if(d.$$typeof===w)return s(u,c,rQ(u,d),y);oK(u,d)}return"string"==typeof d&&""!==d||"number"==typeof d||"bigint"==typeof d?(d=""+d,null!==c&&6===c.tag?(n(u,c.sibling),(y=a(c,d)).return=u):(n(u,c),(y=ro(d,u.mode,y)).return=u),i(u=y)):n(u,c)}(s,u,c,d);return oW=null,y}catch(e){if(e===r5||e===ae)throw e;var v=n7(29,e,null,s.mode);return v.lanes=d,v.return=s,v}finally{}}}var o0=oJ(!0),o1=oJ(!1),o2=z(null),o4=null;function o3(e){var t=e.alternate;$(o5,1&o5.current),$(o2,e),null===o4&&(null===t||null!==ak.current?o4=e:null!==t.memoizedState&&(o4=e))}function o6(e){if(22===e.tag){if($(o5,o5.current),$(o2,e),null===o4){var t=e.alternate;null!==t&&null!==t.memoizedState&&(o4=e)}}else o9(e)}function o9(){$(o5,o5.current),$(o2,o2.current)}function o8(e){M(o2),o4===e&&(o4=null),M(o5)}var o5=z(0);function o7(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||uy(n)))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function ie(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:f({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var it={enqueueSetState:function(e,t,n){e=e._reactInternals;var r=l6(),a=ad(r);a.payload=t,null!=n&&(a.callback=n),null!==(t=af(e,a,r))&&(l8(t,e,r),ap(t,e,r))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=l6(),a=ad(r);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=af(e,a,r))&&(l8(t,e,r),ap(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=l6(),r=ad(n);r.tag=2,null!=t&&(r.callback=t),null!==(t=af(e,r,n))&&(l8(t,e,n),ap(t,e,n))}};function ir(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||!nE(n,r)||!nE(a,o)}function ia(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&it.enqueueReplaceState(t,t.state,null)}function io(e,t){var n=t;if("ref"in t)for(var r in n={},t)"ref"!==r&&(n[r]=t[r]);if(e=e.defaultProps)for(var a in n===t&&(n=f({},n)),e)void 0===n[a]&&(n[a]=e[a]);return n}var ii="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function il(e){ii(e)}function is(e){console.error(e)}function iu(e){ii(e)}function ic(e,t){try{(0,e.onUncaughtError)(t.value,{componentStack:t.stack})}catch(e){setTimeout(function(){throw e})}}function id(e,t,n){try{(0,e.onCaughtError)(n.value,{componentStack:n.stack,errorBoundary:1===t.tag?t.stateNode:null})}catch(e){setTimeout(function(){throw e})}}function ip(e,t,n){return(n=ad(n)).tag=3,n.payload={element:null},n.callback=function(){ic(e,t)},n}function im(e){return(e=ad(e)).tag=3,e}function ih(e,t,n,r){var a=n.type.getDerivedStateFromError;if("function"==typeof a){var o=r.value;e.payload=function(){return a(o)},e.callback=function(){id(t,n,r)}}var i=n.stateNode;null!==i&&"function"==typeof i.componentDidCatch&&(e.callback=function(){id(t,n,r),"function"!=typeof a&&(null===lG?lG=new Set([this]):lG.add(this));var e=r.stack;this.componentDidCatch(r.value,{componentStack:null!==e?e:""})})}var ig=Error(l(461)),ib=!1;function iy(e,t,n,r){t.child=null===e?o1(t,null,n,r):o0(t,e.child,n,r)}function iv(e,t,n,r,a){n=n.render;var o=t.ref;if("ref"in r){var i={};for(var l in r)"ref"!==l&&(i[l]=r[l])}else i=r;return(rU(t),r=az(e,t,n,i,o,a),l=aU(),null===e||ib)?(rx&&l&&ry(t),t.flags|=1,iy(e,t,r,a),t.child):(aH(e,t,a),iM(e,t,a))}function ik(e,t,n,r,a){if(null===e){var o=n.type;return"function"!=typeof o||re(o)||void 0!==o.defaultProps||null!==n.compare?((e=rr(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=o,iw(e,t,o,r,a))}if(o=e.child,!i$(e,a)){var i=o.memoizedProps;if((n=null!==(n=n.compare)?n:nE)(i,r)&&e.ref===t.ref)return iM(e,t,a)}return t.flags|=1,(e=rt(o,r)).ref=t.ref,e.return=t,t.child=e}function iw(e,t,n,r,a){if(null!==e){var o=e.memoizedProps;if(nE(o,r)&&e.ref===t.ref)if(ib=!1,t.pendingProps=r=o,!i$(e,a))return t.lanes=e.lanes,iM(e,t,a);else 0!=(131072&e.flags)&&(ib=!0)}return i_(e,t,n,r,a)}function ix(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode){if(0!=(128&t.flags)){if(r=null!==o?o.baseLanes|n:n,null!==e){for(o=0,a=t.child=e.child;null!==a;)o=o|a.lanes|a.childLanes,a=a.sibling;t.childLanes=o&~r}else t.childLanes=0,t.child=null;return iS(e,t,r,n)}if(0==(0x20000000&n))return t.lanes=t.childLanes=0x20000000,iS(e,t,null!==o?o.baseLanes|n:n,n);t.memoizedState={baseLanes:0,cachePool:null},null!==e&&r9(t,null!==o?o.cachePool:null),null!==o?ax(t,o):aS(),o6(t)}else null!==o?(r9(t,o.cachePool),ax(t,o),o9(t),t.memoizedState=null):(null!==e&&r9(t,null),aS(),o9(t));return iy(e,t,a,n),t.child}function iS(e,t,n,r){var a=r6();return t.memoizedState={baseLanes:n,cachePool:a=null===a?null:{parent:rG._currentValue,pool:a}},null!==e&&r9(t,null),aS(),o6(t),null!==e&&r$(e,t,r,!0),null}function iE(e,t){var n=t.ref;if(null===n)null!==e&&null!==e.ref&&(t.flags|=4194816);else{if("function"!=typeof n&&"object"!=typeof n)throw Error(l(284));(null===e||e.ref!==n)&&(t.flags|=4194816)}}function i_(e,t,n,r,a){return(rU(t),n=az(e,t,n,r,void 0,a),r=aU(),null===e||ib)?(rx&&r&&ry(t),t.flags|=1,iy(e,t,n,a),t.child):(aH(e,t,a),iM(e,t,a))}function iC(e,t,n,r,a,o){return(rU(t),t.updateQueue=null,n=a$(t,r,n,a),aM(e),r=aU(),null===e||ib)?(rx&&r&&ry(t),t.flags|=1,iy(e,t,n,o),t.child):(aH(e,t,o),iM(e,t,o))}function iT(e,t,n,r,a){if(rU(t),null===t.stateNode){var o=n8,i=n.contextType;"object"==typeof i&&null!==i&&(o=rH(i)),t.memoizedState=null!==(o=new n(r,o)).state&&void 0!==o.state?o.state:null,o.updater=it,t.stateNode=o,o._reactInternals=t,(o=t.stateNode).props=r,o.state=t.memoizedState,o.refs={},au(t),i=n.contextType,o.context="object"==typeof i&&null!==i?rH(i):n8,o.state=t.memoizedState,"function"==typeof(i=n.getDerivedStateFromProps)&&(ie(t,n,i,r),o.state=t.memoizedState),"function"==typeof n.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(i=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),i!==o.state&&it.enqueueReplaceState(o,o.state,null),ab(t,r,o,a),ag(),o.state=t.memoizedState),"function"==typeof o.componentDidMount&&(t.flags|=4194308),r=!0}else if(null===e){o=t.stateNode;var l=t.memoizedProps,s=io(n,l);o.props=s;var u=o.context,c=n.contextType;i=n8,"object"==typeof c&&null!==c&&(i=rH(c));var d=n.getDerivedStateFromProps;c="function"==typeof d||"function"==typeof o.getSnapshotBeforeUpdate,l=t.pendingProps!==l,c||"function"!=typeof o.UNSAFE_componentWillReceiveProps&&"function"!=typeof o.componentWillReceiveProps||(l||u!==i)&&ia(t,o,r,i),as=!1;var f=t.memoizedState;o.state=f,ab(t,r,o,a),ag(),u=t.memoizedState,l||f!==u||as?("function"==typeof d&&(ie(t,n,d,r),u=t.memoizedState),(s=as||ir(t,n,s,r,f,u,i))?(c||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||("function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount()),"function"==typeof o.componentDidMount&&(t.flags|=4194308)):("function"==typeof o.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=u),o.props=r,o.state=u,o.context=i,r=s):("function"==typeof o.componentDidMount&&(t.flags|=4194308),r=!1)}else{o=t.stateNode,ac(e,t),c=io(n,i=t.memoizedProps),o.props=c,d=t.pendingProps,f=o.context,u=n.contextType,s=n8,"object"==typeof u&&null!==u&&(s=rH(u)),(u="function"==typeof(l=n.getDerivedStateFromProps)||"function"==typeof o.getSnapshotBeforeUpdate)||"function"!=typeof o.UNSAFE_componentWillReceiveProps&&"function"!=typeof o.componentWillReceiveProps||(i!==d||f!==s)&&ia(t,o,r,s),as=!1,f=t.memoizedState,o.state=f,ab(t,r,o,a),ag();var p=t.memoizedState;i!==d||f!==p||as||null!==e&&null!==e.dependencies&&rB(e.dependencies)?("function"==typeof l&&(ie(t,n,l,r),p=t.memoizedState),(c=as||ir(t,n,c,r,f,p,s)||null!==e&&null!==e.dependencies&&rB(e.dependencies))?(u||"function"!=typeof o.UNSAFE_componentWillUpdate&&"function"!=typeof o.componentWillUpdate||("function"==typeof o.componentWillUpdate&&o.componentWillUpdate(r,p,s),"function"==typeof o.UNSAFE_componentWillUpdate&&o.UNSAFE_componentWillUpdate(r,p,s)),"function"==typeof o.componentDidUpdate&&(t.flags|=4),"function"==typeof o.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof o.componentDidUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof o.getSnapshotBeforeUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=p),o.props=r,o.state=p,o.context=s,r=c):("function"!=typeof o.componentDidUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof o.getSnapshotBeforeUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return o=r,iE(e,t),r=0!=(128&t.flags),o||r?(o=t.stateNode,n=r&&"function"!=typeof n.getDerivedStateFromError?null:o.render(),t.flags|=1,null!==e&&r?(t.child=o0(t,e.child,null,a),t.child=o0(t,null,n,a)):iy(e,t,n,a),t.memoizedState=o.state,e=t.child):e=iM(e,t,a),e}function iP(e,t,n,r){return rO(),t.flags|=256,iy(e,t,n,r),t.child}var iA={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function iO(e){return{baseLanes:e,cachePool:r8()}}function iL(e,t,n){return e=null!==e?e.childLanes&~n:0,t&&(e|=lB),e}function ij(e,t,n){var r,a=t.pendingProps,o=!1,i=0!=(128&t.flags);if((r=i)||(r=(null===e||null!==e.memoizedState)&&0!=(2&o5.current)),r&&(o=!0,t.flags&=-129),r=0!=(32&t.flags),t.flags&=-33,null===e){if(rx){if(o?o3(t):o9(t),rx){var s,u=rw;if(s=u){n:{for(s=u,u=rE;8!==s.nodeType;)if(!u||null===(s=uv(s.nextSibling))){u=null;break n}u=s}null!==u?(t.memoizedState={dehydrated:u,treeContext:null!==rp?{id:rm,overflow:rh}:null,retryLane:0x20000000,hydrationErrors:null},(s=n7(18,null,null,0)).stateNode=u,s.return=t,t.child=s,rk=t,rw=null,s=!0):s=!1}s||rC(t)}if(null!==(u=t.memoizedState)&&null!==(u=u.dehydrated))return uy(u)?t.lanes=32:t.lanes=0x20000000,null;o8(t)}return(u=a.children,a=a.fallback,o)?(o9(t),u=iR({mode:"hidden",children:u},o=t.mode),a=ra(a,o,n,null),u.return=t,a.return=t,u.sibling=a,t.child=u,(o=t.child).memoizedState=iO(n),o.childLanes=iL(e,r,n),t.memoizedState=iA,a):(o3(t),iN(t,u))}if(null!==(s=e.memoizedState)&&null!==(u=s.dehydrated)){if(i)256&t.flags?(o3(t),t.flags&=-257,t=iI(e,t,n)):null!==t.memoizedState?(o9(t),t.child=e.child,t.flags|=128,t=null):(o9(t),o=a.fallback,u=t.mode,a=iR({mode:"visible",children:a.children},u),o=ra(o,u,n,null),o.flags|=2,a.return=t,o.return=t,a.sibling=o,t.child=a,o0(t,e.child,null,n),(a=t.child).memoizedState=iO(n),a.childLanes=iL(e,r,n),t.memoizedState=iA,t=o);else if(o3(t),uy(u)){if(r=u.nextSibling&&u.nextSibling.dataset)var c=r.dgst;r=c,(a=Error(l(419))).stack="",a.digest=r,rj({value:a,source:null,stack:null}),t=iI(e,t,n)}else if(ib||r$(e,t,n,!1),r=0!=(n&e.childLanes),ib||r){if(null!==(r=lP)&&0!==(a=0!=((a=0!=(42&(a=n&-n))?1:eC(a))&(r.suspendedLanes|n))?0:a)&&a!==s.retryLane)throw s.retryLane=a,n3(e,a),l8(r,e,a),ig;"$?"===u.data||sl(),t=iI(e,t,n)}else"$?"===u.data?(t.flags|=192,t.child=e.child,t=null):(e=s.treeContext,rw=uv(u.nextSibling),rk=t,rx=!0,rS=null,rE=!1,null!==e&&(rd[rf++]=rm,rd[rf++]=rh,rd[rf++]=rp,rm=e.id,rh=e.overflow,rp=t),t=iN(t,a.children),t.flags|=4096);return t}return o?(o9(t),o=a.fallback,u=t.mode,c=(s=e.child).sibling,(a=rt(s,{mode:"hidden",children:a.children})).subtreeFlags=0x3e00000&s.subtreeFlags,null!==c?o=rt(c,o):(o=ra(o,u,n,null),o.flags|=2),o.return=t,a.return=t,a.sibling=o,t.child=a,a=o,o=t.child,null===(u=e.child.memoizedState)?u=iO(n):(null!==(s=u.cachePool)?(c=rG._currentValue,s=s.parent!==c?{parent:c,pool:c}:s):s=r8(),u={baseLanes:u.baseLanes|n,cachePool:s}),o.memoizedState=u,o.childLanes=iL(e,r,n),t.memoizedState=iA,a):(o3(t),e=(n=e.child).sibling,(n=rt(n,{mode:"visible",children:a.children})).return=t,n.sibling=null,null!==e&&(null===(r=t.deletions)?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n)}function iN(e,t){return(t=iR({mode:"visible",children:t},e.mode)).return=e,e.child=t}function iR(e,t){return(e=n7(22,e,null,t)).lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function iI(e,t,n){return o0(t,e.child,null,n),e=iN(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function iF(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),rz(e.return,t,n)}function iD(e,t,n,r,a){var o=e.memoizedState;null===o?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=a)}function iz(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(iy(e,t,r.children,n),0!=(2&(r=o5.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&iF(e,n,t);else if(19===e.tag)iF(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}switch($(o5,r),a){case"forwards":for(a=null,n=t.child;null!==n;)null!==(e=n.alternate)&&null===o7(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),iD(t,!1,a,n,o);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===o7(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}iD(t,!0,n,null,o);break;case"together":iD(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function iM(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),lz|=t.lanes,0==(n&t.childLanes)){if(null===e)return null;else if(r$(e,t,n,!1),0==(n&t.childLanes))return null}if(null!==e&&t.child!==e.child)throw Error(l(153));if(null!==t.child){for(n=rt(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=rt(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function i$(e,t){return 0!=(e.lanes&t)||!!(null!==(e=e.dependencies)&&rB(e))}function iB(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps)ib=!0;else{if(!i$(e,n)&&0==(128&t.flags))return ib=!1,function(e,t,n){switch(t.tag){case 3:Z(t,t.stateNode.containerInfo),rF(t,rG,e.memoizedState.cache),rO();break;case 27:case 5:W(t);break;case 4:Z(t,t.stateNode.containerInfo);break;case 10:rF(t,t.type,t.memoizedProps.value);break;case 13:var r=t.memoizedState;if(null!==r){if(null!==r.dehydrated)return o3(t),t.flags|=128,null;if(0!=(n&t.child.childLanes))return ij(e,t,n);return o3(t),null!==(e=iM(e,t,n))?e.sibling:null}o3(t);break;case 19:var a=0!=(128&e.flags);if((r=0!=(n&t.childLanes))||(r$(e,t,n,!1),r=0!=(n&t.childLanes)),a){if(r)return iz(e,t,n);t.flags|=128}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),$(o5,o5.current),!r)return null;break;case 22:case 23:return t.lanes=0,ix(e,t,n);case 24:rF(t,rG,e.memoizedState.cache)}return iM(e,t,n)}(e,t,n);ib=0!=(131072&e.flags)}else ib=!1,rx&&0!=(1048576&t.flags)&&rb(t,rc,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var r=t.elementType,a=r._init;if(r=a(r._payload),t.type=r,"function"==typeof r)re(r)?(e=io(r,e),t.tag=1,t=iT(null,t,r,e,n)):(t.tag=0,t=i_(null,t,r,e,n));else{if(null!=r){if((a=r.$$typeof)===x){t.tag=11,t=iv(null,t,r,e,n);break e}else if(a===_){t.tag=14,t=ik(null,t,r,e,n);break e}}throw Error(l(306,t=function e(t){if(null==t)return null;if("function"==typeof t)return t.$$typeof===L?null:t.displayName||t.name||null;if("string"==typeof t)return t;switch(t){case g:return"Fragment";case y:return"Profiler";case b:return"StrictMode";case S:return"Suspense";case E:return"SuspenseList";case T:return"Activity"}if("object"==typeof t)switch(t.$$typeof){case h:return"Portal";case w:return(t.displayName||"Context")+".Provider";case k:return(t._context.displayName||"Context")+".Consumer";case x:var n=t.render;return(t=t.displayName)||(t=""!==(t=n.displayName||n.name||"")?"ForwardRef("+t+")":"ForwardRef"),t;case _:return null!==(n=t.displayName||null)?n:e(t.type)||"Memo";case C:n=t._payload,t=t._init;try{return e(t(n))}catch(e){}}return null}(r)||r,""))}}return t;case 0:return i_(e,t,t.type,t.pendingProps,n);case 1:return a=io(r=t.type,t.pendingProps),iT(e,t,r,a,n);case 3:e:{if(Z(t,t.stateNode.containerInfo),null===e)throw Error(l(387));r=t.pendingProps;var o=t.memoizedState;a=o.element,ac(e,t),ab(t,r,null,n);var i=t.memoizedState;if(rF(t,rG,r=i.cache),r!==o.cache&&rM(t,[rG],n,!0),ag(),r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache},t.updateQueue.baseState=o,t.memoizedState=o,256&t.flags){t=iP(e,t,r,n);break e}else if(r!==a){rj(a=nK(Error(l(424)),t)),t=iP(e,t,r,n);break e}else for(rw=uv((e=9===(e=t.stateNode.containerInfo).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e).firstChild),rk=t,rx=!0,rS=null,rE=!0,n=o1(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling;else{if(rO(),r===a){t=iM(e,t,n);break e}iy(e,t,r,n)}t=t.child}return t;case 26:return iE(e,t),null===e?(n=uO(t.type,null,t.pendingProps,null))?t.memoizedState=n:rx||(n=t.type,e=t.pendingProps,(r=uo(H.current).createElement(n))[eO]=t,r[eL]=e,un(r,n,e),eH(r),t.stateNode=r):t.memoizedState=uO(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return W(t),null===e&&rx&&(r=t.stateNode=ux(t.type,t.pendingProps,H.current),rk=t,rE=!0,a=rw,uh(t.type)?(uk=a,rw=uv(r.firstChild)):rw=a),iy(e,t,t.pendingProps.children,n),iE(e,t),null===e&&(t.flags|=4194304),t.child;case 5:return null===e&&rx&&((a=r=rw)&&(null!==(r=function(e,t,n,r){for(;1===e.nodeType;){if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!r&&("INPUT"!==e.nodeName||"hidden"!==e.type))break}else if(r){if(!e[eD])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if("stylesheet"===(a=e.getAttribute("rel"))&&e.hasAttribute("data-precedence")||a!==n.rel||e.getAttribute("href")!==(null==n.href||""===n.href?null:n.href)||e.getAttribute("crossorigin")!==(null==n.crossOrigin?null:n.crossOrigin)||e.getAttribute("title")!==(null==n.title?null:n.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(((a=e.getAttribute("src"))!==(null==n.src?null:n.src)||e.getAttribute("type")!==(null==n.type?null:n.type)||e.getAttribute("crossorigin")!==(null==n.crossOrigin?null:n.crossOrigin))&&a&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else{if("input"!==t||"hidden"!==e.type)return e;var a=null==n.name?null:""+n.name;if("hidden"===n.type&&e.getAttribute("name")===a)return e}if(null===(e=uv(e.nextSibling)))break}return null}(r,t.type,t.pendingProps,rE))?(t.stateNode=r,rk=t,rw=uv(r.firstChild),rE=!1,a=!0):a=!1),a||rC(t)),W(t),a=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,r=o.children,us(a,o)?r=null:null!==i&&us(a,i)&&(t.flags|=32),null!==t.memoizedState&&(uY._currentValue=a=az(e,t,aB,null,null,n)),iE(e,t),iy(e,t,r,n),t.child;case 6:return null===e&&rx&&((e=n=rw)&&(null!==(n=function(e,t,n){if(""===t)return null;for(;3!==e.nodeType;)if((1!==e.nodeType||"INPUT"!==e.nodeName||"hidden"!==e.type)&&!n||null===(e=uv(e.nextSibling)))return null;return e}(n,t.pendingProps,rE))?(t.stateNode=n,rk=t,rw=null,e=!0):e=!1),e||rC(t)),null;case 13:return ij(e,t,n);case 4:return Z(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=o0(t,null,r,n):iy(e,t,r,n),t.child;case 11:return iv(e,t,t.type,t.pendingProps,n);case 7:return iy(e,t,t.pendingProps,n),t.child;case 8:case 12:return iy(e,t,t.pendingProps.children,n),t.child;case 10:return r=t.pendingProps,rF(t,t.type,r.value),iy(e,t,r.children,n),t.child;case 9:return a=t.type._context,r=t.pendingProps.children,rU(t),r=r(a=rH(a)),t.flags|=1,iy(e,t,r,n),t.child;case 14:return ik(e,t,t.type,t.pendingProps,n);case 15:return iw(e,t,t.type,t.pendingProps,n);case 19:return iz(e,t,n);case 31:return r=t.pendingProps,n=t.mode,r={mode:r.mode,children:r.children},null===e?(n=iR(r,n)).ref=t.ref:(n=rt(e.child,r)).ref=t.ref,t.child=n,n.return=t,t=n;case 22:return ix(e,t,n);case 24:return rU(t),r=rH(rG),null===e?(null===(a=r6())&&(a=lP,o=rY(),a.pooledCache=o,o.refCount++,null!==o&&(a.pooledCacheLanes|=n),a=o),t.memoizedState={parent:r,cache:a},au(t),rF(t,rG,a)):(0!=(e.lanes&n)&&(ac(e,t),ab(t,null,null,n),ag()),a=e.memoizedState,o=t.memoizedState,a.parent!==r?(a={parent:r,cache:r},t.memoizedState=a,0===t.lanes&&(t.memoizedState=t.updateQueue.baseState=a),rF(t,rG,r)):(rF(t,rG,r=o.cache),r!==a.cache&&rM(t,[rG],n,!0))),iy(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(l(156,t.tag))}function iU(e){e.flags|=4}function iH(e,t){if("stylesheet"!==t.type||0!=(4&t.state.loading))e.flags&=-0x1000001;else if(e.flags|=0x1000000,!uH(t)){if(null!==(t=o2.current)&&((4194048&lO)===lO?null!==o4:(0x3c00000&lO)!==lO&&0==(0x20000000&lO)||t!==o4))throw ao=at,r7;e.flags|=8192}}function iQ(e,t){null!==t&&(e.flags|=4),16384&e.flags&&(t=22!==e.tag?ew():0x20000000,e.lanes|=t,lU|=t)}function iZ(e,t){if(!rx)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function iV(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=0x3e00000&a.subtreeFlags,r|=0x3e00000&a.flags,a.return=e,a=a.sibling;else for(a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags,r|=a.flags,a.return=e,a=a.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function iW(e,t){switch(rv(t),t.tag){case 3:rD(rG),V();break;case 26:case 27:case 5:q(t);break;case 4:V();break;case 13:o8(t);break;case 19:M(o5);break;case 10:rD(t.type);break;case 22:case 23:o8(t),aE(),null!==e&&M(r3);break;case 24:rD(rG)}}function iq(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if(null!==r){var a=r.next;n=a;do{if((n.tag&e)===e){r=void 0;var o=n.create;n.inst.destroy=r=o()}n=n.next}while(n!==a)}}catch(e){sx(t,t.return,e)}}function iG(e,t,n){try{var r=t.updateQueue,a=null!==r?r.lastEffect:null;if(null!==a){var o=a.next;r=o;do{if((r.tag&e)===e){var i=r.inst,l=i.destroy;if(void 0!==l){i.destroy=void 0,a=t;try{l()}catch(e){sx(a,n,e)}}}r=r.next}while(r!==o)}}catch(e){sx(t,t.return,e)}}function iY(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{av(t,n)}catch(t){sx(e,e.return,t)}}}function iK(e,t,n){n.props=io(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){sx(e,t,n)}}function iX(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;default:r=e.stateNode}"function"==typeof n?e.refCleanup=n(r):n.current=r}}catch(n){sx(e,t,n)}}function iJ(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if("function"==typeof r)try{r()}catch(n){sx(e,t,n)}finally{e.refCleanup=null,null!=(e=e.alternate)&&(e.refCleanup=null)}else if("function"==typeof n)try{n(null)}catch(n){sx(e,t,n)}else n.current=null}function i0(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&r.focus();break;case"img":n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){sx(e,e.return,t)}}function i1(e,t,n){try{var r=e.stateNode;(function(e,t,n,r){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var a=null,o=null,i=null,s=null,u=null,c=null,d=null;for(m in n){var f=n[m];if(n.hasOwnProperty(m)&&null!=f)switch(m){case"checked":case"value":break;case"defaultValue":u=f;default:r.hasOwnProperty(m)||ue(e,t,m,null,r,f)}}for(var p in r){var m=r[p];if(f=n[p],r.hasOwnProperty(p)&&(null!=m||null!=f))switch(p){case"type":o=m;break;case"name":a=m;break;case"checked":c=m;break;case"defaultChecked":d=m;break;case"value":i=m;break;case"defaultValue":s=m;break;case"children":case"dangerouslySetInnerHTML":if(null!=m)throw Error(l(137,t));break;default:m!==f&&ue(e,t,p,m,r,f)}}tt(e,i,s,u,c,d,o,a);return;case"select":for(o in m=i=s=p=null,n)if(u=n[o],n.hasOwnProperty(o)&&null!=u)switch(o){case"value":break;case"multiple":m=u;default:r.hasOwnProperty(o)||ue(e,t,o,null,r,u)}for(a in r)if(o=r[a],u=n[a],r.hasOwnProperty(a)&&(null!=o||null!=u))switch(a){case"value":p=o;break;case"defaultValue":s=o;break;case"multiple":i=o;default:o!==u&&ue(e,t,a,o,r,u)}t=s,n=i,r=m,null!=p?ta(e,!!n,p,!1):!!r!=!!n&&(null!=t?ta(e,!!n,t,!0):ta(e,!!n,n?[]:"",!1));return;case"textarea":for(s in m=p=null,n)if(a=n[s],n.hasOwnProperty(s)&&null!=a&&!r.hasOwnProperty(s))switch(s){case"value":case"children":break;default:ue(e,t,s,null,r,a)}for(i in r)if(a=r[i],o=n[i],r.hasOwnProperty(i)&&(null!=a||null!=o))switch(i){case"value":p=a;break;case"defaultValue":m=a;break;case"children":break;case"dangerouslySetInnerHTML":if(null!=a)throw Error(l(91));break;default:a!==o&&ue(e,t,i,a,r,o)}to(e,p,m);return;case"option":for(var h in n)p=n[h],n.hasOwnProperty(h)&&null!=p&&!r.hasOwnProperty(h)&&("selected"===h?e.selected=!1:ue(e,t,h,null,r,p));for(u in r)p=r[u],m=n[u],r.hasOwnProperty(u)&&p!==m&&(null!=p||null!=m)&&("selected"===u?e.selected=p&&"function"!=typeof p&&"symbol"!=typeof p:ue(e,t,u,p,r,m));return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var g in n)p=n[g],n.hasOwnProperty(g)&&null!=p&&!r.hasOwnProperty(g)&&ue(e,t,g,null,r,p);for(c in r)if(p=r[c],m=n[c],r.hasOwnProperty(c)&&p!==m&&(null!=p||null!=m))switch(c){case"children":case"dangerouslySetInnerHTML":if(null!=p)throw Error(l(137,t));break;default:ue(e,t,c,p,r,m)}return;default:if(td(t)){for(var b in n)p=n[b],n.hasOwnProperty(b)&&void 0!==p&&!r.hasOwnProperty(b)&&ut(e,t,b,void 0,r,p);for(d in r)p=r[d],m=n[d],r.hasOwnProperty(d)&&p!==m&&(void 0!==p||void 0!==m)&&ut(e,t,d,p,r,m);return}}for(var y in n)p=n[y],n.hasOwnProperty(y)&&null!=p&&!r.hasOwnProperty(y)&&ue(e,t,y,null,r,p);for(f in r)p=r[f],m=n[f],r.hasOwnProperty(f)&&p!==m&&(null!=p||null!=m)&&ue(e,t,f,p,r,m)})(r,e.type,n,t),r[eL]=t}catch(t){sx(e,e.return,t)}}function i2(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&uh(e.type)||4===e.tag}function i4(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||i2(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(27===e.tag&&uh(e.type)||2&e.flags||null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function i3(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&(27===r&&uh(e.type)&&(n=e.stateNode),null!==(e=e.child)))for(i3(e,t,n),e=e.sibling;null!==e;)i3(e,t,n),e=e.sibling}function i6(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,a=t.attributes;a.length;)t.removeAttributeNode(a[0]);un(t,r,n),t[eO]=e,t[eL]=n}catch(t){sx(e,e.return,t)}}var i9=!1,i8=!1,i5=!1,i7="function"==typeof WeakSet?WeakSet:Set,le=null;function lt(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:lf(e,n),4&r&&iq(5,n);break;case 1:if(lf(e,n),4&r)if(e=n.stateNode,null===t)try{e.componentDidMount()}catch(e){sx(n,n.return,e)}else{var a=io(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(a,t,e.__reactInternalSnapshotBeforeUpdate)}catch(e){sx(n,n.return,e)}}64&r&&iY(n),512&r&&iX(n,n.return);break;case 3:if(lf(e,n),64&r&&null!==(e=n.updateQueue)){if(t=null,null!==n.child)switch(n.child.tag){case 27:case 5:case 1:t=n.child.stateNode}try{av(e,t)}catch(e){sx(n,n.return,e)}}break;case 27:null===t&&4&r&&i6(n);case 26:case 5:lf(e,n),null===t&&4&r&&i0(n),512&r&&iX(n,n.return);break;case 12:default:lf(e,n);break;case 13:lf(e,n),4&r&&li(e,n),64&r&&null!==(e=n.memoizedState)&&null!==(e=e.dehydrated)&&function(e,t){var n=e.ownerDocument;if("$?"!==e.data||"complete"===n.readyState)t();else{var r=function(){t(),n.removeEventListener("DOMContentLoaded",r)};n.addEventListener("DOMContentLoaded",r),e._reactRetry=r}}(e,n=sC.bind(null,n));break;case 22:if(!(r=null!==n.memoizedState||i9)){t=null!==t&&null!==t.memoizedState||i8,a=i9;var o=i8;i9=r,(i8=t)&&!o?function e(t,n,r){for(r=r&&0!=(8772&n.subtreeFlags),n=n.child;null!==n;){var a=n.alternate,o=t,i=n,l=i.flags;switch(i.tag){case 0:case 11:case 15:e(o,i,r),iq(4,i);break;case 1:if(e(o,i,r),"function"==typeof(o=(a=i).stateNode).componentDidMount)try{o.componentDidMount()}catch(e){sx(a,a.return,e)}if(null!==(o=(a=i).updateQueue)){var s=a.stateNode;try{var u=o.shared.hiddenCallbacks;if(null!==u)for(o.shared.hiddenCallbacks=null,o=0;o<u.length;o++)ay(u[o],s)}catch(e){sx(a,a.return,e)}}r&&64&l&&iY(i),iX(i,i.return);break;case 27:i6(i);case 26:case 5:e(o,i,r),r&&null===a&&4&l&&i0(i),iX(i,i.return);break;case 12:default:e(o,i,r);break;case 13:e(o,i,r),r&&4&l&&li(o,i);break;case 22:null===i.memoizedState&&e(o,i,r),iX(i,i.return);case 30:}n=n.sibling}}(e,n,0!=(8772&n.subtreeFlags)):lf(e,n),i9=a,i8=o}case 30:}}var ln=null,lr=!1;function la(e,t,n){for(n=n.child;null!==n;)lo(e,t,n),n=n.sibling}function lo(e,t,n){if(ec&&"function"==typeof ec.onCommitFiberUnmount)try{ec.onCommitFiberUnmount(eu,n)}catch(e){}switch(n.tag){case 26:i8||iJ(n,t),la(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode).parentNode.removeChild(n);break;case 27:i8||iJ(n,t);var r=ln,a=lr;uh(n.type)&&(ln=n.stateNode,lr=!1),la(e,t,n),uS(n.stateNode),ln=r,lr=a;break;case 5:i8||iJ(n,t);case 6:if(r=ln,a=lr,ln=null,la(e,t,n),ln=r,lr=a,null!==ln)if(lr)try{(9===ln.nodeType?ln.body:"HTML"===ln.nodeName?ln.ownerDocument.body:ln).removeChild(n.stateNode)}catch(e){sx(n,t,e)}else try{ln.removeChild(n.stateNode)}catch(e){sx(n,t,e)}break;case 18:null!==ln&&(lr?(ug(9===(e=ln).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e,n.stateNode),cy(e)):ug(ln,n.stateNode));break;case 4:r=ln,a=lr,ln=n.stateNode.containerInfo,lr=!0,la(e,t,n),ln=r,lr=a;break;case 0:case 11:case 14:case 15:i8||iG(2,n,t),i8||iG(4,n,t),la(e,t,n);break;case 1:i8||(iJ(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount&&iK(n,t,r)),la(e,t,n);break;case 21:default:la(e,t,n);break;case 22:i8=(r=i8)||null!==n.memoizedState,la(e,t,n),i8=r}}function li(e,t){if(null===t.memoizedState&&null!==(e=t.alternate)&&null!==(e=e.memoizedState)&&null!==(e=e.dehydrated))try{cy(e)}catch(e){sx(t,t.return,e)}}function ll(e,t){var n=function(e){switch(e.tag){case 13:case 19:var t=e.stateNode;return null===t&&(t=e.stateNode=new i7),t;case 22:return null===(t=(e=e.stateNode)._retryCache)&&(t=e._retryCache=new i7),t;default:throw Error(l(435,e.tag))}}(e);t.forEach(function(t){var r=sT.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))})}function ls(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var a=n[r],o=e,i=t,s=i;e:for(;null!==s;){switch(s.tag){case 27:if(uh(s.type)){ln=s.stateNode,lr=!1;break e}break;case 5:ln=s.stateNode,lr=!1;break e;case 3:case 4:ln=s.stateNode.containerInfo,lr=!0;break e}s=s.return}if(null===ln)throw Error(l(160));lo(o,i,a),ln=null,lr=!1,null!==(o=a.alternate)&&(o.return=null),a.return=null}if(13878&t.subtreeFlags)for(t=t.child;null!==t;)lc(t,e),t=t.sibling}var lu=null;function lc(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:ls(t,e),ld(e),4&r&&(iG(3,e,e.return),iq(3,e),iG(5,e,e.return));break;case 1:ls(t,e),ld(e),512&r&&(i8||null===n||iJ(n,n.return)),64&r&&i9&&null!==(e=e.updateQueue)&&null!==(r=e.callbacks)&&(n=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=null===n?r:n.concat(r));break;case 26:var a=lu;if(ls(t,e),ld(e),512&r&&(i8||null===n||iJ(n,n.return)),4&r){var o=null!==n?n.memoizedState:null;if(r=e.memoizedState,null===n)if(null===r)if(null===e.stateNode){e:{r=e.type,n=e.memoizedProps,a=a.ownerDocument||a;t:switch(r){case"title":(!(o=a.getElementsByTagName("title")[0])||o[eD]||o[eO]||"http://www.w3.org/2000/svg"===o.namespaceURI||o.hasAttribute("itemprop"))&&(o=a.createElement(r),a.head.insertBefore(o,a.querySelector("head > title"))),un(o,r,n),o[eO]=e,eH(o),r=o;break e;case"link":var i=uB("link","href",a).get(r+(n.href||""));if(i){for(var s=0;s<i.length;s++)if((o=i[s]).getAttribute("href")===(null==n.href||""===n.href?null:n.href)&&o.getAttribute("rel")===(null==n.rel?null:n.rel)&&o.getAttribute("title")===(null==n.title?null:n.title)&&o.getAttribute("crossorigin")===(null==n.crossOrigin?null:n.crossOrigin)){i.splice(s,1);break t}}un(o=a.createElement(r),r,n),a.head.appendChild(o);break;case"meta":if(i=uB("meta","content",a).get(r+(n.content||""))){for(s=0;s<i.length;s++)if((o=i[s]).getAttribute("content")===(null==n.content?null:""+n.content)&&o.getAttribute("name")===(null==n.name?null:n.name)&&o.getAttribute("property")===(null==n.property?null:n.property)&&o.getAttribute("http-equiv")===(null==n.httpEquiv?null:n.httpEquiv)&&o.getAttribute("charset")===(null==n.charSet?null:n.charSet)){i.splice(s,1);break t}}un(o=a.createElement(r),r,n),a.head.appendChild(o);break;default:throw Error(l(468,r))}o[eO]=e,eH(o),r=o}e.stateNode=r}else uU(a,e.type,e.stateNode);else e.stateNode=uF(a,r,e.memoizedProps);else o!==r?(null===o?null!==n.stateNode&&(n=n.stateNode).parentNode.removeChild(n):o.count--,null===r?uU(a,e.type,e.stateNode):uF(a,r,e.memoizedProps)):null===r&&null!==e.stateNode&&i1(e,e.memoizedProps,n.memoizedProps)}break;case 27:ls(t,e),ld(e),512&r&&(i8||null===n||iJ(n,n.return)),null!==n&&4&r&&i1(e,e.memoizedProps,n.memoizedProps);break;case 5:if(ls(t,e),ld(e),512&r&&(i8||null===n||iJ(n,n.return)),32&e.flags){a=e.stateNode;try{tl(a,"")}catch(t){sx(e,e.return,t)}}4&r&&null!=e.stateNode&&(a=e.memoizedProps,i1(e,a,null!==n?n.memoizedProps:a)),1024&r&&(i5=!0);break;case 6:if(ls(t,e),ld(e),4&r){if(null===e.stateNode)throw Error(l(162));r=e.memoizedProps,n=e.stateNode;try{n.nodeValue=r}catch(t){sx(e,e.return,t)}}break;case 3:if(u$=null,a=lu,lu=uC(t.containerInfo),ls(t,e),lu=a,ld(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{cy(t.containerInfo)}catch(t){sx(e,e.return,t)}i5&&(i5=!1,function e(t){if(1024&t.subtreeFlags)for(t=t.child;null!==t;){var n=t;e(n),5===n.tag&&1024&n.flags&&n.stateNode.reset(),t=t.sibling}}(e));break;case 4:r=lu,lu=uC(e.stateNode.containerInfo),ls(t,e),ld(e),lu=r;break;case 12:default:ls(t,e),ld(e);break;case 13:ls(t,e),ld(e),8192&e.child.flags&&null!==e.memoizedState!=(null!==n&&null!==n.memoizedState)&&(lV=ee()),4&r&&null!==(r=e.updateQueue)&&(e.updateQueue=null,ll(e,r));break;case 22:a=null!==e.memoizedState;var u=null!==n&&null!==n.memoizedState,c=i9,d=i8;if(i9=c||a,i8=d||u,ls(t,e),i8=d,i9=c,ld(e),8192&r)e:for((t=e.stateNode)._visibility=a?-2&t._visibility:1|t._visibility,a&&(null===n||u||i9||i8||function e(t){for(t=t.child;null!==t;){var n=t;switch(n.tag){case 0:case 11:case 14:case 15:iG(4,n,n.return),e(n);break;case 1:iJ(n,n.return);var r=n.stateNode;"function"==typeof r.componentWillUnmount&&iK(n,n.return,r),e(n);break;case 27:uS(n.stateNode);case 26:case 5:iJ(n,n.return),e(n);break;case 22:null===n.memoizedState&&e(n);break;default:e(n)}t=t.sibling}}(e)),n=null,t=e;;){if(5===t.tag||26===t.tag){if(null===n){u=n=t;try{if(o=u.stateNode,a)i=o.style,"function"==typeof i.setProperty?i.setProperty("display","none","important"):i.display="none";else{s=u.stateNode;var f=u.memoizedProps.style,p=null!=f&&f.hasOwnProperty("display")?f.display:null;s.style.display=null==p||"boolean"==typeof p?"":(""+p).trim()}}catch(e){sx(u,u.return,e)}}}else if(6===t.tag){if(null===n){u=t;try{u.stateNode.nodeValue=a?"":u.memoizedProps}catch(e){sx(u,u.return,e)}}}else if((22!==t.tag&&23!==t.tag||null===t.memoizedState||t===e)&&null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)break e;n===t&&(n=null),t=t.return}n===t&&(n=null),t.sibling.return=t.return,t=t.sibling}4&r&&null!==(r=e.updateQueue)&&null!==(n=r.retryQueue)&&(r.retryQueue=null,ll(e,n));break;case 19:ls(t,e),ld(e),4&r&&null!==(r=e.updateQueue)&&(e.updateQueue=null,ll(e,r));case 30:case 21:}}function ld(e){var t=e.flags;if(2&t){try{for(var n,r=e.return;null!==r;){if(i2(r)){n=r;break}r=r.return}if(null==n)throw Error(l(160));switch(n.tag){case 27:var a=n.stateNode,o=i4(e);i3(e,o,a);break;case 5:var i=n.stateNode;32&n.flags&&(tl(i,""),n.flags&=-33);var s=i4(e);i3(e,s,i);break;case 3:case 4:var u=n.stateNode.containerInfo,c=i4(e);!function e(t,n,r){var a=t.tag;if(5===a||6===a)t=t.stateNode,n?(9===r.nodeType?r.body:"HTML"===r.nodeName?r.ownerDocument.body:r).insertBefore(t,n):((n=9===r.nodeType?r.body:"HTML"===r.nodeName?r.ownerDocument.body:r).appendChild(t),null!=(r=r._reactRootContainer)||null!==n.onclick||(n.onclick=s7));else if(4!==a&&(27===a&&uh(t.type)&&(r=t.stateNode,n=null),null!==(t=t.child)))for(e(t,n,r),t=t.sibling;null!==t;)e(t,n,r),t=t.sibling}(e,c,u);break;default:throw Error(l(161))}}catch(t){sx(e,e.return,t)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function lf(e,t){if(8772&t.subtreeFlags)for(t=t.child;null!==t;)lt(e,t.alternate,t),t=t.sibling}function lp(e,t){var n=null;null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),e=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(e=t.memoizedState.cachePool.pool),e!==n&&(null!=e&&e.refCount++,null!=n&&rK(n))}function lm(e,t){e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&rK(e))}function lh(e,t,n,r){if(10256&t.subtreeFlags)for(t=t.child;null!==t;)lg(e,t,n,r),t=t.sibling}function lg(e,t,n,r){var a=t.flags;switch(t.tag){case 0:case 11:case 15:lh(e,t,n,r),2048&a&&iq(9,t);break;case 1:case 13:default:lh(e,t,n,r);break;case 3:lh(e,t,n,r),2048&a&&(e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&rK(e)));break;case 12:if(2048&a){lh(e,t,n,r),e=t.stateNode;try{var o=t.memoizedProps,i=o.id,l=o.onPostCommit;"function"==typeof l&&l(i,null===t.alternate?"mount":"update",e.passiveEffectDuration,-0)}catch(e){sx(t,t.return,e)}}else lh(e,t,n,r);break;case 23:break;case 22:o=t.stateNode,i=t.alternate,null!==t.memoizedState?2&o._visibility?lh(e,t,n,r):lb(e,t):2&o._visibility?lh(e,t,n,r):(o._visibility|=2,function e(t,n,r,a,o){for(o=o&&0!=(10256&n.subtreeFlags),n=n.child;null!==n;){var i=n,l=i.flags;switch(i.tag){case 0:case 11:case 15:e(t,i,r,a,o),iq(8,i);break;case 23:break;case 22:var s=i.stateNode;null!==i.memoizedState?2&s._visibility?e(t,i,r,a,o):lb(t,i):(s._visibility|=2,e(t,i,r,a,o)),o&&2048&l&&lp(i.alternate,i);break;case 24:e(t,i,r,a,o),o&&2048&l&&lm(i.alternate,i);break;default:e(t,i,r,a,o)}n=n.sibling}}(e,t,n,r,0!=(10256&t.subtreeFlags))),2048&a&&lp(i,t);break;case 24:lh(e,t,n,r),2048&a&&lm(t.alternate,t)}}function lb(e,t){if(10256&t.subtreeFlags)for(t=t.child;null!==t;){var n=t,r=n.flags;switch(n.tag){case 22:lb(e,n),2048&r&&lp(n.alternate,n);break;case 24:lb(e,n),2048&r&&lm(n.alternate,n);break;default:lb(e,n)}t=t.sibling}}var ly=8192;function lv(e){if(e.subtreeFlags&ly)for(e=e.child;null!==e;)lk(e),e=e.sibling}function lk(e){switch(e.tag){case 26:lv(e),e.flags&ly&&null!==e.memoizedState&&function(e,t,n){if(null===uQ)throw Error(l(475));var r=uQ;if("stylesheet"===t.type&&("string"!=typeof n.media||!1!==matchMedia(n.media).matches)&&0==(4&t.state.loading)){if(null===t.instance){var a=uL(n.href),o=e.querySelector(uj(a));if(o){null!==(e=o._p)&&"object"==typeof e&&"function"==typeof e.then&&(r.count++,r=uV.bind(r),e.then(r,r)),t.state.loading|=4,t.instance=o,eH(o);return}o=e.ownerDocument||e,n=uN(n),(a=uE.get(a))&&uz(n,a),eH(o=o.createElement("link"));var i=o;i._p=new Promise(function(e,t){i.onload=e,i.onerror=t}),un(o,"link",n),t.instance=o}null===r.stylesheets&&(r.stylesheets=new Map),r.stylesheets.set(t,e),(e=t.state.preload)&&0==(3&t.state.loading)&&(r.count++,t=uV.bind(r),e.addEventListener("load",t),e.addEventListener("error",t))}}(lu,e.memoizedState,e.memoizedProps);break;case 5:default:lv(e);break;case 3:case 4:var t=lu;lu=uC(e.stateNode.containerInfo),lv(e),lu=t;break;case 22:null===e.memoizedState&&(null!==(t=e.alternate)&&null!==t.memoizedState?(t=ly,ly=0x1000000,lv(e),ly=t):lv(e))}}function lw(e){var t=e.alternate;if(null!==t&&null!==(e=t.child)){t.child=null;do t=e.sibling,e.sibling=null,e=t;while(null!==e)}}function lx(e){var t=e.deletions;if(0!=(16&e.flags)){if(null!==t)for(var n=0;n<t.length;n++){var r=t[n];le=r,lE(r,e)}lw(e)}if(10256&e.subtreeFlags)for(e=e.child;null!==e;)lS(e),e=e.sibling}function lS(e){switch(e.tag){case 0:case 11:case 15:lx(e),2048&e.flags&&iG(9,e,e.return);break;case 3:case 12:default:lx(e);break;case 22:var t=e.stateNode;null!==e.memoizedState&&2&t._visibility&&(null===e.return||13!==e.return.tag)?(t._visibility&=-3,function e(t){var n=t.deletions;if(0!=(16&t.flags)){if(null!==n)for(var r=0;r<n.length;r++){var a=n[r];le=a,lE(a,t)}lw(t)}for(t=t.child;null!==t;){switch((n=t).tag){case 0:case 11:case 15:iG(8,n,n.return),e(n);break;case 22:2&(r=n.stateNode)._visibility&&(r._visibility&=-3,e(n));break;default:e(n)}t=t.sibling}}(e)):lx(e)}}function lE(e,t){for(;null!==le;){var n=le;switch(n.tag){case 0:case 11:case 15:iG(8,n,t);break;case 23:case 22:if(null!==n.memoizedState&&null!==n.memoizedState.cachePool){var r=n.memoizedState.cachePool.pool;null!=r&&r.refCount++}break;case 24:rK(n.memoizedState.cache)}if(null!==(r=n.child))r.return=n,le=r;else for(n=e;null!==le;){var a=(r=le).sibling,o=r.return;if(!function e(t){var n=t.alternate;null!==n&&(t.alternate=null,e(n)),t.child=null,t.deletions=null,t.sibling=null,5===t.tag&&null!==(n=t.stateNode)&&ez(n),t.stateNode=null,t.return=null,t.dependencies=null,t.memoizedProps=null,t.memoizedState=null,t.pendingProps=null,t.stateNode=null,t.updateQueue=null}(r),r===n){le=null;break}if(null!==a){a.return=o,le=a;break}le=o}}}var l_={getCacheForType:function(e){var t=rH(rG),n=t.data.get(e);return void 0===n&&(n=e(),t.data.set(e,n)),n}},lC="function"==typeof WeakMap?WeakMap:Map,lT=0,lP=null,lA=null,lO=0,lL=0,lj=null,lN=!1,lR=!1,lI=!1,lF=0,lD=0,lz=0,lM=0,l$=0,lB=0,lU=0,lH=null,lQ=null,lZ=!1,lV=0,lW=1/0,lq=null,lG=null,lY=0,lK=null,lX=null,lJ=0,l0=0,l1=null,l2=null,l4=0,l3=null;function l6(){if(0!=(2&lT)&&0!==lO)return lO&-lO;if(null!==N.T){var e=r0;return 0!==e?e:sB()}return eP()}function l9(){0===lB&&(lB=0==(0x20000000&lO)||rx?ek():0x20000000);var e=o2.current;return null!==e&&(e.flags|=32),lB}function l8(e,t,n){(e===lP&&(2===lL||9===lL)||null!==e.cancelPendingCommit)&&(sr(e,0),se(e,lO,lB,!1)),eS(e,n),(0==(2&lT)||e!==lP)&&(e===lP&&(0==(2&lT)&&(lM|=n),4===lD&&se(e,lO,lB,!1)),sR(e))}function l5(e,t,n){if(0!=(6&lT))throw Error(l(327));for(var r=!n&&0==(124&t)&&0==(t&e.expiredLanes)||ev(e,t),a=r?function(e,t){var n=lT;lT|=2;var r=so(),a=si();lP!==e||lO!==t?(lq=null,lW=ee()+500,sr(e,t)):lR=ev(e,t);e:for(;;)try{if(0!==lL&&null!==lA){t=lA;var o=lj;t:switch(lL){case 1:lL=0,lj=null,sd(e,t,o,1);break;case 2:case 9:if(an(o)){lL=0,lj=null,sc(t);break}t=function(){2!==lL&&9!==lL||lP!==e||(lL=7),sR(e)},o.then(t,t);break e;case 3:lL=7;break e;case 4:lL=5;break e;case 7:an(o)?(lL=0,lj=null,sc(t)):(lL=0,lj=null,sd(e,t,o,7));break;case 5:var i=null;switch(lA.tag){case 26:i=lA.memoizedState;case 5:case 27:var s=lA;if(i?uH(i):1){lL=0,lj=null;var u=s.sibling;if(null!==u)lA=u;else{var c=s.return;null!==c?(lA=c,sf(c)):lA=null}break t}}lL=0,lj=null,sd(e,t,o,5);break;case 6:lL=0,lj=null,sd(e,t,o,6);break;case 8:sn(),lD=6;break e;default:throw Error(l(462))}}for(;null!==lA&&!X();)su(lA);break}catch(t){sa(e,t)}return(rI=rR=null,N.H=r,N.A=a,lT=n,null!==lA)?0:(lP=null,lO=0,n1(),lD)}(e,t):ss(e,t,!0),o=r;;){if(0===a)lR&&!r&&se(e,t,0,!1);else{if(n=e.current.alternate,o&&!function(e){for(var t=e;;){var n=t.tag;if((0===n||11===n||15===n)&&16384&t.flags&&null!==(n=t.updateQueue)&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var a=n[r],o=a.getSnapshot;a=a.value;try{if(!nS(o(),a))return!1}catch(e){return!1}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(n)){a=ss(e,t,!1),o=!1;continue}if(2===a){if(o=t,e.errorRecoveryDisabledLanes&o)var i=0;else i=0!=(i=-0x20000001&e.pendingLanes)?i:0x20000000&i?0x20000000:0;if(0!==i){t=i;e:{a=lH;var s=e.current.memoizedState.isDehydrated;if(s&&(sr(e,i).flags|=256),2!==(i=ss(e,i,!1))){if(lI&&!s){e.errorRecoveryDisabledLanes|=o,lM|=o,a=4;break e}o=lQ,lQ=a,null!==o&&(null===lQ?lQ=o:lQ.push.apply(lQ,o))}a=i}if(o=!1,2!==a)continue}}if(1===a){sr(e,0),se(e,t,0,!0);break}e:{switch(r=e,o=a){case 0:case 1:throw Error(l(345));case 4:if((4194048&t)!==t)break;case 6:se(r,t,lB,!lN);break e;case 2:lQ=null;break;case 3:case 5:break;default:throw Error(l(329))}if((0x3c00000&t)===t&&10<(a=lV+300-ee())){if(se(r,t,lB,!lN),0!==ey(r,0,!0))break e;r.timeoutHandle=uc(l7.bind(null,r,n,lQ,lq,lZ,t,lB,lM,lU,lN,o,2,-0,0),a);break e}l7(r,n,lQ,lq,lZ,t,lB,lM,lU,lN,o,0,-0,0)}}break}sR(e)}function l7(e,t,n,r,a,o,i,s,u,c,d,f,p,m){if(e.timeoutHandle=-1,(8192&(f=t.subtreeFlags)||0x1002000==(0x1002000&f))&&(uQ={stylesheets:null,count:0,unsuspend:uZ},lk(t),null!==(f=function(){if(null===uQ)throw Error(l(475));var e=uQ;return e.stylesheets&&0===e.count&&uq(e,e.stylesheets),0<e.count?function(t){var n=setTimeout(function(){if(e.stylesheets&&uq(e,e.stylesheets),e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}},6e4);return e.unsuspend=t,function(){e.unsuspend=null,clearTimeout(n)}}:null}()))){e.cancelPendingCommit=f(sm.bind(null,e,t,o,n,r,a,i,s,u,d,1,p,m)),se(e,o,i,!c);return}sm(e,t,o,n,r,a,i,s,u)}function se(e,t,n,r){t&=~l$,t&=~lM,e.suspendedLanes|=t,e.pingedLanes&=~t,r&&(e.warmLanes|=t),r=e.expirationTimes;for(var a=t;0<a;){var o=31-ef(a),i=1<<o;r[o]=-1,a&=~i}0!==n&&eE(e,n,t)}function st(){return 0!=(6&lT)||(sI(0,!1),!1)}function sn(){if(null!==lA){if(0===lL)var e=lA.return;else e=lA,rI=rR=null,aQ(e),oW=null,oq=0,e=lA;for(;null!==e;)iW(e.alternate,e),e=e.return;lA=null}}function sr(e,t){var n=e.timeoutHandle;-1!==n&&(e.timeoutHandle=-1,ud(n)),null!==(n=e.cancelPendingCommit)&&(e.cancelPendingCommit=null,n()),sn(),lP=e,lA=n=rt(e.current,null),lO=t,lL=0,lj=null,lN=!1,lR=ev(e,t),lI=!1,lU=lB=l$=lM=lz=lD=0,lQ=lH=null,lZ=!1,0!=(8&t)&&(t|=32&t);var r=e.entangledLanes;if(0!==r)for(e=e.entanglements,r&=t;0<r;){var a=31-ef(r),o=1<<a;t|=e[a],r&=~o}return lF=t,n1(),n}function sa(e,t){aC=null,N.H=oH,t===r5||t===ae?(t=ai(),lL=3):t===r7?(t=ai(),lL=4):lL=t===ig?8:null!==t&&"object"==typeof t&&"function"==typeof t.then?6:1,lj=t,null===lA&&(lD=1,ic(e,nK(t,e.current)))}function so(){var e=N.H;return N.H=oH,null===e?oH:e}function si(){var e=N.A;return N.A=l_,e}function sl(){lD=4,lN||(4194048&lO)!==lO&&null!==o2.current||(lR=!0),0==(0x7ffffff&lz)&&0==(0x7ffffff&lM)||null===lP||se(lP,lO,lB,!1)}function ss(e,t,n){var r=lT;lT|=2;var a=so(),o=si();(lP!==e||lO!==t)&&(lq=null,sr(e,t)),t=!1;var i=lD;e:for(;;)try{if(0!==lL&&null!==lA){var l=lA,s=lj;switch(lL){case 8:sn(),i=6;break e;case 3:case 2:case 9:case 6:null===o2.current&&(t=!0);var u=lL;if(lL=0,lj=null,sd(e,l,s,u),n&&lR){i=0;break e}break;default:u=lL,lL=0,lj=null,sd(e,l,s,u)}}(function(){for(;null!==lA;)su(lA)})(),i=lD;break}catch(t){sa(e,t)}return t&&e.shellSuspendCounter++,rI=rR=null,lT=r,N.H=a,N.A=o,null===lA&&(lP=null,lO=0,n1()),i}function su(e){var t=iB(e.alternate,e,lF);e.memoizedProps=e.pendingProps,null===t?sf(e):lA=t}function sc(e){var t=e,n=t.alternate;switch(t.tag){case 15:case 0:t=iC(n,t,t.pendingProps,t.type,void 0,lO);break;case 11:t=iC(n,t,t.pendingProps,t.type.render,t.ref,lO);break;case 5:aQ(t);default:iW(n,t),t=iB(n,t=lA=rn(t,lF),lF)}e.memoizedProps=e.pendingProps,null===t?sf(e):lA=t}function sd(e,t,n,r){rI=rR=null,aQ(t),oW=null,oq=0;var a=t.return;try{if(function(e,t,n,r,a){if(n.flags|=32768,null!==r&&"object"==typeof r&&"function"==typeof r.then){if(null!==(t=n.alternate)&&r$(t,n,a,!0),null!==(n=o2.current)){switch(n.tag){case 13:return null===o4?sl():null===n.alternate&&0===lD&&(lD=3),n.flags&=-257,n.flags|=65536,n.lanes=a,r===at?n.flags|=16384:(null===(t=n.updateQueue)?n.updateQueue=new Set([r]):t.add(r),sS(e,r,a)),!1;case 22:return n.flags|=65536,r===at?n.flags|=16384:(null===(t=n.updateQueue)?(t={transitions:null,markerInstances:null,retryQueue:new Set([r])},n.updateQueue=t):null===(n=t.retryQueue)?t.retryQueue=new Set([r]):n.add(r),sS(e,r,a)),!1}throw Error(l(435,n.tag))}return sS(e,r,a),sl(),!1}if(rx)return null!==(t=o2.current)?(0==(65536&t.flags)&&(t.flags|=256),t.flags|=65536,t.lanes=a,r!==r_&&rj(nK(e=Error(l(422),{cause:r}),n))):(r!==r_&&rj(nK(t=Error(l(423),{cause:r}),n)),e=e.current.alternate,e.flags|=65536,a&=-a,e.lanes|=a,r=nK(r,n),a=ip(e.stateNode,r,a),am(e,a),4!==lD&&(lD=2)),!1;var o=Error(l(520),{cause:r});if(o=nK(o,n),null===lH?lH=[o]:lH.push(o),4!==lD&&(lD=2),null===t)return!0;r=nK(r,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=a&-a,n.lanes|=e,e=ip(n.stateNode,r,e),am(n,e),!1;case 1:if(t=n.type,o=n.stateNode,0==(128&n.flags)&&("function"==typeof t.getDerivedStateFromError||null!==o&&"function"==typeof o.componentDidCatch&&(null===lG||!lG.has(o))))return n.flags|=65536,a&=-a,n.lanes|=a,ih(a=im(a),e,n,r),am(n,a),!1}n=n.return}while(null!==n);return!1}(e,a,t,n,lO)){lD=1,ic(e,nK(n,e.current)),lA=null;return}}catch(t){if(null!==a)throw lA=a,t;lD=1,ic(e,nK(n,e.current)),lA=null;return}32768&t.flags?(rx||1===r?e=!0:lR||0!=(0x20000000&lO)?e=!1:(lN=e=!0,(2===r||9===r||3===r||6===r)&&null!==(r=o2.current)&&13===r.tag&&(r.flags|=16384)),sp(t,e)):sf(t)}function sf(e){var t=e;do{if(0!=(32768&t.flags))return void sp(t,lN);e=t.return;var n=function(e,t,n){var r=t.pendingProps;switch(rv(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:case 1:return iV(t),null;case 3:return n=t.stateNode,r=null,null!==e&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),rD(rG),V(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(null===e||null===e.child)&&(rA(t)?iU(t):null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,rL())),iV(t),null;case 26:return n=t.memoizedState,null===e?(iU(t),null!==n?(iV(t),iH(t,n)):(iV(t),t.flags&=-0x1000001)):n?n!==e.memoizedState?(iU(t),iV(t),iH(t,n)):(iV(t),t.flags&=-0x1000001):(e.memoizedProps!==r&&iU(t),iV(t),t.flags&=-0x1000001),null;case 27:q(t),n=H.current;var a=t.type;if(null!==e&&null!=t.stateNode)e.memoizedProps!==r&&iU(t);else{if(!r){if(null===t.stateNode)throw Error(l(166));return iV(t),null}e=B.current,rA(t)?rT(t,e):(e=ux(a,r,n),t.stateNode=e,iU(t))}return iV(t),null;case 5:if(q(t),n=t.type,null!==e&&null!=t.stateNode)e.memoizedProps!==r&&iU(t);else{if(!r){if(null===t.stateNode)throw Error(l(166));return iV(t),null}if(e=B.current,rA(t))rT(t,e);else{switch(a=uo(H.current),e){case 1:e=a.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=a.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=a.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=a.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":(e=a.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild);break;case"select":e="string"==typeof r.is?a.createElement("select",{is:r.is}):a.createElement("select"),r.multiple?e.multiple=!0:r.size&&(e.size=r.size);break;default:e="string"==typeof r.is?a.createElement(n,{is:r.is}):a.createElement(n)}}e[eO]=t,e[eL]=r;e:for(a=t.child;null!==a;){if(5===a.tag||6===a.tag)e.appendChild(a.stateNode);else if(4!==a.tag&&27!==a.tag&&null!==a.child){a.child.return=a,a=a.child;continue}if(a===t)break;for(;null===a.sibling;){if(null===a.return||a.return===t)break e;a=a.return}a.sibling.return=a.return,a=a.sibling}switch(t.stateNode=e,un(e,n,r),n){case"button":case"input":case"select":case"textarea":e=!!r.autoFocus;break;case"img":e=!0;break;default:e=!1}e&&iU(t)}}return iV(t),t.flags&=-0x1000001,null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&iU(t);else{if("string"!=typeof r&&null===t.stateNode)throw Error(l(166));if(e=H.current,rA(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(a=rk))switch(a.tag){case 27:case 5:r=a.memoizedProps}e[eO]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||s5(e.nodeValue,n)))||rC(t)}else(e=uo(e).createTextNode(r))[eO]=t,t.stateNode=e}return iV(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(a=rA(t),null!==r&&null!==r.dehydrated){if(null===e){if(!a)throw Error(l(318));if(!(a=null!==(a=t.memoizedState)?a.dehydrated:null))throw Error(l(317));a[eO]=t}else rO(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;iV(t),a=!1}else a=rL(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a){if(256&t.flags)return o8(t),t;return o8(t),null}}if(o8(t),0!=(128&t.flags))return t.lanes=n,t;if(n=null!==r,e=null!==e&&null!==e.memoizedState,n){r=t.child,a=null,null!==r.alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(a=r.alternate.memoizedState.cachePool.pool);var o=null;null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)}return n!==e&&n&&(t.child.flags|=8192),iQ(t,t.updateQueue),iV(t),null;case 4:return V(),null===e&&sX(t.stateNode.containerInfo),iV(t),null;case 10:return rD(t.type),iV(t),null;case 19:if(M(o5),null===(a=t.memoizedState))return iV(t),null;if(r=0!=(128&t.flags),null===(o=a.rendering))if(r)iZ(a,!1);else{if(0!==lD||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(o=o7(e))){for(t.flags|=128,iZ(a,!1),e=o.updateQueue,t.updateQueue=e,iQ(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)rn(n,e),n=n.sibling;return $(o5,1&o5.current|2),t.child}e=e.sibling}null!==a.tail&&ee()>lW&&(t.flags|=128,r=!0,iZ(a,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=o7(o))){if(t.flags|=128,r=!0,e=e.updateQueue,t.updateQueue=e,iQ(t,e),iZ(a,!0),null===a.tail&&"hidden"===a.tailMode&&!o.alternate&&!rx)return iV(t),null}else 2*ee()-a.renderingStartTime>lW&&0x20000000!==n&&(t.flags|=128,r=!0,iZ(a,!1),t.lanes=4194304);a.isBackwards?(o.sibling=t.child,t.child=o):(null!==(e=a.last)?e.sibling=o:t.child=o,a.last=o)}if(null!==a.tail)return t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=ee(),t.sibling=null,e=o5.current,$(o5,r?1&e|2:1&e),t;return iV(t),null;case 22:case 23:return o8(t),aE(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?0!=(0x20000000&n)&&0==(128&t.flags)&&(iV(t),6&t.subtreeFlags&&(t.flags|=8192)):iV(t),null!==(n=t.updateQueue)&&iQ(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&M(r3),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),rD(rG),iV(t),null;case 25:case 30:return null}throw Error(l(156,t.tag))}(t.alternate,t,lF);if(null!==n){lA=n;return}if(null!==(t=t.sibling)){lA=t;return}lA=t=e}while(null!==t);0===lD&&(lD=5)}function sp(e,t){do{var n=function(e,t){switch(rv(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return rD(rG),V(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return q(t),null;case 13:if(o8(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(l(340));rO()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return M(o5),null;case 4:return V(),null;case 10:return rD(t.type),null;case 22:case 23:return o8(t),aE(),null!==e&&M(r3),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return rD(rG),null;default:return null}}(e.alternate,e);if(null!==n){n.flags&=32767,lA=n;return}if(null!==(n=e.return)&&(n.flags|=32768,n.subtreeFlags=0,n.deletions=null),!t&&null!==(e=e.sibling)){lA=e;return}lA=e=n}while(null!==e);lD=6,lA=null}function sm(e,t,n,r,a,o,i,s,u){e.cancelPendingCommit=null;do sv();while(0!==lY);if(0!=(6&lT))throw Error(l(327));if(null!==t){if(t===e.current)throw Error(l(177));if(!function(e,t,n,r,a,o){var i=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var l=e.entanglements,s=e.expirationTimes,u=e.hiddenUpdates;for(n=i&~n;0<n;){var c=31-ef(n),d=1<<c;l[c]=0,s[c]=-1;var f=u[c];if(null!==f)for(u[c]=null,c=0;c<f.length;c++){var p=f[c];null!==p&&(p.lane&=-0x20000001)}n&=~d}0!==r&&eE(e,r,0),0!==o&&0===a&&0!==e.tag&&(e.suspendedLanes|=o&~(i&~t))}(e,n,o=t.lanes|t.childLanes|n0,i,s,u),e===lP&&(lA=lP=null,lO=0),lX=t,lK=e,lJ=n,l0=o,l1=a,l2=r,0!=(10256&t.subtreeFlags)||0!=(10256&t.flags)?(e.callbackNode=null,e.callbackPriority=0,Y(ea,function(){return sk(!0),null})):(e.callbackNode=null,e.callbackPriority=0),r=0!=(13878&t.flags),0!=(13878&t.subtreeFlags)||r){r=N.T,N.T=null,a=R.p,R.p=2,i=lT,lT|=4;try{!function(e,t){if(e=e.containerInfo,ur=u4,nP(e=nT(e))){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var a,o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(e){n=null;break e}var s=0,u=-1,c=-1,d=0,f=0,p=e,m=null;t:for(;;){for(;p!==n||0!==o&&3!==p.nodeType||(u=s+o),p!==i||0!==r&&3!==p.nodeType||(c=s+r),3===p.nodeType&&(s+=p.nodeValue.length),null!==(a=p.firstChild);)m=p,p=a;for(;;){if(p===e)break t;if(m===n&&++d===o&&(u=s),m===i&&++f===r&&(c=s),null!==(a=p.nextSibling))break;m=(p=m).parentNode}p=a}n=-1===u||-1===c?null:{start:u,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(ua={focusedElem:e,selectionRange:n},u4=!1,le=t;null!==le;)if(e=(t=le).child,0!=(1024&t.subtreeFlags)&&null!==e)e.return=t,le=e;else for(;null!==le;){switch(i=(t=le).alternate,e=t.flags,t.tag){case 0:case 11:case 15:case 5:case 26:case 27:case 6:case 4:case 17:break;case 1:if(0!=(1024&e)&&null!==i){e=void 0,n=t,o=i.memoizedProps,i=i.memoizedState,r=n.stateNode;try{var h=io(n.type,o,n.elementType===n.type);e=r.getSnapshotBeforeUpdate(h,i),r.__reactInternalSnapshotBeforeUpdate=e}catch(e){sx(n,n.return,e)}}break;case 3:if(0!=(1024&e)){if(9===(n=(e=t.stateNode.containerInfo).nodeType))ub(e);else if(1===n)switch(e.nodeName){case"HEAD":case"HTML":case"BODY":ub(e);break;default:e.textContent=""}}break;default:if(0!=(1024&e))throw Error(l(163))}if(null!==(e=t.sibling)){e.return=t.return,le=e;break}le=t.return}}(e,t,n)}finally{lT=i,R.p=a,N.T=r}}lY=1,sh(),sg(),sb()}}function sh(){if(1===lY){lY=0;var e=lK,t=lX,n=0!=(13878&t.flags);if(0!=(13878&t.subtreeFlags)||n){n=N.T,N.T=null;var r=R.p;R.p=2;var a=lT;lT|=4;try{lc(t,e);var o=ua,i=nT(e.containerInfo),l=o.focusedElem,s=o.selectionRange;if(i!==l&&l&&l.ownerDocument&&function e(t,n){return!!t&&!!n&&(t===n||(!t||3!==t.nodeType)&&(n&&3===n.nodeType?e(t,n.parentNode):"contains"in t?t.contains(n):!!t.compareDocumentPosition&&!!(16&t.compareDocumentPosition(n))))}(l.ownerDocument.documentElement,l)){if(null!==s&&nP(l)){var u=s.start,c=s.end;if(void 0===c&&(c=u),"selectionStart"in l)l.selectionStart=u,l.selectionEnd=Math.min(c,l.value.length);else{var d=l.ownerDocument||document,f=d&&d.defaultView||window;if(f.getSelection){var p=f.getSelection(),m=l.textContent.length,h=Math.min(s.start,m),g=void 0===s.end?h:Math.min(s.end,m);!p.extend&&h>g&&(i=g,g=h,h=i);var b=nC(l,h),y=nC(l,g);if(b&&y&&(1!==p.rangeCount||p.anchorNode!==b.node||p.anchorOffset!==b.offset||p.focusNode!==y.node||p.focusOffset!==y.offset)){var v=d.createRange();v.setStart(b.node,b.offset),p.removeAllRanges(),h>g?(p.addRange(v),p.extend(y.node,y.offset)):(v.setEnd(y.node,y.offset),p.addRange(v))}}}}for(d=[],p=l;p=p.parentNode;)1===p.nodeType&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for("function"==typeof l.focus&&l.focus(),l=0;l<d.length;l++){var k=d[l];k.element.scrollLeft=k.left,k.element.scrollTop=k.top}}u4=!!ur,ua=ur=null}finally{lT=a,R.p=r,N.T=n}}e.current=t,lY=2}}function sg(){if(2===lY){lY=0;var e=lK,t=lX,n=0!=(8772&t.flags);if(0!=(8772&t.subtreeFlags)||n){n=N.T,N.T=null;var r=R.p;R.p=2;var a=lT;lT|=4;try{lt(e,t.alternate,t)}finally{lT=a,R.p=r,N.T=n}}lY=3}}function sb(){if(4===lY||3===lY){lY=0,J();var e=lK,t=lX,n=lJ,r=l2;0!=(10256&t.subtreeFlags)||0!=(10256&t.flags)?lY=5:(lY=0,lX=lK=null,sy(e,e.pendingLanes));var a=e.pendingLanes;if(0===a&&(lG=null),eT(n),t=t.stateNode,ec&&"function"==typeof ec.onCommitFiberRoot)try{ec.onCommitFiberRoot(eu,t,void 0,128==(128&t.current.flags))}catch(e){}if(null!==r){t=N.T,a=R.p,R.p=2,N.T=null;try{for(var o=e.onRecoverableError,i=0;i<r.length;i++){var l=r[i];o(l.value,{componentStack:l.stack})}}finally{N.T=t,R.p=a}}0!=(3&lJ)&&sv(),sR(e),a=e.pendingLanes,0!=(4194090&n)&&0!=(42&a)?e===l3?l4++:(l4=0,l3=e):l4=0,sI(0,!1)}}function sy(e,t){0==(e.pooledCacheLanes&=t)&&null!=(t=e.pooledCache)&&(e.pooledCache=null,rK(t))}function sv(e){return sh(),sg(),sb(),sk(e)}function sk(){if(5!==lY)return!1;var e=lK,t=l0;l0=0;var n=eT(lJ),r=N.T,a=R.p;try{R.p=32>n?32:n,N.T=null,n=l1,l1=null;var o=lK,i=lJ;if(lY=0,lX=lK=null,lJ=0,0!=(6&lT))throw Error(l(331));var s=lT;if(lT|=4,lS(o.current),lg(o,o.current,i,n),lT=s,sI(0,!1),ec&&"function"==typeof ec.onPostCommitFiberRoot)try{ec.onPostCommitFiberRoot(eu,o)}catch(e){}return!0}finally{R.p=a,N.T=r,sy(e,t)}}function sw(e,t,n){t=nK(n,t),t=ip(e.stateNode,t,2),null!==(e=af(e,t,2))&&(eS(e,2),sR(e))}function sx(e,t,n){if(3===e.tag)sw(e,e,n);else for(;null!==t;){if(3===t.tag){sw(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===lG||!lG.has(r))){e=nK(n,e),null!==(r=af(t,n=im(2),2))&&(ih(n,r,t,e),eS(r,2),sR(r));break}}t=t.return}}function sS(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new lC;var a=new Set;r.set(t,a)}else void 0===(a=r.get(t))&&(a=new Set,r.set(t,a));a.has(n)||(lI=!0,a.add(n),e=sE.bind(null,e,t,n),t.then(e,e))}function sE(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,lP===e&&(lO&n)===n&&(4===lD||3===lD&&(0x3c00000&lO)===lO&&300>ee()-lV?0==(2&lT)&&sr(e,0):l$|=n,lU===lO&&(lU=0)),sR(e)}function s_(e,t){0===t&&(t=ew()),null!==(e=n3(e,t))&&(eS(e,t),sR(e))}function sC(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),s_(e,n)}function sT(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;null!==a&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(l(314))}null!==r&&r.delete(t),s_(e,n)}var sP=null,sA=null,sO=!1,sL=!1,sj=!1,sN=0;function sR(e){e!==sA&&null===e.next&&(null===sA?sP=sA=e:sA=sA.next=e),sL=!0,sO||(sO=!0,up(function(){0!=(6&lT)?Y(en,sF):sD()}))}function sI(e,t){if(!sj&&sL){sj=!0;do for(var n=!1,r=sP;null!==r;){if(!t)if(0!==e){var a=r.pendingLanes;if(0===a)var o=0;else{var i=r.suspendedLanes,l=r.pingedLanes;o=0xc000095&(o=(1<<31-ef(42|e)+1)-1&(a&~(i&~l)))?0xc000095&o|1:o?2|o:0}0!==o&&(n=!0,s$(r,o))}else o=lO,0==(3&(o=ey(r,r===lP?o:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||ev(r,o)||(n=!0,s$(r,o));r=r.next}while(n);sj=!1}}function sF(){sD()}function sD(){sL=sO=!1;var e,t=0;0!==sN&&(((e=window.event)&&"popstate"===e.type?e===uu||(uu=e,0):(uu=null,1))||(t=sN),sN=0);for(var n=ee(),r=null,a=sP;null!==a;){var o=a.next,i=sz(a,n);0===i?(a.next=null,null===r?sP=o:r.next=o,null===o&&(sA=r)):(r=a,(0!==t||0!=(3&i))&&(sL=!0)),a=o}sI(t,!1)}function sz(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,a=e.expirationTimes,o=-0x3c00001&e.pendingLanes;0<o;){var i=31-ef(o),l=1<<i,s=a[i];-1===s?(0==(l&n)||0!=(l&r))&&(a[i]=function(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return -1}}(l,t)):s<=t&&(e.expiredLanes|=l),o&=~l}if(t=lP,n=lO,n=ey(e,e===t?n:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle),r=e.callbackNode,0===n||e===t&&(2===lL||9===lL)||null!==e.cancelPendingCommit)return null!==r&&null!==r&&K(r),e.callbackNode=null,e.callbackPriority=0;if(0==(3&n)||ev(e,n)){if((t=n&-n)===e.callbackPriority)return t;switch(null!==r&&K(r),eT(n)){case 2:case 8:n=er;break;case 32:default:n=ea;break;case 0x10000000:n=ei}return n=Y(n,r=sM.bind(null,e)),e.callbackPriority=t,e.callbackNode=n,t}return null!==r&&null!==r&&K(r),e.callbackPriority=2,e.callbackNode=null,2}function sM(e,t){if(0!==lY&&5!==lY)return e.callbackNode=null,e.callbackPriority=0,null;var n=e.callbackNode;if(sv(!0)&&e.callbackNode!==n)return null;var r=lO;return 0===(r=ey(e,e===lP?r:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle))?null:(l5(e,r,t),sz(e,ee()),null!=e.callbackNode&&e.callbackNode===n?sM.bind(null,e):null)}function s$(e,t){if(sv())return null;l5(e,t,!0)}function sB(){return 0===sN&&(sN=ek()),sN}function sU(e){return null==e||"symbol"==typeof e||"boolean"==typeof e?null:"function"==typeof e?e:tm(""+e)}function sH(e,t){var n=t.ownerDocument.createElement("input");return n.name=t.name,n.value=t.value,e.id&&n.setAttribute("form",e.id),t.parentNode.insertBefore(n,t),e=new FormData(e),n.parentNode.removeChild(n),e}for(var sQ=0;sQ<nq.length;sQ++){var sZ=nq[sQ];nG(sZ.toLowerCase(),"on"+(sZ[0].toUpperCase()+sZ.slice(1)))}nG(n$,"onAnimationEnd"),nG(nB,"onAnimationIteration"),nG(nU,"onAnimationStart"),nG("dblclick","onDoubleClick"),nG("focusin","onFocus"),nG("focusout","onBlur"),nG(nH,"onTransitionRun"),nG(nQ,"onTransitionStart"),nG(nZ,"onTransitionCancel"),nG(nV,"onTransitionEnd"),eW("onMouseEnter",["mouseout","mouseover"]),eW("onMouseLeave",["mouseout","mouseover"]),eW("onPointerEnter",["pointerout","pointerover"]),eW("onPointerLeave",["pointerout","pointerover"]),eV("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),eV("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),eV("onBeforeInput",["compositionend","keypress","textInput","paste"]),eV("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),eV("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),eV("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var sV="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),sW=new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(sV));function sq(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],s=l.instance,u=l.currentTarget;if(l=l.listener,s!==o&&a.isPropagationStopped())break e;o=l,a.currentTarget=u;try{o(a)}catch(e){ii(e)}a.currentTarget=null,o=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,u=l.currentTarget,l=l.listener,s!==o&&a.isPropagationStopped())break e;o=l,a.currentTarget=u;try{o(a)}catch(e){ii(e)}a.currentTarget=null,o=s}}}}function sG(e,t){var n=t[eN];void 0===n&&(n=t[eN]=new Set);var r=e+"__bubble";n.has(r)||(sJ(t,e,2,!1),n.add(r))}function sY(e,t,n){var r=0;t&&(r|=4),sJ(n,e,r,t)}var sK="_reactListening"+Math.random().toString(36).slice(2);function sX(e){if(!e[sK]){e[sK]=!0,eQ.forEach(function(t){"selectionchange"!==t&&(sW.has(t)||sY(t,!1,e),sY(t,!0,e))});var t=9===e.nodeType?e:e.ownerDocument;null===t||t[sK]||(t[sK]=!0,sY("selectionchange",!1,t))}}function sJ(e,t,n,r){switch(ce(t)){case 2:var a=u3;break;case 8:a=u6;break;default:a=u9}n=a.bind(null,t,n,e),a=void 0,tE&&("touchstart"===t||"touchmove"===t||"wheel"===t)&&(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function s0(e,t,n,r,a){var o=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var l=r.stateNode.containerInfo;if(l===a)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&i.stateNode.containerInfo===a)return;i=i.return}for(;null!==l;){if(null===(i=eM(l)))return;if(5===(s=i.tag)||6===s||26===s||27===s){r=o=i;continue e}l=l.parentNode}}r=r.return}tw(function(){var r=o,a=tg(n),i=[];e:{var l=nW.get(e);if(void 0!==l){var s=t$,c=e;switch(e){case"keypress":if(0===tO(n))break e;case"keydown":case"keyup":s=t1;break;case"focusin":c="focus",s=tV;break;case"focusout":c="blur",s=tV;break;case"beforeblur":case"afterblur":s=tV;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=tQ;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=tZ;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=t4;break;case n$:case nB:case nU:s=tW;break;case nV:s=t3;break;case"scroll":case"scrollend":s=tU;break;case"wheel":s=t6;break;case"copy":case"cut":case"paste":s=tq;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=t2;break;case"toggle":case"beforetoggle":s=t9}var d=0!=(4&t),f=!d&&("scroll"===e||"scrollend"===e),p=d?null!==l?l+"Capture":null:l;d=[];for(var m,h=r;null!==h;){var g=h;if(m=g.stateNode,5!==(g=g.tag)&&26!==g&&27!==g||null===m||null===p||null!=(g=tx(h,p))&&d.push(s1(h,g,m)),f)break;h=h.return}0<d.length&&(l=new s(l,c,null,n,a),i.push({event:l,listeners:d}))}}if(0==(7&t)){if((l="mouseover"===e||"pointerover"===e,s="mouseout"===e||"pointerout"===e,!(l&&n!==th&&(c=n.relatedTarget||n.fromElement)&&(eM(c)||c[ej])))&&(s||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,s?(c=n.relatedTarget||n.toElement,s=r,null!==(c=c?eM(c):null)&&(f=u(c),d=c.tag,c!==f||5!==d&&27!==d&&6!==d)&&(c=null)):(s=null,c=r),s!==c)){if(d=tQ,g="onMouseLeave",p="onMouseEnter",h="mouse",("pointerout"===e||"pointerover"===e)&&(d=t2,g="onPointerLeave",p="onPointerEnter",h="pointer"),f=null==s?l:eB(s),m=null==c?l:eB(c),(l=new d(g,h+"leave",s,n,a)).target=f,l.relatedTarget=m,g=null,eM(a)===r&&((d=new d(p,h+"enter",c,n,a)).target=m,d.relatedTarget=f,g=d),f=g,s&&c)t:{for(d=s,p=c,h=0,m=d;m;m=s4(m))h++;for(m=0,g=p;g;g=s4(g))m++;for(;0<h-m;)d=s4(d),h--;for(;0<m-h;)p=s4(p),m--;for(;h--;){if(d===p||null!==p&&d===p.alternate)break t;d=s4(d),p=s4(p)}d=null}else d=null;null!==s&&s3(i,l,s,d,!1),null!==c&&null!==f&&s3(i,f,c,d,!0)}e:{if("select"===(s=(l=r?eB(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var b,y=np;else if(nl(l))if(nm)y=nx;else{y=nk;var v=nv}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)?y=nw:r&&td(r.elementType)&&(y=np);if(y&&(y=y(e,r))){ns(i,y,n,a);break e}v&&v(e,l,r),"focusout"===e&&r&&"number"===l.type&&null!=r.memoizedProps.value&&tr(l,"number",l.value)}switch(v=r?eB(r):window,e){case"focusin":(nl(v)||"true"===v.contentEditable)&&(nO=v,nL=r,nj=null);break;case"focusout":nj=nL=nO=null;break;case"mousedown":nN=!0;break;case"contextmenu":case"mouseup":case"dragend":nN=!1,nR(i,n,a);break;case"selectionchange":if(nA)break;case"keydown":case"keyup":nR(i,n,a)}if(t5)t:{switch(e){case"compositionstart":var k="onCompositionStart";break t;case"compositionend":k="onCompositionEnd";break t;case"compositionupdate":k="onCompositionUpdate";break t}k=void 0}else no?nr(e,n)&&(k="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(k="onCompositionStart");k&&(nt&&"ko"!==n.locale&&(no||"onCompositionStart"!==k?"onCompositionEnd"===k&&no&&(b=tA()):(tT="value"in(tC=a)?tC.value:tC.textContent,no=!0)),0<(v=s2(r,k)).length&&(k=new tG(k,e,null,n,a),i.push({event:k,listeners:v}),b?k.data=b:null!==(b=na(n))&&(k.data=b))),(b=ne?function(e,t){switch(e){case"compositionend":return na(t);case"keypress":if(32!==t.which)return null;return nn=!0," ";case"textInput":return" "===(e=t.data)&&nn?null:e;default:return null}}(e,n):function(e,t){if(no)return"compositionend"===e||!t5&&nr(e,t)?(e=tA(),tP=tT=tC=null,no=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return nt&&"ko"!==t.locale?null:t.data}}(e,n))&&0<(k=s2(r,"onBeforeInput")).length&&(v=new tG("onBeforeInput","beforeinput",null,n,a),i.push({event:v,listeners:k}),v.data=b);var w=e;if("submit"===w&&r&&r.stateNode===a){var x=sU((a[eL]||null).action),S=n.submitter;S&&null!==(w=(w=S[eL]||null)?sU(w.formAction):S.getAttribute("formAction"))&&(x=w,S=null);var E=new t$("action","action",null,n,a);i.push({event:E,listeners:[{instance:null,listener:function(){if(n.defaultPrevented){if(0!==sN){var e=S?sH(a,S):new FormData(a);oA(r,{pending:!0,data:e,method:a.method,action:x},null,e)}}else"function"==typeof x&&(E.preventDefault(),oA(r,{pending:!0,data:e=S?sH(a,S):new FormData(a),method:a.method,action:x},x,e))},currentTarget:a}]})}}sq(i,t)})}function s1(e,t,n){return{instance:e,listener:t,currentTarget:n}}function s2(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;if(5!==(a=a.tag)&&26!==a&&27!==a||null===o||(null!=(a=tx(e,n))&&r.unshift(s1(e,a,o)),null!=(a=tx(e,t))&&r.push(s1(e,a,o))),3===e.tag)return r;e=e.return}return[]}function s4(e){if(null===e)return null;do e=e.return;while(e&&5!==e.tag&&27!==e.tag);return e||null}function s3(e,t,n,r,a){for(var o=t._reactName,i=[];null!==n&&n!==r;){var l=n,s=l.alternate,u=l.stateNode;if(l=l.tag,null!==s&&s===r)break;5!==l&&26!==l&&27!==l||null===u||(s=u,a?null!=(u=tx(n,o))&&i.unshift(s1(n,u,s)):a||null!=(u=tx(n,o))&&i.push(s1(n,u,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var s6=/\r\n?/g,s9=/\u0000|\uFFFD/g;function s8(e){return("string"==typeof e?e:""+e).replace(s6,"\n").replace(s9,"")}function s5(e,t){return t=s8(t),s8(e)===t}function s7(){}function ue(e,t,n,r,a,o){switch(n){case"children":"string"==typeof r?"body"===t||"textarea"===t&&""===r||tl(e,r):("number"==typeof r||"bigint"==typeof r)&&"body"!==t&&tl(e,""+r);break;case"className":eX(e,"class",r);break;case"tabIndex":eX(e,"tabindex",r);break;case"dir":case"role":case"viewBox":case"width":case"height":eX(e,n,r);break;case"style":tc(e,r,o);break;case"data":if("object"!==t){eX(e,"data",r);break}case"src":case"href":if(""===r&&("a"!==t||"href"!==n)||null==r||"function"==typeof r||"symbol"==typeof r||"boolean"==typeof r){e.removeAttribute(n);break}r=tm(""+r),e.setAttribute(n,r);break;case"action":case"formAction":if("function"==typeof r){e.setAttribute(n,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}if("function"==typeof o&&("formAction"===n?("input"!==t&&ue(e,t,"name",a.name,a,null),ue(e,t,"formEncType",a.formEncType,a,null),ue(e,t,"formMethod",a.formMethod,a,null),ue(e,t,"formTarget",a.formTarget,a,null)):(ue(e,t,"encType",a.encType,a,null),ue(e,t,"method",a.method,a,null),ue(e,t,"target",a.target,a,null))),null==r||"symbol"==typeof r||"boolean"==typeof r){e.removeAttribute(n);break}r=tm(""+r),e.setAttribute(n,r);break;case"onClick":null!=r&&(e.onclick=s7);break;case"onScroll":null!=r&&sG("scroll",e);break;case"onScrollEnd":null!=r&&sG("scrollend",e);break;case"dangerouslySetInnerHTML":if(null!=r){if("object"!=typeof r||!("__html"in r))throw Error(l(61));if(null!=(n=r.__html)){if(null!=a.children)throw Error(l(60));e.innerHTML=n}}break;case"multiple":e.multiple=r&&"function"!=typeof r&&"symbol"!=typeof r;break;case"muted":e.muted=r&&"function"!=typeof r&&"symbol"!=typeof r;break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":case"autoFocus":case"innerText":case"textContent":break;case"xlinkHref":if(null==r||"function"==typeof r||"boolean"==typeof r||"symbol"==typeof r){e.removeAttribute("xlink:href");break}n=tm(""+r),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",n);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":null!=r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,""+r):e.removeAttribute(n);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,""):e.removeAttribute(n);break;case"capture":case"download":!0===r?e.setAttribute(n,""):!1!==r&&null!=r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,r):e.removeAttribute(n);break;case"cols":case"rows":case"size":case"span":null!=r&&"function"!=typeof r&&"symbol"!=typeof r&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case"rowSpan":case"start":null==r||"function"==typeof r||"symbol"==typeof r||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case"popover":sG("beforetoggle",e),sG("toggle",e),eK(e,"popover",r);break;case"xlinkActuate":eJ(e,"http://www.w3.org/1999/xlink","xlink:actuate",r);break;case"xlinkArcrole":eJ(e,"http://www.w3.org/1999/xlink","xlink:arcrole",r);break;case"xlinkRole":eJ(e,"http://www.w3.org/1999/xlink","xlink:role",r);break;case"xlinkShow":eJ(e,"http://www.w3.org/1999/xlink","xlink:show",r);break;case"xlinkTitle":eJ(e,"http://www.w3.org/1999/xlink","xlink:title",r);break;case"xlinkType":eJ(e,"http://www.w3.org/1999/xlink","xlink:type",r);break;case"xmlBase":eJ(e,"http://www.w3.org/XML/1998/namespace","xml:base",r);break;case"xmlLang":eJ(e,"http://www.w3.org/XML/1998/namespace","xml:lang",r);break;case"xmlSpace":eJ(e,"http://www.w3.org/XML/1998/namespace","xml:space",r);break;case"is":eK(e,"is",r);break;default:2<n.length&&("o"===n[0]||"O"===n[0])&&("n"===n[1]||"N"===n[1])||eK(e,n=tf.get(n)||n,r)}}function ut(e,t,n,r,a,o){switch(n){case"style":tc(e,r,o);break;case"dangerouslySetInnerHTML":if(null!=r){if("object"!=typeof r||!("__html"in r))throw Error(l(61));if(null!=(n=r.__html)){if(null!=a.children)throw Error(l(60));e.innerHTML=n}}break;case"children":"string"==typeof r?tl(e,r):("number"==typeof r||"bigint"==typeof r)&&tl(e,""+r);break;case"onScroll":null!=r&&sG("scroll",e);break;case"onScrollEnd":null!=r&&sG("scrollend",e);break;case"onClick":null!=r&&(e.onclick=s7);break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"innerHTML":case"ref":case"innerText":case"textContent":break;default:if(!eZ.hasOwnProperty(n))e:{if("o"===n[0]&&"n"===n[1]&&(a=n.endsWith("Capture"),t=n.slice(2,a?n.length-7:void 0),"function"==typeof(o=null!=(o=e[eL]||null)?o[n]:null)&&e.removeEventListener(t,o,a),"function"==typeof r)){"function"!=typeof o&&null!==o&&(n in e?e[n]=null:e.hasAttribute(n)&&e.removeAttribute(n)),e.addEventListener(t,r,a);break e}n in e?e[n]=r:!0===r?e.setAttribute(n,""):eK(e,n,r)}}}function un(e,t,n){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"img":sG("error",e),sG("load",e);var r,a=!1,o=!1;for(r in n)if(n.hasOwnProperty(r)){var i=n[r];if(null!=i)switch(r){case"src":a=!0;break;case"srcSet":o=!0;break;case"children":case"dangerouslySetInnerHTML":throw Error(l(137,t));default:ue(e,t,r,i,n,null)}}o&&ue(e,t,"srcSet",n.srcSet,n,null),a&&ue(e,t,"src",n.src,n,null);return;case"input":sG("invalid",e);var s=r=i=o=null,u=null,c=null;for(a in n)if(n.hasOwnProperty(a)){var d=n[a];if(null!=d)switch(a){case"name":o=d;break;case"type":i=d;break;case"checked":u=d;break;case"defaultChecked":c=d;break;case"value":r=d;break;case"defaultValue":s=d;break;case"children":case"dangerouslySetInnerHTML":if(null!=d)throw Error(l(137,t));break;default:ue(e,t,a,d,n,null)}}tn(e,r,s,u,c,i,o,!1),e9(e);return;case"select":for(o in sG("invalid",e),a=i=r=null,n)if(n.hasOwnProperty(o)&&null!=(s=n[o]))switch(o){case"value":r=s;break;case"defaultValue":i=s;break;case"multiple":a=s;default:ue(e,t,o,s,n,null)}t=r,n=i,e.multiple=!!a,null!=t?ta(e,!!a,t,!1):null!=n&&ta(e,!!a,n,!0);return;case"textarea":for(i in sG("invalid",e),r=o=a=null,n)if(n.hasOwnProperty(i)&&null!=(s=n[i]))switch(i){case"value":a=s;break;case"defaultValue":o=s;break;case"children":r=s;break;case"dangerouslySetInnerHTML":if(null!=s)throw Error(l(91));break;default:ue(e,t,i,s,n,null)}ti(e,a,o,r),e9(e);return;case"option":for(u in n)n.hasOwnProperty(u)&&null!=(a=n[u])&&("selected"===u?e.selected=a&&"function"!=typeof a&&"symbol"!=typeof a:ue(e,t,u,a,n,null));return;case"dialog":sG("beforetoggle",e),sG("toggle",e),sG("cancel",e),sG("close",e);break;case"iframe":case"object":sG("load",e);break;case"video":case"audio":for(a=0;a<sV.length;a++)sG(sV[a],e);break;case"image":sG("error",e),sG("load",e);break;case"details":sG("toggle",e);break;case"embed":case"source":case"link":sG("error",e),sG("load",e);case"area":case"base":case"br":case"col":case"hr":case"keygen":case"meta":case"param":case"track":case"wbr":case"menuitem":for(c in n)if(n.hasOwnProperty(c)&&null!=(a=n[c]))switch(c){case"children":case"dangerouslySetInnerHTML":throw Error(l(137,t));default:ue(e,t,c,a,n,null)}return;default:if(td(t)){for(d in n)n.hasOwnProperty(d)&&void 0!==(a=n[d])&&ut(e,t,d,a,n,void 0);return}}for(s in n)n.hasOwnProperty(s)&&null!=(a=n[s])&&ue(e,t,s,a,n,null)}var ur=null,ua=null;function uo(e){return 9===e.nodeType?e:e.ownerDocument}function ui(e){switch(e){case"http://www.w3.org/2000/svg":return 1;case"http://www.w3.org/1998/Math/MathML":return 2;default:return 0}}function ul(e,t){if(0===e)switch(t){case"svg":return 1;case"math":return 2;default:return 0}return 1===e&&"foreignObject"===t?0:e}function us(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"bigint"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var uu=null,uc="function"==typeof setTimeout?setTimeout:void 0,ud="function"==typeof clearTimeout?clearTimeout:void 0,uf="function"==typeof Promise?Promise:void 0,up="function"==typeof queueMicrotask?queueMicrotask:void 0!==uf?function(e){return uf.resolve(null).then(e).catch(um)}:uc;function um(e){setTimeout(function(){throw e})}function uh(e){return"head"===e}function ug(e,t){var n=t,r=0,a=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0<r&&8>r){n=r;var i=e.ownerDocument;if(1&n&&uS(i.documentElement),2&n&&uS(i.body),4&n)for(uS(n=i.head),i=n.firstChild;i;){var l=i.nextSibling,s=i.nodeName;i[eD]||"SCRIPT"===s||"STYLE"===s||"LINK"===s&&"stylesheet"===i.rel.toLowerCase()||n.removeChild(i),i=l}}if(0===a){e.removeChild(o),cy(t);return}a--}else"$"===n||"$?"===n||"$!"===n?a++:r=n.charCodeAt(0)-48;else r=0;n=o}while(n);cy(t)}function ub(e){var t=e.firstChild;for(t&&10===t.nodeType&&(t=t.nextSibling);t;){var n=t;switch(t=t.nextSibling,n.nodeName){case"HTML":case"HEAD":case"BODY":ub(n),ez(n);continue;case"SCRIPT":case"STYLE":continue;case"LINK":if("stylesheet"===n.rel.toLowerCase())continue}e.removeChild(n)}}function uy(e){return"$!"===e.data||"$?"===e.data&&"complete"===e.ownerDocument.readyState}function uv(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t||"F!"===t||"F"===t)break;if("/$"===t)return null}}return e}var uk=null;function uw(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}function ux(e,t,n){switch(t=uo(n),e){case"html":if(!(e=t.documentElement))throw Error(l(452));return e;case"head":if(!(e=t.head))throw Error(l(453));return e;case"body":if(!(e=t.body))throw Error(l(454));return e;default:throw Error(l(451))}}function uS(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);ez(e)}var uE=new Map,u_=new Set;function uC(e){return"function"==typeof e.getRootNode?e.getRootNode():9===e.nodeType?e:e.ownerDocument}var uT=R.d;R.d={f:function(){var e=uT.f(),t=st();return e||t},r:function(e){var t=e$(e);null!==t&&5===t.tag&&"form"===t.type?oL(t):uT.r(e)},D:function(e){uT.D(e),uA("dns-prefetch",e,null)},C:function(e,t){uT.C(e,t),uA("preconnect",e,t)},L:function(e,t,n){if(uT.L(e,t,n),uP&&e&&t){var r='link[rel="preload"][as="'+te(t)+'"]';"image"===t&&n&&n.imageSrcSet?(r+='[imagesrcset="'+te(n.imageSrcSet)+'"]',"string"==typeof n.imageSizes&&(r+='[imagesizes="'+te(n.imageSizes)+'"]')):r+='[href="'+te(e)+'"]';var a=r;switch(t){case"style":a=uL(e);break;case"script":a=uR(e)}uE.has(a)||(e=f({rel:"preload",href:"image"===t&&n&&n.imageSrcSet?void 0:e,as:t},n),uE.set(a,e),null!==uP.querySelector(r)||"style"===t&&uP.querySelector(uj(a))||"script"===t&&uP.querySelector(uI(a))||(un(t=uP.createElement("link"),"link",e),eH(t),uP.head.appendChild(t)))}},m:function(e,t){if(uT.m(e,t),uP&&e){var n=t&&"string"==typeof t.as?t.as:"script",r='link[rel="modulepreload"][as="'+te(n)+'"][href="'+te(e)+'"]',a=r;switch(n){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":a=uR(e)}if(!uE.has(a)&&(e=f({rel:"modulepreload",href:e},t),uE.set(a,e),null===uP.querySelector(r))){switch(n){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(uP.querySelector(uI(a)))return}un(n=uP.createElement("link"),"link",e),eH(n),uP.head.appendChild(n)}}},X:function(e,t){if(uT.X(e,t),uP&&e){var n=eU(uP).hoistableScripts,r=uR(e),a=n.get(r);a||((a=uP.querySelector(uI(r)))||(e=f({src:e,async:!0},t),(t=uE.get(r))&&uM(e,t),eH(a=uP.createElement("script")),un(a,"link",e),uP.head.appendChild(a)),a={type:"script",instance:a,count:1,state:null},n.set(r,a))}},S:function(e,t,n){if(uT.S(e,t,n),uP&&e){var r=eU(uP).hoistableStyles,a=uL(e);t=t||"default";var o=r.get(a);if(!o){var i={loading:0,preload:null};if(o=uP.querySelector(uj(a)))i.loading=5;else{e=f({rel:"stylesheet",href:e,"data-precedence":t},n),(n=uE.get(a))&&uz(e,n);var l=o=uP.createElement("link");eH(l),un(l,"link",e),l._p=new Promise(function(e,t){l.onload=e,l.onerror=t}),l.addEventListener("load",function(){i.loading|=1}),l.addEventListener("error",function(){i.loading|=2}),i.loading|=4,uD(o,t,uP)}o={type:"stylesheet",instance:o,count:1,state:i},r.set(a,o)}}},M:function(e,t){if(uT.M(e,t),uP&&e){var n=eU(uP).hoistableScripts,r=uR(e),a=n.get(r);a||((a=uP.querySelector(uI(r)))||(e=f({src:e,async:!0,type:"module"},t),(t=uE.get(r))&&uM(e,t),eH(a=uP.createElement("script")),un(a,"link",e),uP.head.appendChild(a)),a={type:"script",instance:a,count:1,state:null},n.set(r,a))}}};var uP="undefined"==typeof document?null:document;function uA(e,t,n){if(uP&&"string"==typeof t&&t){var r=te(t);r='link[rel="'+e+'"][href="'+r+'"]',"string"==typeof n&&(r+='[crossorigin="'+n+'"]'),u_.has(r)||(u_.add(r),e={rel:e,crossOrigin:n,href:t},null===uP.querySelector(r)&&(un(t=uP.createElement("link"),"link",e),eH(t),uP.head.appendChild(t)))}}function uO(e,t,n,r){var a=(a=H.current)?uC(a):null;if(!a)throw Error(l(446));switch(e){case"meta":case"title":return null;case"style":return"string"==typeof n.precedence&&"string"==typeof n.href?(t=uL(n.href),(r=(n=eU(a).hoistableStyles).get(t))||(r={type:"style",instance:null,count:0,state:null},n.set(t,r)),r):{type:"void",instance:null,count:0,state:null};case"link":if("stylesheet"===n.rel&&"string"==typeof n.href&&"string"==typeof n.precedence){e=uL(n.href);var o,i,s,u,c=eU(a).hoistableStyles,d=c.get(e);if(d||(a=a.ownerDocument||a,d={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},c.set(e,d),(c=a.querySelector(uj(e)))&&!c._p&&(d.instance=c,d.state.loading=5),uE.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},uE.set(e,n),c||(o=a,i=e,s=n,u=d.state,o.querySelector('link[rel="preload"][as="style"]['+i+"]")?u.loading=1:(u.preload=i=o.createElement("link"),i.addEventListener("load",function(){return u.loading|=1}),i.addEventListener("error",function(){return u.loading|=2}),un(i,"link",s),eH(i),o.head.appendChild(i))))),t&&null===r)throw Error(l(528,""));return d}if(t&&null!==r)throw Error(l(529,""));return null;case"script":return t=n.async,"string"==typeof(n=n.src)&&t&&"function"!=typeof t&&"symbol"!=typeof t?(t=uR(n),(r=(n=eU(a).hoistableScripts).get(t))||(r={type:"script",instance:null,count:0,state:null},n.set(t,r)),r):{type:"void",instance:null,count:0,state:null};default:throw Error(l(444,e))}}function uL(e){return'href="'+te(e)+'"'}function uj(e){return'link[rel="stylesheet"]['+e+"]"}function uN(e){return f({},e,{"data-precedence":e.precedence,precedence:null})}function uR(e){return'[src="'+te(e)+'"]'}function uI(e){return"script[async]"+e}function uF(e,t,n){if(t.count++,null===t.instance)switch(t.type){case"style":var r=e.querySelector('style[data-href~="'+te(n.href)+'"]');if(r)return t.instance=r,eH(r),r;var a=f({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return eH(r=(e.ownerDocument||e).createElement("style")),un(r,"style",a),uD(r,n.precedence,e),t.instance=r;case"stylesheet":a=uL(n.href);var o=e.querySelector(uj(a));if(o)return t.state.loading|=4,t.instance=o,eH(o),o;r=uN(n),(a=uE.get(a))&&uz(r,a),eH(o=(e.ownerDocument||e).createElement("link"));var i=o;return i._p=new Promise(function(e,t){i.onload=e,i.onerror=t}),un(o,"link",r),t.state.loading|=4,uD(o,n.precedence,e),t.instance=o;case"script":if(o=uR(n.src),a=e.querySelector(uI(o)))return t.instance=a,eH(a),a;return r=n,(a=uE.get(o))&&uM(r=f({},n),a),eH(a=(e=e.ownerDocument||e).createElement("script")),un(a,"link",r),e.head.appendChild(a),t.instance=a;case"void":return null;default:throw Error(l(443,t.type))}return"stylesheet"===t.type&&0==(4&t.state.loading)&&(r=t.instance,t.state.loading|=4,uD(r,n.precedence,e)),t.instance}function uD(e,t,n){for(var r=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),a=r.length?r[r.length-1]:null,o=a,i=0;i<r.length;i++){var l=r[i];if(l.dataset.precedence===t)o=l;else if(o!==a)break}o?o.parentNode.insertBefore(e,o.nextSibling):(t=9===n.nodeType?n.head:n).insertBefore(e,t.firstChild)}function uz(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.title&&(e.title=t.title)}function uM(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.integrity&&(e.integrity=t.integrity)}var u$=null;function uB(e,t,n){if(null===u$){var r=new Map,a=u$=new Map;a.set(n,r)}else(r=(a=u$).get(n))||(r=new Map,a.set(n,r));if(r.has(e))return r;for(r.set(e,null),n=n.getElementsByTagName(e),a=0;a<n.length;a++){var o=n[a];if(!(o[eD]||o[eO]||"link"===e&&"stylesheet"===o.getAttribute("rel"))&&"http://www.w3.org/2000/svg"!==o.namespaceURI){var i=o.getAttribute(t)||"";i=e+i;var l=r.get(i);l?l.push(o):r.set(i,[o])}}return r}function uU(e,t,n){(e=e.ownerDocument||e).head.insertBefore(n,"title"===t?e.querySelector("head > title"):null)}function uH(e){return"stylesheet"!==e.type||0!=(3&e.state.loading)}var uQ=null;function uZ(){}function uV(){if(this.count--,0===this.count){if(this.stylesheets)uq(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var uW=null;function uq(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,uW=new Map,t.forEach(uG,e),uW=null,uV.call(e))}function uG(e,t){if(!(4&t.state.loading)){var n=uW.get(e);if(n)var r=n.get(null);else{n=new Map,uW.set(e,n);for(var a=e.querySelectorAll("link[data-precedence],style[data-precedence]"),o=0;o<a.length;o++){var i=a[o];("LINK"===i.nodeName||"not all"!==i.getAttribute("media"))&&(n.set(i.dataset.precedence,i),r=i)}r&&n.set(null,r)}i=(a=t.instance).getAttribute("data-precedence"),(o=n.get(i)||r)===r&&n.set(null,a),n.set(i,a),this.count++,r=uV.bind(this),a.addEventListener("load",r),a.addEventListener("error",r),o?o.parentNode.insertBefore(a,o.nextSibling):(e=9===e.nodeType?e.head:e).insertBefore(a,e.firstChild),t.state.loading|=4}}var uY={$$typeof:w,Provider:null,Consumer:null,_currentValue:I,_currentValue2:I,_threadCount:0};function uK(e,t,n,r,a,o,i,l){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=ex(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ex(0),this.hiddenUpdates=ex(null),this.identifierPrefix=r,this.onUncaughtError=a,this.onCaughtError=o,this.onRecoverableError=i,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=l,this.incompleteTransitions=new Map}function uX(e,t,n,r,a,o,i,l,s,u,c,d){return e=new uK(e,t,n,i,l,s,u,d),t=1,!0===o&&(t|=24),o=n7(3,null,null,t),e.current=o,o.stateNode=e,t=rY(),t.refCount++,e.pooledCache=t,t.refCount++,o.memoizedState={element:r,isDehydrated:n,cache:t},au(o),e}function uJ(e,t,n,r,a,o){a=a?n8:n8,null===r.context?r.context=a:r.pendingContext=a,(r=ad(t)).payload={element:n},null!==(o=void 0===o?null:o)&&(r.callback=o),null!==(n=af(e,r,t))&&(l8(n,e,t),ap(n,e,t))}function u0(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function u1(e,t){u0(e,t),(e=e.alternate)&&u0(e,t)}function u2(e){if(13===e.tag){var t=n3(e,0x4000000);null!==t&&l8(t,e,0x4000000),u1(e,0x4000000)}}var u4=!0;function u3(e,t,n,r){var a=N.T;N.T=null;var o=R.p;try{R.p=2,u9(e,t,n,r)}finally{R.p=o,N.T=a}}function u6(e,t,n,r){var a=N.T;N.T=null;var o=R.p;try{R.p=8,u9(e,t,n,r)}finally{R.p=o,N.T=a}}function u9(e,t,n,r){if(u4){var a=u8(r);if(null===a)s0(e,t,r,u5,n),cu(e,r);else if(function(e,t,n,r,a){switch(t){case"focusin":return cn=cc(cn,e,t,n,r,a),!0;case"dragenter":return cr=cc(cr,e,t,n,r,a),!0;case"mouseover":return ca=cc(ca,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return co.set(o,cc(co.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,ci.set(o,cc(ci.get(o)||null,e,t,n,r,a)),!0}return!1}(a,e,t,n,r))r.stopPropagation();else if(cu(e,r),4&t&&-1<cs.indexOf(e)){for(;null!==a;){var o=e$(a);if(null!==o)switch(o.tag){case 3:if((o=o.stateNode).current.memoizedState.isDehydrated){var i=eb(o.pendingLanes);if(0!==i){var l=o;for(l.pendingLanes|=2,l.entangledLanes|=2;i;){var s=1<<31-ef(i);l.entanglements[1]|=s,i&=~s}sR(o),0==(6&lT)&&(lW=ee()+500,sI(0,!1))}}break;case 13:null!==(l=n3(o,2))&&l8(l,o,2),st(),u1(o,2)}if(null===(o=u8(r))&&s0(e,t,r,u5,n),o===a)break;a=o}null!==a&&r.stopPropagation()}else s0(e,t,r,null,n)}}function u8(e){return u7(e=tg(e))}var u5=null;function u7(e){if(u5=null,null!==(e=eM(e))){var t=u(e);if(null===t)e=null;else{var n=t.tag;if(13===n){if(null!==(e=c(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return u5=e,null}function ce(e){switch(e){case"beforetoggle":case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"toggle":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 2;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 8;case"message":switch(et()){case en:return 2;case er:return 8;case ea:case eo:return 32;case ei:return 0x10000000;default:return 32}default:return 32}}var ct=!1,cn=null,cr=null,ca=null,co=new Map,ci=new Map,cl=[],cs="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" ");function cu(e,t){switch(e){case"focusin":case"focusout":cn=null;break;case"dragenter":case"dragleave":cr=null;break;case"mouseover":case"mouseout":ca=null;break;case"pointerover":case"pointerout":co.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ci.delete(t.pointerId)}}function cc(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:o,targetContainers:[a]},null!==t&&null!==(t=e$(t))&&u2(t)):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a)),e}function cd(e){var t=eM(e.target);if(null!==t){var n=u(t);if(null!==n){if(13===(t=n.tag)){if(null!==(t=c(n))){e.blockedOn=t,function(e,t){var n=R.p;try{return R.p=e,t()}finally{R.p=n}}(e.priority,function(){if(13===n.tag){var e=l6(),t=n3(n,e=eC(e));null!==t&&l8(t,n,e),u1(n,e)}});return}}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=3===n.tag?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function cf(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=u8(e.nativeEvent);if(null!==n)return null!==(t=e$(n))&&u2(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);th=r,n.target.dispatchEvent(r),th=null,t.shift()}return!0}function cp(e,t,n){cf(e)&&n.delete(t)}function cm(){ct=!1,null!==cn&&cf(cn)&&(cn=null),null!==cr&&cf(cr)&&(cr=null),null!==ca&&cf(ca)&&(ca=null),co.forEach(cp),ci.forEach(cp)}function ch(e,t){e.blockedOn===t&&(e.blockedOn=null,ct||(ct=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,cm)))}var cg=null;function cb(e){cg!==e&&(cg=e,a.unstable_scheduleCallback(a.unstable_NormalPriority,function(){cg===e&&(cg=null);for(var t=0;t<e.length;t+=3){var n=e[t],r=e[t+1],a=e[t+2];if("function"!=typeof r)if(null===u7(r||n))continue;else break;var o=e$(n);null!==o&&(e.splice(t,3),t-=3,oA(o,{pending:!0,data:a,method:n.method,action:r},r,a))}}))}function cy(e){function t(t){return ch(t,e)}null!==cn&&ch(cn,e),null!==cr&&ch(cr,e),null!==ca&&ch(ca,e),co.forEach(t),ci.forEach(t);for(var n=0;n<cl.length;n++){var r=cl[n];r.blockedOn===e&&(r.blockedOn=null)}for(;0<cl.length&&null===(n=cl[0]).blockedOn;)cd(n),null===n.blockedOn&&cl.shift();if(null!=(n=(e.ownerDocument||e).$$reactFormReplay))for(r=0;r<n.length;r+=3){var a=n[r],o=n[r+1],i=a[eL]||null;if("function"==typeof o)i||cb(n);else if(i){var l=null;if(o&&o.hasAttribute("formAction")){if(a=o,i=o[eL]||null)l=i.formAction;else if(null!==u7(a))continue}else l=i.action;"function"==typeof l?n[r+1]=l:(n.splice(r,3),r-=3),cb(n)}}}function cv(e){this._internalRoot=e}function ck(e){this._internalRoot=e}ck.prototype.render=cv.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(l(409));uJ(t.current,l6(),e,t,null,null)},ck.prototype.unmount=cv.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;uJ(e.current,2,null,e,null,null),st(),t[ej]=null}},ck.prototype.unstable_scheduleHydration=function(e){if(e){var t=eP();e={blockedOn:null,target:e,priority:t};for(var n=0;n<cl.length&&0!==t&&t<cl[n].priority;n++);cl.splice(n,0,e),0===n&&cd(e)}};var cw=o.version;if("19.1.0"!==cw)throw Error(l(527,cw,"19.1.0"));if(R.findDOMNode=function(e){var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(l(188));throw Error(l(268,e=Object.keys(e).join(",")))}return e=null===(e=null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=u(e)))throw Error(l(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var o=a.alternate;if(null===o){if(null!==(r=a.return)){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return d(a),e;if(o===r)return d(a),t;o=o.sibling}throw Error(l(188))}if(n.return!==r.return)n=a,r=o;else{for(var i=!1,s=a.child;s;){if(s===n){i=!0,n=a,r=o;break}if(s===r){i=!0,r=a,n=o;break}s=s.sibling}if(!i){for(s=o.child;s;){if(s===n){i=!0,n=o,r=a;break}if(s===r){i=!0,r=o,n=a;break}s=s.sibling}if(!i)throw Error(l(189))}}if(n.alternate!==r)throw Error(l(190))}if(3!==n.tag)throw Error(l(188));return n.stateNode.current===n?e:t}(t))?function e(t){var n=t.tag;if(5===n||26===n||27===n||6===n)return t;for(t=t.child;null!==t;){if(null!==(n=e(t)))return n;t=t.sibling}return null}(e):null)?null:e.stateNode},"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cx=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cx.isDisabled&&cx.supportsFiber)try{eu=cx.inject({bundleType:0,version:"19.1.0",rendererPackageName:"react-dom",currentDispatcherRef:N,reconcilerVersion:"19.1.0"}),ec=cx}catch(e){}}t.createRoot=function(e,t){if(!s(e))throw Error(l(299));var n=!1,r="",a=il,o=is,i=iu,u=null;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onUncaughtError&&(a=t.onUncaughtError),void 0!==t.onCaughtError&&(o=t.onCaughtError),void 0!==t.onRecoverableError&&(i=t.onRecoverableError),void 0!==t.unstable_transitionCallbacks&&(u=t.unstable_transitionCallbacks)),t=uX(e,1,!1,null,null,n,r,a,o,i,u,null),e[ej]=t.current,sX(e),new cv(t)},t.hydrateRoot=function(e,t,n){if(!s(e))throw Error(l(299));var r=!1,a="",o=il,i=is,u=iu,c=null,d=null;return null!=n&&(!0===n.unstable_strictMode&&(r=!0),void 0!==n.identifierPrefix&&(a=n.identifierPrefix),void 0!==n.onUncaughtError&&(o=n.onUncaughtError),void 0!==n.onCaughtError&&(i=n.onCaughtError),void 0!==n.onRecoverableError&&(u=n.onRecoverableError),void 0!==n.unstable_transitionCallbacks&&(c=n.unstable_transitionCallbacks),void 0!==n.formState&&(d=n.formState)),(t=uX(e,1,!0,t,null!=n?n:null,r,a,o,i,u,c,d)).context=n8,n=t.current,(a=ad(r=eC(r=l6()))).callback=null,af(n,a,r),n=r,t.current.lanes=n,eS(t,n),sR(t),e[ej]=t.current,sX(e),new ck(t)},t.version="19.1.0"},7015:function(e,t,n){"use strict";var r=n(67294);function a(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function o(){}var i={d:{f:o,r:function(){throw Error(a(522))},D:o,C:o,L:o,m:o,X:o,S:o,M:o},p:0,findDOMNode:null},l=Symbol.for("react.portal"),s=r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function u(e,t){return"font"===e?"":"string"==typeof t?"use-credentials"===t?t:"":void 0}t.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!t||1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType)throw Error(a(299));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:l,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.flushSync=function(e){var t=s.T,n=i.p;try{if(s.T=null,i.p=2,e)return e()}finally{s.T=t,i.p=n,i.d.f()}},t.preconnect=function(e,t){"string"==typeof e&&(t=t?"string"==typeof(t=t.crossOrigin)?"use-credentials"===t?t:"":void 0:null,i.d.C(e,t))},t.prefetchDNS=function(e){"string"==typeof e&&i.d.D(e)},t.preinit=function(e,t){if("string"==typeof e&&t&&"string"==typeof t.as){var n=t.as,r=u(n,t.crossOrigin),a="string"==typeof t.integrity?t.integrity:void 0,o="string"==typeof t.fetchPriority?t.fetchPriority:void 0;"style"===n?i.d.S(e,"string"==typeof t.precedence?t.precedence:void 0,{crossOrigin:r,integrity:a,fetchPriority:o}):"script"===n&&i.d.X(e,{crossOrigin:r,integrity:a,fetchPriority:o,nonce:"string"==typeof t.nonce?t.nonce:void 0})}},t.preinitModule=function(e,t){if("string"==typeof e)if("object"==typeof t&&null!==t){if(null==t.as||"script"===t.as){var n=u(t.as,t.crossOrigin);i.d.M(e,{crossOrigin:n,integrity:"string"==typeof t.integrity?t.integrity:void 0,nonce:"string"==typeof t.nonce?t.nonce:void 0})}}else null==t&&i.d.M(e)},t.preload=function(e,t){if("string"==typeof e&&"object"==typeof t&&null!==t&&"string"==typeof t.as){var n=t.as,r=u(n,t.crossOrigin);i.d.L(e,n,{crossOrigin:r,integrity:"string"==typeof t.integrity?t.integrity:void 0,nonce:"string"==typeof t.nonce?t.nonce:void 0,type:"string"==typeof t.type?t.type:void 0,fetchPriority:"string"==typeof t.fetchPriority?t.fetchPriority:void 0,referrerPolicy:"string"==typeof t.referrerPolicy?t.referrerPolicy:void 0,imageSrcSet:"string"==typeof t.imageSrcSet?t.imageSrcSet:void 0,imageSizes:"string"==typeof t.imageSizes?t.imageSizes:void 0,media:"string"==typeof t.media?t.media:void 0})}},t.preloadModule=function(e,t){if("string"==typeof e)if(t){var n=u(t.as,t.crossOrigin);i.d.m(e,{as:"string"==typeof t.as&&"script"!==t.as?t.as:void 0,crossOrigin:n,integrity:"string"==typeof t.integrity?t.integrity:void 0})}else i.d.m(e)},t.requestFormReset=function(e){i.d.r(e)},t.unstable_batchedUpdates=function(e,t){return e(t)},t.useFormState=function(e,t,n){return s.H.useFormState(e,t,n)},t.useFormStatus=function(){return s.H.useHostTransitionStatus()},t.version="19.1.0"},20745:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(96787)},73935:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(7015)},69590:function(e){var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;e.exports=function(e,o){try{return function e(o,i){if(o===i)return!0;if(o&&i&&"object"==typeof o&&"object"==typeof i){var l,s,u,c;if(o.constructor!==i.constructor)return!1;if(Array.isArray(o)){if((l=o.length)!=i.length)return!1;for(s=l;0!=s--;)if(!e(o[s],i[s]))return!1;return!0}if(n&&o instanceof Map&&i instanceof Map){if(o.size!==i.size)return!1;for(c=o.entries();!(s=c.next()).done;)if(!i.has(s.value[0]))return!1;for(c=o.entries();!(s=c.next()).done;)if(!e(s.value[1],i.get(s.value[0])))return!1;return!0}if(r&&o instanceof Set&&i instanceof Set){if(o.size!==i.size)return!1;for(c=o.entries();!(s=c.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(o)&&ArrayBuffer.isView(i)){if((l=o.length)!=i.length)return!1;for(s=l;0!=s--;)if(o[s]!==i[s])return!1;return!0}if(o.constructor===RegExp)return o.source===i.source&&o.flags===i.flags;if(o.valueOf!==Object.prototype.valueOf&&"function"==typeof o.valueOf&&"function"==typeof i.valueOf)return o.valueOf()===i.valueOf();if(o.toString!==Object.prototype.toString&&"function"==typeof o.toString&&"function"==typeof i.toString)return o.toString()===i.toString();if((l=(u=Object.keys(o)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,u[s]))return!1;if(t&&o instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==u[s]&&"__v"!==u[s]&&"__o"!==u[s]||!o.$$typeof)&&!e(o[u[s]],i[u[s]]))return!1;return!0}return o!=o&&i!=i}(e,o)}catch(e){if((e.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw e}}},70405:function(e,t,n){"use strict";n.d(t,{B6:()=>H,ql:()=>K});var r=n(67294),a=n(45697),o=n.n(a),i=n(69590),l=n.n(i),s=n(41143),u=n.n(s),c=n(96774),d=n.n(c);function f(){return(f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return(m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},k=Object.keys(g).map(function(e){return g[e]}),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(w).reduce(function(e,t){return e[w[t]]=t,e},{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},E=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,function(){return t});var r=S(e,"defaultTitle");return t||r||void 0},_=function(e,t){return t.filter(function(t){return void 0!==t[e]}).map(function(t){return t[e]}).reduce(function(e,t){return f({},e,t)},{})},C=function(e,t,n){var r={};return n.filter(function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)}).map(function(t){return t[e]}).reverse().reduce(function(e,n){var a={};n.filter(function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var u=e[n].toLowerCase();return r[n]||(r[n]={}),a[n]||(a[n]={}),!r[n][u]&&(a[n][u]=!0,!0)}).reverse().forEach(function(t){return e.push(t)});for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],s=f({},r[l],a[l]);r[l]=s}return e},[]).reverse()},T=function(e,t){if(Array.isArray(e)&&e.length){for(var n=0;n<e.length;n+=1)if(e[n][t])return!0}return!1},P=function(e){return Array.isArray(e)?e.join(""):e},A=function(e,t){return Array.isArray(e)?e.reduce(function(e,n){return!function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.default.push(n):e.priority.push(n),e},{priority:[],default:[]}):{default:e}},O=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},L=[g.NOSCRIPT,g.SCRIPT,g.STYLE],j=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")},N=function(e){return Object.keys(e).reduce(function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r},"")},R=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce(function(t,n){return t[w[n]||n]=e[n],t},t)},I=function(e,t){return t.map(function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach(function(e){var n=w[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]}),r.createElement(e,o)})},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){var e,n,a,o;return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=R(n,a),[r.createElement(g.TITLE,o,e)]},toString:function(){var r,a,o,i;return r=t.title,a=t.titleAttributes,o=N(a),i=P(r),o?"<"+e+' data-rh="true" '+o+">"+j(i,n)+"</"+e+">":"<"+e+' data-rh="true">'+j(i,n)+"</"+e+">"}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return R(t)},toString:function(){return N(t)}};default:return{toComponent:function(){return I(e,t)},toString:function(){return t.reduce(function(t,r){var a=Object.keys(r).filter(function(e){return"innerHTML"!==e&&"cssText"!==e}).reduce(function(e,t){var a=void 0===r[t]?t:t+'="'+j(r[t],n)+'"';return e?e+" "+a:a},""),o=r.innerHTML||r.cssText||"",i=-1===L.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")},"")}}}},D=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=e.titleAttributes,u=e.linkTags,c=e.metaTags,d=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var p,m,h,k,w,x,S=(p=e.linkTags,m=e.scriptTags,h=e.encode,k=A(e.metaTags,v),w=A(p,b),x=A(m,y),{priorityMethods:{toComponent:function(){return[].concat(I(g.META,k.priority),I(g.LINK,w.priority),I(g.SCRIPT,x.priority))},toString:function(){return F(g.META,k.priority,h)+" "+F(g.LINK,w.priority,h)+" "+F(g.SCRIPT,x.priority,h)}},metaTags:k.default,linkTags:w.default,scriptTags:x.default});f=S.priorityMethods,u=S.linkTags,c=S.metaTags,d=S.scriptTags}return{priority:f,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",a,r),link:F(g.LINK,u,r),meta:F(g.META,c,r),noscript:F(g.NOSCRIPT,o,r),script:F(g.SCRIPT,d,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:void 0===l?"":l,titleAttributes:s},r)}},z=[],M=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=D({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),B=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),U="undefined"!=typeof document,H=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new M(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement($.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);H.canUseDOM=U,H.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},H.defaultProps={context:{}},H.displayName="HelmetProvider";var Q=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach(function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some(function(e,t){return n=t,r.isEqualNode(e)})?o.splice(n,1):i.push(r)}),o.forEach(function(e){return e.parentNode.removeChild(e)}),i.forEach(function(e){return r.appendChild(e)}),{oldTags:o,newTags:i}},Z=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],u=t[s]||"";n.getAttribute(s)!==u&&n.setAttribute(s,u),-1===a.indexOf(s)&&a.push(s);var c=o.indexOf(s);-1!==c&&o.splice(c,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},V=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,u=e.styleTags,c=e.title,d=e.titleAttributes;Z(g.BODY,e.bodyAttributes),Z(g.HTML,r),void 0!==c&&document.title!==c&&(document.title=P(c)),Z(g.TITLE,d);var f={baseTag:Q(g.BASE,n),linkTags:Q(g.LINK,a),metaTags:Q(g.META,o),noscriptTags:Q(g.NOSCRIPT,i),scriptTags:Q(g.SCRIPT,s),styleTags:Q(g.STYLE,u)},p={},m={};Object.keys(f).forEach(function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)}),t&&t(),l(e,p,m)},W=null,q=function(e){function t(){for(var t,n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,a=null,o={baseTag:(e=["href"],(t=n.helmetInstances.get().map(function(e){var t=f({},e.props);return delete t.context,t})).filter(function(e){return void 0!==e[g.BASE]}).map(function(e){return e[g.BASE]}).reverse().reduce(function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t},[])),bodyAttributes:_("bodyAttributes",t),defer:S(t,"defer"),encode:S(t,"encodeSpecialCharacters"),htmlAttributes:_("htmlAttributes",t),linkTags:C(g.LINK,["rel","href"],t),metaTags:C(g.META,["name","charset","http-equiv","property","itemprop"],t),noscriptTags:C(g.NOSCRIPT,["innerHTML"],t),onChangeClientState:S(t,"onChangeClientState")||function(){},scriptTags:C(g.SCRIPT,["src","innerHTML"],t),styleTags:C(g.STYLE,["cssText"],t),title:E(t),titleAttributes:_("titleAttributes",t),prioritizeSeoTags:T(t,"prioritizeSeoTags")};H.canUseDOM?(W&&cancelAnimationFrame(W),o.defer?W=requestAnimationFrame(function(){V(o,function(){W=null})}):(V(o),W=null)):D&&(a=D(o)),r(a)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);q.propTypes={context:B.isRequired},q.displayName="HelmetDispatcher";var G=["children"],Y=["children"],K=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(O(this.props,"helmetData"),O(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case g.BODY:return f({},a,{bodyAttributes:f({},o)});case g.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach(function(t){var r;n=f({},n,((r={})[t]=e[t],r))}),n},n.warnOnInvalidChildren=function(e,t){return u()(k.some(function(t){return e.type===t}),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+k.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),u()(!t||"string"==typeof t||Array.isArray(t)&&!t.some(function(e){return"string"!=typeof e}),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,a={};return r.Children.forEach(e,function(e){if(e&&e.props){var r=e.props,o=r.children,i=h(r,G),l=Object.keys(i).reduce(function(e,t){return e[x[t]||t]=i[t],e},{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,o),s){case g.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}}),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,Y),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof M||(o=new M(o.context,o.instances)),o?r.createElement(q,f({},a,{context:o.value,helmetData:void 0})):r.createElement($.Consumer,null,function(e){return r.createElement(q,f({},a,{context:e}))})},t}(r.Component);K.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},K.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},K.displayName="Helmet"},69921:function(e,t){"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,u=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,k=n?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case c:case d:case o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case u:case f:case g:case h:case s:return e;default:return t}}case a:return t}}}function x(e){return w(e)===d}t.AsyncMode=c,t.ConcurrentMode=d,t.ContextConsumer=u,t.ContextProvider=s,t.Element=r,t.ForwardRef=f,t.Fragment=o,t.Lazy=g,t.Memo=h,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return x(e)||w(e)===c},t.isConcurrentMode=x,t.isContextConsumer=function(e){return w(e)===u},t.isContextProvider=function(e){return w(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return w(e)===f},t.isFragment=function(e){return w(e)===o},t.isLazy=function(e){return w(e)===g},t.isMemo=function(e){return w(e)===h},t.isPortal=function(e){return w(e)===a},t.isProfiler=function(e){return w(e)===l},t.isStrictMode=function(e){return w(e)===i},t.isSuspense=function(e){return w(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===s||e.$$typeof===u||e.$$typeof===f||e.$$typeof===y||e.$$typeof===v||e.$$typeof===k||e.$$typeof===b)},t.typeOf=w},59864:function(e,t,n){"use strict";e.exports=n(69921)},68356:function(e,t,n){"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return(i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}var l=n(67294),s=[],u=[],c=l.createContext(null);function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then(function(e){return n.loading=!1,n.loaded=e,e}).catch(function(e){throw n.loading=!1,n.error=e,e}),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach(function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.promise.then(function(e){t.loaded[r]=e}).catch(function(e){t.error=e})})}catch(e){t.error=e}return t.promise=Promise.all(n).then(function(e){return t.loading=!1,e}).catch(function(e){throw t.loading=!1,e}),t}function p(e,t){return l.createElement(e&&e.__esModule?e.default:e,t)}function m(e,t){if(!t.loading)throw Error("react-loadable requires a `loading` component");var d,f,m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return s.push(g),"function"==typeof m.webpack&&u.push(function(){if((0,m.webpack)().every(function(e){return void 0!==e&&void 0!==n.m[e]}))return g()}),f=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()}),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context&&Array.isArray(m.modules)&&m.modules.forEach(function(t){e.context.report(t)}),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout(function(){t({pastDelay:!0})},m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout(function(){t({timedOut:!0})},m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then(function(){return n(),null}).catch(function(e){return n(),null})}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextType",c),f}function h(e){return m(d,e)}function g(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then(function(){if(e.length)return g(e)})}h.Map=function(e){if("function"!=typeof e.render)throw Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)},h.Capture=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return l.createElement(c.Provider,{value:{report:this.props.report}},l.Children.only(this.props.children))},t}(l.Component),h.preloadAll=function(){return new Promise(function(e,t){g(s).then(e,t)})},h.preloadReady=function(){return new Promise(function(e,t){g(u).then(e,e)})},e.exports=h},18790:function(e,t,n){"use strict";n.d(t,{H:()=>i,f:()=>function e(t,n,a){return void 0===a&&(a=[]),t.some(function(t){var o=t.path?(0,r.LX)(n,t):a.length?a[a.length-1].match:r.F0.computeRootMatch(n);return o&&(a.push({route:t,match:o}),t.routes&&e(t.routes,n,a)),o}),a}});var r=n(16550),a=n(16019),o=n(67294);function i(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.rs,n,e.map(function(e,n){return o.createElement(r.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.Z)({},n,t,{route:e}))}})})):null}},73727:function(e,t,n){"use strict";n.d(t,{OL:()=>k,UT:()=>d,VK:()=>c,rU:()=>b});var r=n(16550),a=n(35091),o=n(67294),i=n(31381),l=n(16019),s=n(70443),u=n(21835),c=function(e){function t(){for(var t,n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.lX)(t.props),t}return(0,a.Z)(t,e),t.prototype.render=function(){return o.createElement(r.F0,{history:this.history,children:this.props.children})},t}(o.Component),d=function(e){function t(){for(var t,n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.q_)(t.props),t}return(0,a.Z)(t,e),t.prototype.render=function(){return o.createElement(r.F0,{history:this.history,children:this.props.children})},t}(o.Component),f=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},m=function(e){return e},h=o.forwardRef;void 0===h&&(h=m);var g=h(function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,s.Z)(e,["innerRef","navigate","onClick"]),u=i.target,c=(0,l.Z)({},i,{onClick:function(e){try{a&&a(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||u&&"_self"!==u||e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||(e.preventDefault(),r())}});return m!==h?c.ref=t||n:c.ref=n,o.createElement("a",c)}),b=h(function(e,t){var n=e.component,a=void 0===n?g:n,c=e.replace,d=e.to,b=e.innerRef,y=(0,s.Z)(e,["component","replace","to","innerRef"]);return o.createElement(r.s6.Consumer,null,function(e){e||(0,u.Z)(!1);var n=e.history,r=p(f(d,e.location),e.location),s=r?n.createHref(r):"",g=(0,l.Z)({},y,{href:s,navigate:function(){var t=f(d,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(p(t));(c||r?n.replace:n.push)(t)}});return m!==h?g.ref=t||b:g.innerRef=b,o.createElement(a,g)})}),y=function(e){return e},v=o.forwardRef;void 0===v&&(v=y);var k=v(function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,c=void 0===i?"active":i,d=e.activeStyle,m=e.className,h=e.exact,g=e.isActive,k=e.location,w=e.sensitive,x=e.strict,S=e.style,E=e.to,_=e.innerRef,C=(0,s.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.s6.Consumer,null,function(e){e||(0,u.Z)(!1);var n=k||e.location,i=p(f(E,n),n),s=i.pathname,T=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),P=T?(0,r.LX)(n.pathname,{path:T,exact:h,sensitive:w,strict:x}):null,A=!!(g?g(P,n):P),O="function"==typeof m?m(A):m,L="function"==typeof S?S(A):S;A&&(O=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter(function(e){return e}).join(" ")}(O,c),L=(0,l.Z)({},L,d));var j=(0,l.Z)({"aria-current":A&&a||null,className:O,style:L,to:i},C);return y!==v?j.ref=t||_:j.innerRef=_,o.createElement(b,j)})})},16550:function(e,t,n){"use strict";n.d(t,{AW:()=>k,F0:()=>g,LX:()=>v,TH:()=>E,k6:()=>S,rs:()=>w,s6:()=>h});var r=n(35091),a=n(67294),o=n(45697),i=n.n(o),l=(n(31381),n(21835)),s=n(16019),u=n(14779),c=n.n(u);n(59864),n(70443),n(8679);var d="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{},f=a.createContext||function(e,t){var n,o,l="__create-react-context-"+(d.__global_unique_id__=(d.__global_unique_id__||0)+1)+"__",s=function(e){function n(){for(var t,n,r,a=arguments.length,o=Array(a),i=0;i<a;i++)o[i]=arguments[i];return n=(t=e.call.apply(e,[this].concat(o))||this).props.value,r=[],t.emitter={on:function(e){r.push(e)},off:function(e){r=r.filter(function(t){return t!==e})},get:function(){return n},set:function(e,t){n=e,r.forEach(function(e){return e(n,t)})}},t}(0,r.Z)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;(r===a?0!==r||1/r==1/a:r!=r&&a!=a)?n=0:0!=(n=("function"==typeof t?t(r,a):0x3fffffff)|0)&&this.emitter.set(e.value,n)}},a.render=function(){return this.props.children},n}(a.Component);(n={})[l]=i().object.isRequired,s.childContextTypes=n;var u=function(t){function n(){for(var e,n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){((0|e.observedBits)&n)!=0&&e.setState({value:e.getValue()})},e}(0,r.Z)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?0x3fffffff:t},a.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?0x3fffffff:e},a.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},a.getValue=function(){return this.context[l]?this.context[l].get():e},a.render=function(){var e;return(Array.isArray(e=this.props.children)?e[0]:e)(this.state.value)},n}(a.Component);return(o={})[l]=i().object,u.contextTypes=o,{Provider:s,Consumer:u}},p=function(e){var t=f();return t.displayName=e,t},m=p("Router-History"),h=p("Router"),g=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen(function(e){n._pendingLocation=e})),n}(0,r.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen(function(t){e._isMounted&&e.setState({location:t})})),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return a.createElement(h.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(m.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component,a.Component;var b={},y=0;function v(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,a=n.exact,o=void 0!==a&&a,i=n.strict,l=void 0!==i&&i,s=n.sensitive,u=void 0!==s&&s;return[].concat(r).reduce(function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=b[n]||(b[n]={});if(r[e])return r[e];var a=[],o={regexp:c()(e,a,t),keys:a};return y<1e4&&(r[e]=o,y++),o}(n,{end:o,strict:l,sensitive:u}),a=r.regexp,i=r.keys,s=a.exec(e);if(!s)return null;var d=s[0],f=s.slice(1),p=e===d;return o&&!p?null:{path:n,url:"/"===n&&""===d?"/":d,isExact:p,params:i.reduce(function(e,t,n){return e[t.name]=f[n],e},{})}},null)}var k=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(h.Consumer,null,function(t){t||(0,l.Z)(!1);var n,r=e.props.location||t.location,o=e.props.computedMatch?e.props.computedMatch:e.props.path?v(r.pathname,e.props):t.match,i=(0,s.Z)({},t,{location:r,match:o}),u=e.props,c=u.children,d=u.component,f=u.render;return Array.isArray(c)&&(n=c,0===a.Children.count(n))&&(c=null),a.createElement(h.Provider,{value:i},i.match?c?"function"==typeof c?c(i):c:d?a.createElement(d,i):f?f(i):null:"function"==typeof c?c(i):null)})},t}(a.Component);a.Component;var w=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(h.Consumer,null,function(t){t||(0,l.Z)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?v(o.pathname,(0,s.Z)({},e.props,{path:i})):t.match}}),r?a.cloneElement(n,{location:o,computedMatch:r}):null})},t}(a.Component),x=a.useContext;function S(){return x(m)}function E(){return x(h).location}},80631:function(e,t){"use strict";var n=Symbol.for("react.transitional.element");function r(e,t,r){var a=null;if(void 0!==r&&(a=""+r),void 0!==t.key&&(a=""+t.key),"key"in t)for(var o in r={},t)"key"!==o&&(r[o]=t[o]);else r=t;return{$$typeof:n,type:e,key:a,ref:void 0!==(t=r.ref)?t:null,props:r}}t.Fragment=Symbol.for("react.fragment"),t.jsx=r,t.jsxs=r},48405:function(e,t){"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),l=Symbol.for("react.consumer"),s=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator,m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var k=v.prototype=new y;k.constructor=v,h(k,b.prototype),k.isPureReactComponent=!0;var w=Array.isArray,x={H:null,A:null,T:null,S:null,V:null},S=Object.prototype.hasOwnProperty;function E(e,t,r,a,o,i){return{$$typeof:n,type:e,key:t,ref:void 0!==(r=i.ref)?r:null,props:i}}function _(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var C=/\/+/g;function T(e,t){var n,r;return"object"==typeof e&&null!==e&&null!=e.key?(n=""+e.key,r={"=":"=0",":":"=2"},"$"+n.replace(/[=:]/g,function(e){return r[e]})):t.toString(36)}function P(){}function A(e,t,a){if(null==e)return e;var o=[],i=0;return!function e(t,a,o,i,l){var s,u,c,d=typeof t;("undefined"===d||"boolean"===d)&&(t=null);var m=!1;if(null===t)m=!0;else switch(d){case"bigint":case"string":case"number":m=!0;break;case"object":switch(t.$$typeof){case n:case r:m=!0;break;case f:return e((m=t._init)(t._payload),a,o,i,l)}}if(m)return l=l(t),m=""===i?"."+T(t,0):i,w(l)?(o="",null!=m&&(o=m.replace(C,"$&/")+"/"),e(l,a,o,"",function(e){return e})):null!=l&&(_(l)&&(s=l,u=o+(null==l.key||t&&t.key===l.key?"":(""+l.key).replace(C,"$&/")+"/")+m,l=E(s.type,u,void 0,void 0,void 0,s.props)),a.push(l)),1;m=0;var h=""===i?".":i+":";if(w(t))for(var g=0;g<t.length;g++)d=h+T(i=t[g],g),m+=e(i,a,o,d,l);else if("function"==typeof(g=null===(c=t)||"object"!=typeof c?null:"function"==typeof(c=p&&c[p]||c["@@iterator"])?c:null))for(t=g.call(t),g=0;!(i=t.next()).done;)d=h+T(i=i.value,g++),m+=e(i,a,o,d,l);else if("object"===d){if("function"==typeof t.then)return e(function(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch("string"==typeof e.status?e.then(P,P):(e.status="pending",e.then(function(t){"pending"===e.status&&(e.status="fulfilled",e.value=t)},function(t){"pending"===e.status&&(e.status="rejected",e.reason=t)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}(t),a,o,i,l);throw Error("Objects are not valid as a React child (found: "+("[object Object]"===(a=String(t))?"object with keys {"+Object.keys(t).join(", ")+"}":a)+"). If you meant to render a collection of children, use an array instead.")}return m}(e,o,"","",function(e){return t.call(a,e,i++)}),o}function O(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){(0===e._status||-1===e._status)&&(e._status=1,e._result=t)},function(t){(0===e._status||-1===e._status)&&(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var L="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function j(){}t.Children={map:A,forEach:function(e,t,n){A(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return A(e,function(){t++}),t},toArray:function(e){return A(e,function(e){return e})||[]},only:function(e){if(!_(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=a,t.Profiler=i,t.PureComponent=v,t.StrictMode=o,t.Suspense=c,t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=x,t.__COMPILER_RUNTIME={__proto__:null,c:function(e){return x.H.useMemoCache(e)}},t.cache=function(e){return function(){return e.apply(null,arguments)}},t.cloneElement=function(e,t,n){if(null==e)throw Error("The argument must be a React element, but you passed "+e+".");var r=h({},e.props),a=e.key,o=void 0;if(null!=t)for(i in void 0!==t.ref&&(o=void 0),void 0!==t.key&&(a=""+t.key),t)S.call(t,i)&&"key"!==i&&"__self"!==i&&"__source"!==i&&("ref"!==i||void 0!==t.ref)&&(r[i]=t[i]);var i=arguments.length-2;if(1===i)r.children=n;else if(1<i){for(var l=Array(i),s=0;s<i;s++)l[s]=arguments[s+2];r.children=l}return E(e.type,a,void 0,void 0,o,r)},t.createContext=function(e){return(e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:l,_context:e},e},t.createElement=function(e,t,n){var r,a={},o=null;if(null!=t)for(r in void 0!==t.key&&(o=""+t.key),t)S.call(t,r)&&"key"!==r&&"__self"!==r&&"__source"!==r&&(a[r]=t[r]);var i=arguments.length-2;if(1===i)a.children=n;else if(1<i){for(var l=Array(i),s=0;s<i;s++)l[s]=arguments[s+2];a.children=l}if(e&&e.defaultProps)for(r in i=e.defaultProps)void 0===a[r]&&(a[r]=i[r]);return E(e,o,void 0,void 0,null,a)},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=_,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:O}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=x.T,n={};x.T=n;try{var r=e(),a=x.S;null!==a&&a(n,r),"object"==typeof r&&null!==r&&"function"==typeof r.then&&r.then(j,L)}catch(e){L(e)}finally{x.T=t}},t.unstable_useCacheRefresh=function(){return x.H.useCacheRefresh()},t.use=function(e){return x.H.use(e)},t.useActionState=function(e,t,n){return x.H.useActionState(e,t,n)},t.useCallback=function(e,t){return x.H.useCallback(e,t)},t.useContext=function(e){return x.H.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e,t){return x.H.useDeferredValue(e,t)},t.useEffect=function(e,t,n){var r=x.H;if("function"==typeof n)throw Error("useEffect CRUD overload is not enabled in this build of React.");return r.useEffect(e,t)},t.useId=function(){return x.H.useId()},t.useImperativeHandle=function(e,t,n){return x.H.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return x.H.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return x.H.useLayoutEffect(e,t)},t.useMemo=function(e,t){return x.H.useMemo(e,t)},t.useOptimistic=function(e,t){return x.H.useOptimistic(e,t)},t.useReducer=function(e,t,n){return x.H.useReducer(e,t,n)},t.useRef=function(e){return x.H.useRef(e)},t.useState=function(e){return x.H.useState(e)},t.useSyncExternalStore=function(e,t,n){return x.H.useSyncExternalStore(e,t,n)},t.useTransition=function(){return x.H.useTransition()},t.version="19.1.0"},67294:function(e,t,n){"use strict";e.exports=n(48405)},85893:function(e,t,n){"use strict";e.exports=n(80631)},56152:function(e,t){"use strict";function n(e,t){var n=e.length;for(e.push(t);0<n;){var r=n-1>>>1,a=e[r];if(0<o(a,t))e[r]=t,e[n]=a,n=r;else break}}function r(e){return 0===e.length?null:e[0]}function a(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;for(var r=0,a=e.length,i=a>>>1;r<i;){var l=2*(r+1)-1,s=e[l],u=l+1,c=e[u];if(0>o(s,n))u<a&&0>o(c,s)?(e[r]=c,e[u]=n,r=u):(e[r]=s,e[l]=n,r=l);else if(u<a&&0>o(c,n))e[r]=c,e[u]=n,r=u;else break}}return t}function o(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"==typeof performance&&"function"==typeof performance.now){var i,l=performance;t.unstable_now=function(){return l.now()}}else{var s=Date,u=s.now();t.unstable_now=function(){return s.now()-u}}var c=[],d=[],f=1,p=null,m=3,h=!1,g=!1,b=!1,y=!1,v="function"==typeof setTimeout?setTimeout:null,k="function"==typeof clearTimeout?clearTimeout:null,w="undefined"!=typeof setImmediate?setImmediate:null;function x(e){for(var t=r(d);null!==t;){if(null===t.callback)a(d);else if(t.startTime<=e)a(d),t.sortIndex=t.expirationTime,n(c,t);else break;t=r(d)}}function S(e){if(b=!1,x(e),!g)if(null!==r(c))g=!0,E||(E=!0,i());else{var t=r(d);null!==t&&j(S,t.startTime-e)}}var E=!1,_=-1,C=5,T=-1;function P(){return!!y||!(t.unstable_now()-T<C)}function A(){if(y=!1,E){var e=t.unstable_now();T=e;var n=!0;try{e:{g=!1,b&&(b=!1,k(_),_=-1),h=!0;var o=m;try{t:{for(x(e),p=r(c);null!==p&&!(p.expirationTime>e&&P());){var l=p.callback;if("function"==typeof l){p.callback=null,m=p.priorityLevel;var s=l(p.expirationTime<=e);if(e=t.unstable_now(),"function"==typeof s){p.callback=s,x(e),n=!0;break t}p===r(c)&&a(c),x(e)}else a(c);p=r(c)}if(null!==p)n=!0;else{var u=r(d);null!==u&&j(S,u.startTime-e),n=!1}}break e}finally{p=null,m=o,h=!1}}}finally{n?i():E=!1}}}if("function"==typeof w)i=function(){w(A)};else if("undefined"!=typeof MessageChannel){var O=new MessageChannel,L=O.port2;O.port1.onmessage=A,i=function(){L.postMessage(null)}}else i=function(){v(A,0)};function j(e,n){_=v(function(){e(t.unstable_now())},n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):C=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return m},t.unstable_next=function(e){switch(m){case 1:case 2:case 3:var t=3;break;default:t=m}var n=m;m=t;try{return e()}finally{m=n}},t.unstable_requestPaint=function(){y=!0},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=m;m=e;try{return t()}finally{m=n}},t.unstable_scheduleCallback=function(e,a,o){var l=t.unstable_now();switch(o="object"==typeof o&&null!==o&&"number"==typeof(o=o.delay)&&0<o?l+o:l,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=0x3fffffff;break;case 4:s=1e4;break;default:s=5e3}return s=o+s,e={id:f++,callback:a,priorityLevel:e,startTime:o,expirationTime:s,sortIndex:-1},o>l?(e.sortIndex=o,n(d,e),null===r(c)&&e===r(d)&&(b?(k(_),_=-1):b=!0,j(S,o-l))):(e.sortIndex=s,n(c,e),g||h||(g=!0,E||(E=!0,i()))),e},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(e){var t=m;return function(){var n=m;m=t;try{return e.apply(this,arguments)}finally{m=n}}}},63840:function(e,t,n){"use strict";e.exports=n(56152)},96774:function(e){e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var u=o[s];if(!l(u))return!1;var c=e[u],d=t[u];if(!1===(a=n?n.call(r,c,d,u):void 0)||void 0===a&&c!==d)return!1}return!0}},75150:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>r});let r={future:{v4:{removeLegacyPostBuildHeadAttribute:!0,useCssCascadeLayers:!1},experimental_faster:{ssgWorkerThreads:!0,rspackBundler:!0,rspackPersistentCache:!0,swcJsLoader:!1,swcJsMinimizer:!1,swcHtmlMinimizer:!1,lightningCssMinimizer:!1,mdxCrossCompilerCache:!1},experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},title:"Multi-Scrobbler",tagline:"Scrobble all the things",favicon:"img/favicon.ico",url:"https://foxxmd.github.io",baseUrl:"/multi-scrobbler/",organizationName:"foxxmd",projectName:"multi-scrobbler",trailingSlash:!0,onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},scripts:[{src:"https://ry.foxxmd.dev/api/script.js",defer:!0,"data-site-id":"3","data-session-replay":"true"}],presets:[["classic",{docs:{sidebarPath:"./sidebars.ts",routeBasePath:"/",editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/"},blog:!1,theme:{customCss:"./src/css/custom.css"}}]],themes:["docusaurus-json-schema-plugin",["@easyops-cn/docusaurus-search-local",{hashed:!0,indexBlog:!1,docsRouteBasePath:"/"}],"docusaurus-theme-github-codeblock"],plugins:[["@docusaurus/plugin-client-redirects",{redirects:[{to:"/configuration",from:"/docs/configuration"},{to:"/configuration/kitchensink",from:"/docs/configuration/kitchensink"},{to:"/installation",from:"/docs/installation"},{to:"/quickstart",from:"/docs/quickstart"},{to:"/FAQ",from:"/docs/FAQ"},{to:"/",from:"/docs"}]}]],themeConfig:{image:"img/icon.png",navbar:{title:"Multi-Scrobbler",hideOnScroll:!0,logo:{alt:"Logo",src:"img/icon.svg",height:40},items:[{type:"docSidebar",sidebarId:"tutorialSidebar",position:"left",label:"Docs"},{to:"playground",position:"left",label:"Config Playground"},{href:"https://github.com/foxxmd/multi-scrobbler",label:"GitHub",position:"right"},{href:"https://foxxmd.github.io/multi-scrobbler/",label:"Website",position:"right"}]},footer:{style:"dark",links:[{title:"Docs",items:[{label:"Overview",to:"/"},{label:"Installation",to:"/installation"},{label:"Configuration",to:"/configuration"},{label:"Development",to:"/development/dev-common"}]},{title:"More",items:[{label:"GitHub",href:"https://github.com/foxxmd/multi-scrobbler"},{label:"Website",href:"https://foxxmd.github.io/multi-scrobbler/"}]}],copyright:"Copyright \xa9 2026 Multi-Scrobbler. Built with Docusaurus."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["json","json5","typescript","docker","bash","ini","diff"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"dark",disableSwitch:!1,respectPrefersColorScheme:!1},codeblock:{showGithubLink:!0,githubLinkLabel:"View on GitHub",showRunmeLink:!1,runmeLinkLabel:"Checkout via Runme"},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},headTags:[{tagName:"meta",attributes:{name:"google-site-verification",content:"8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"}}],baseUrlIssueBanner:!0,onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},16019:function(e,t,n){"use strict";function r(){return(r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(null,arguments)}n.d(t,{Z:()=>r})},35091:function(e,t,n){"use strict";function r(e,t){return(r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{Z:()=>a})},70443:function(e,t,n){"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if(({}).hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}n.d(t,{Z:()=>r})},67026:function(e,t,n){"use strict";n.d(t,{Z:()=>r});let r=function(){for(var e,t,n=0,r="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=function e(t){var n,r,a="";if("string"==typeof t||"number"==typeof t)a+=t;else if("object"==typeof t)if(Array.isArray(t)){var o=t.length;for(n=0;n<o;n++)t[n]&&(r=e(t[n]))&&(a&&(a+=" "),a+=r)}else for(r in t)t[r]&&(a&&(a+=" "),a+=r);return a}(e))&&(r&&(r+=" "),r+=t);return r}},83229:function(e,t,n){"use strict";let r,a,o,i,l;n.d(t,{p1:()=>U,y$:()=>ev});var s,u,c,d,f,p,m,h,g,b,y,v,k,w,x,S,E,_,C=n(67294),T=n(67026),P=Object.create,A=Object.defineProperty,O=Object.defineProperties,L=Object.getOwnPropertyDescriptor,j=Object.getOwnPropertyDescriptors,N=Object.getOwnPropertyNames,R=Object.getOwnPropertySymbols,I=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty,D=Object.prototype.propertyIsEnumerable,z=(e,t,n)=>t in e?A(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,M=(e,t)=>{for(var n in t||(t={}))F.call(t,n)&&z(e,n,t[n]);if(R)for(var n of R(t))D.call(t,n)&&z(e,n,t[n]);return e},$=(e,t)=>O(e,j(t)),B=(e,t)=>{var n={};for(var r in e)F.call(e,r)&&0>t.indexOf(r)&&(n[r]=e[r]);if(null!=e&&R)for(var r of R(e))0>t.indexOf(r)&&D.call(e,r)&&(n[r]=e[r]);return n},U=(l=null!=(o=(r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var a,o;switch(n=n||{},r.util.type(t)){case"Object":if(n[o=r.util.objId(t)])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":if(n[o=r.util.objId(t)])return n[o];return a=[],n[o]=a,t.forEach(function(t,r){a[r]=e(t,n)}),a;default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var a=e.classList;if(a.contains(t))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var u=a[e];return a[e]=i,r.languages.DFS(r.languages,function(t,n){n===u&&t!=e&&(this[t]=i)}),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var s=t[l],u=r.util.type(s);"Object"!==u||o[i(s)]?"Array"!==u||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",o),!o.grammar)throw Error('The language "'+o.language+'" has no grammar.');return o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var s in n)t[s]=n[s];delete t.rest}var u=new i;return l(u,u.head,e),function e(t,n,i,s,u,c){for(var d in i)if(i.hasOwnProperty(d)&&i[d]){var f=i[d];f=Array.isArray(f)?f:[f];for(var p=0;p<f.length;++p){if(c&&c.cause==d+","+p)return;var m=f[p],h=m.inside,g=!!m.lookbehind,b=!!m.greedy,y=m.alias;if(b&&!m.pattern.global){var v=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,v+"g")}for(var k=m.pattern||m,w=s.next,x=u;w!==n.tail&&(!c||!(x>=c.reach));x+=w.value.length,w=w.next){var S,E=w.value;if(n.length>t.length)return;if(!(E instanceof a)){var _=1;if(b){if(!(S=o(k,x,t,g))||S.index>=t.length)break;var C=S.index,T=S.index+S[0].length,P=x;for(P+=w.value.length;C>=P;)P+=(w=w.next).value.length;if(P-=w.value.length,x=P,w.value instanceof a)continue;for(var A=w;A!==n.tail&&(P<T||"string"==typeof A.value);A=A.next)_++,P+=A.value.length;_--,E=t.slice(x,P),S.index-=x}else if(!(S=o(k,0,E,g)))continue;var C=S.index,O=S[0],L=E.slice(0,C),j=E.slice(C+O.length),N=x+E.length;c&&N>c.reach&&(c.reach=N);var R=w.prev;if(L&&(R=l(n,R,L),x+=L.length),function(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}(n,R,_),w=l(n,R,new a(d,h?r.tokenize(O,h):O,y,O)),j&&l(n,w,j),_>1){var I={cause:d+","+p,reach:N};e(t,n,i,w.prev,x,I),c&&I.reach>c.reach&&(c.reach=I.reach)}}}}}}(e,u,t,u.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(u)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach(function(t){a+=e(t,n)}),a}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,"&quot;")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}();t.exports=n,n.default=n}},function(){return a||(0,r[N(r)[0]])((a={exports:{}}).exports,a),a.exports})())?P(I(o)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of N(t))F.call(e,a)||a===n||A(e,a,{get:()=>t[a],enumerable:!(r=L(t,a))||r.enumerable});return e})(!i&&o&&o.__esModule?l:A(l,"default",{value:o,enumerable:!0}),o));U.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},U.languages.markup.tag.inside["attr-value"].inside.entity=U.languages.markup.entity,U.languages.markup.doctype.inside["internal-subset"].inside=U.languages.markup,U.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,"&"))}),Object.defineProperty(U.languages.markup.tag,"addInlined",{value:function(e,t){var n={},n=(n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:U.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}),t=(n["language-"+t]={pattern:/[\s\S]+/,inside:U.languages[t]},{});t[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},U.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(U.languages.markup.tag,"addAttribute",{value:function(e,t){U.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:U.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),U.languages.html=U.languages.markup,U.languages.mathml=U.languages.markup,U.languages.svg=U.languages.markup,U.languages.xml=U.languages.extend("markup",{}),U.languages.ssml=U.languages.xml,U.languages.atom=U.languages.xml,U.languages.rss=U.languages.xml,s={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},c=RegExp((c="(?:[^\\\\-]|"+(u=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/).source+")")+"-"+c),d={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"},U.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:c,inside:{escape:u,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":s,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:u}},"special-escape":s,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":d}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:u,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":d}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}},U.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},U.languages.javascript=U.languages.extend("clike",{"class-name":[U.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),U.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,U.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:U.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:U.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:U.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:U.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:U.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),U.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:U.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),U.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),U.languages.markup&&(U.languages.markup.tag.addInlined("script","javascript"),U.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),U.languages.js=U.languages.javascript,U.languages.actionscript=U.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),U.languages.actionscript["class-name"].alias="function",delete U.languages.actionscript.parameter,delete U.languages.actionscript["literal-property"],U.languages.markup&&U.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:U.languages.markup}}),f=/#(?!\{).+/,p={pattern:/#\{[^}]+\}/,alias:"variable"},U.languages.coffeescript=U.languages.extend("javascript",{comment:f,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:p}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),U.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:f,interpolation:p}}}),U.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:U.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:p}}]}),U.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete U.languages.coffeescript["template-string"],U.languages.coffee=U.languages.coffeescript,Object.defineProperty(m=U.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/},"addSupport",{value:function(e,t){(e="string"==typeof e?[e]:e).forEach(function(e){var n=function(e){e.inside||(e.inside={}),e.inside.rest=t},r="doc-comment";if(a=U.languages[e]){var a,o=a[r];if((o=o||(a=U.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[r])instanceof RegExp&&(o=a[r]={pattern:o}),Array.isArray(o))for(var i=0,l=o.length;i<l;i++)o[i]instanceof RegExp&&(o[i]={pattern:o[i]}),n(o[i]);else n(o)}})}}),m.addSupport(["java","javascript","php"],m),h=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,U.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+h.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+h.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+h.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+h.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:h,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},U.languages.css.atrule.inside.rest=U.languages.css,(h=U.languages.markup)&&(h.tag.addInlined("style","css"),h.tag.addAttribute("style","css")),g=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,U.languages.css.selector={pattern:U.languages.css.selector.pattern,lookbehind:!0,inside:g={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+g.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[g,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},U.languages.css.atrule.inside["selector-function-argument"].inside=g,U.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),g={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},b={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},U.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:g,number:b,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:g,number:b}),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ ]+"+t.source+")?|"+t.source+"(?:[ ]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){return t=(t||"").replace(/m/g,"")+"m",RegExp(/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,function(){return r}).replace(/<<value>>/g,function(){return e}),t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,function(){return r}).replace(/<<key>>/g,function(){return"(?:"+a+"|"+o+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(U),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,function(){return t}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return r}),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(t){["url","bold","italic","strike","code-snippet"].forEach(function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])})}),e.hooks.add("after-tokenize",function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var a,o=t[n];"code"!==o.type?e(o.content):(a=o.content[1],o=o.content[3],a&&o&&"code-language"===a.type&&"code-block"===o.type&&"string"==typeof a.content&&(a=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),a="language-"+(a=(/[a-z][\w-]*/i.exec(a)||[""])[0].toLowerCase()),o.alias?"string"==typeof o.alias?o.alias=[o.alias,a]:o.alias.push(a):o.alias=[a]))}}(e.tokens)}),e.hooks.add("wrap",function(t){if("code-block"===t.type){for(var n,r="",a=0,o=t.classes.length;a<o;a++){var u=t.classes[a],u=/language-(.+)/.exec(u);if(u){r=u[1];break}}var c,d=e.languages[r];d?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,function(e,t){return"#"===(t=t.toLowerCase())[0]?s("x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1))):l[t]||e}),d,r):r&&"none"!==r&&e.plugins.autoloader&&(c="md-"+new Date().valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(r,function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[r],r))}))}}),RegExp(e.languages.markup.tag.pattern.source,"gi")),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(U),U.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:U.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},U.hooks.add("after-tokenize",function(e){if("graphql"===e.language)for(var t=e.tokens.filter(function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type}),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var a=[];if(c(["definition-mutation","punctuation"])&&"("===t[n+1].content){n+=2;var o=d(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=t[n+0];"variable"===i.type&&(f(i,"variable-input"),a.push(i.content))}n=o+1}if(c(["punctuation","property-query"])&&"{"===t[n+0].content&&(f(t[++n+0],"property-mutation"),0<a.length)){var l=d(/^\{$/,/^\}$/);if(-1!==l)for(var s=n;s<l;s++){var u=t[s];"variable"===u.type&&0<=a.indexOf(u.content)&&f(u,"variable-input")}}}}function c(e,r){r=r||0;for(var a=0;a<e.length;a++){var o=t[n+(a+r)];if(!o||o.type!==e[a])return}return 1}function d(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l){if(e.test(l))a++;else if(r.test(l)&&0==--a)return o}}return -1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}}),U.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var s={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};e.hooks.add("after-tokenize",function(t){t.language in s&&function t(n){for(var i=0,s=n.length;i<s;i++){var u,c,d,f=n[i];"string"!=typeof f&&(Array.isArray(u=f.content)?"template-string"===f.type?(f=u[1],3===u.length&&"string"!=typeof f&&"embedded-code"===f.type&&(c=function e(t){return"string"==typeof t?t:Array.isArray(t)?t.map(e).join(""):e(t.content)}(f),f=Array.isArray(f=f.alias)?f[0]:f,d=e.languages[f])&&(u[1]=function(t,n,i){var s=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),u=0,c={},s=l(s.map(function(e){if("string"==typeof e)return e;for(var n,r,e=e.content;-1!==t.indexOf((r=u++,n="___"+i.toUpperCase()+"_"+r+"___")););return c[n]=e,n}).join(""),n,i),d=Object.keys(c);return u=0,function t(n){for(var o=0;o<n.length;o++){if(u>=d.length)return;var i,s,f,p,m,h,g,b=n[o];"string"==typeof b||"string"==typeof b.content?(i=d[u],-1!==(g=(h="string"==typeof b?b:b.content).indexOf(i))&&(++u,s=h.substring(0,g),m=c[i],f=void 0,(p={})["interpolation-punctuation"]=a,3===(p=e.tokenize(m,p)).length&&((f=[1,1]).push.apply(f,l(p[1],e.languages.javascript,"javascript")),p.splice.apply(p,f)),f=new e.Token("interpolation",p,r.alias,m),p=h.substring(g+i.length),m=[],s&&m.push(s),m.push(f),p&&(t(h=[p]),m.push.apply(m,h)),"string"==typeof b?(n.splice.apply(n,[o,1].concat(m)),o+=m.length-1):b.content=m)):Array.isArray(g=b.content)?t(g):t([g])}}(s),new e.Token(i,s,"language-"+i,t)}(c,d,f))):t(u):"string"!=typeof u&&t([u]))}}(t.tokens)})}(U),U.languages.typescript=U.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),U.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete U.languages.typescript.parameter,delete U.languages.typescript["literal-property"],y=U.languages.extend("typescript",{}),delete y["class-name"],U.languages.typescript["class-name"].inside=y,U.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:y}}}}),U.languages.ts=U.languages.typescript,v=U.languages.javascript,w="(@(?:arg|argument|param|property)\\s+(?:"+(k=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source)+"\\s+)?)",U.languages.jsdoc=U.languages.extend("javadoclike",{parameter:{pattern:RegExp(w+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),U.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(w+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:v,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,function(){return k})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+k),lookbehind:!0,inside:{string:v.string,number:v.number,boolean:v.boolean,keyword:U.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:v,alias:"language-javascript"}}}}),U.languages.javadoclike.addSupport("javascript",U.languages.jsdoc),U.languages.flow=U.languages.extend("javascript",{}),U.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),U.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete U.languages.flow.parameter,U.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(U.languages.flow.keyword)||(U.languages.flow.keyword=[U.languages.flow.keyword]),U.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0}),U.languages.n4js=U.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),U.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),U.languages.n4jsd=U.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var a=n[r],o=e.languages.javascript[a],a=(o="RegExp"===e.util.type(o)?e.languages.javascript[a]={pattern:o}:o).inside||{};(o.inside=a)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(U),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return RegExp(e=e.replace(/<S>/g,function(){return n}).replace(/<BRACES>/g,function(){return r}).replace(/<SPREAD>/g,function(){return a}),t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""};e.hooks.add("after-tokenize",function(t){"jsx"!==t.language&&"tsx"!==t.language||function t(n){for(var r=[],a=0;a<n.length;a++){var o=n[a],l=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<r.length&&r[r.length-1].tagName===i(o.content[0].content[1])&&r.pop():"/>"!==o.content[o.content.length-1].content&&r.push({tagName:i(o.content[0].content[1]),openedBraces:0}):0<r.length&&"punctuation"===o.type&&"{"===o.content?r[r.length-1].openedBraces++:0<r.length&&0<r[r.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?r[r.length-1].openedBraces--:l=!0),(l||"string"==typeof o)&&0<r.length&&0===r[r.length-1].openedBraces&&(l=i(o),a<n.length-1&&("string"==typeof n[a+1]||"plain-text"===n[a+1].type)&&(l+=i(n[a+1]),n.splice(a+1,1)),0<a&&("string"==typeof n[a-1]||"plain-text"===n[a-1].type)&&(l=i(n[a-1])+l,n.splice(a-1,1),a--),n[a]=new e.Token("plain-text",l,null,l)),o.content&&"string"!=typeof o.content&&t(o.content)}}(t.tokens)})}(U),x=U.util.clone(U.languages.typescript),(U.languages.tsx=U.languages.extend("jsx",x),delete U.languages.tsx.parameter,delete U.languages.tsx["literal-property"],x=U.languages.tsx.tag).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+x.pattern.source+")",x.pattern.flags),x.lookbehind=!0,U.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ ]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},U.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=U.languages.swift}),U.languages.kotlin=U.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete U.languages.kotlin["class-name"],S={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:U.languages.kotlin}},U.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:S},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:S},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete U.languages.kotlin.string,U.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),U.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),U.languages.kt=U.languages.kotlin,U.languages.kts=U.languages.kotlin,U.languages.c=U.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),U.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),U.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},U.languages.c.string],char:U.languages.c.char,comment:U.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:U.languages.c}}}}),U.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete U.languages.c.boolean,U.languages.objectivec=U.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete U.languages.objectivec["class-name"],U.languages.objc=U.languages.objectivec,U.languages.reason=U.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),U.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete U.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,function(){return t});t=t.replace(/<self>/g,function(){return/[^\s\S]/.source}),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(U),U.languages.go=U.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),U.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete U.languages.go["class-name"],E=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,_=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,function(){return E.source}),U.languages.cpp=U.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,function(){return E.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:E,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),U.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,function(){return _})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),U.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:U.languages.cpp}}}}),U.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),U.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:U.languages.extend("cpp",{})}}),U.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},U.languages.cpp["base-clause"]),U.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},U.languages.python["string-interpolation"].inside.interpolation.inside.rest=U.languages.python,U.languages.py=U.languages.python,U.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},U.languages.webmanifest=U.languages.json;var H={},Q={dracula:()=>V,duotoneDark:()=>W,duotoneLight:()=>q,github:()=>G,gruvboxMaterialDark:()=>ef,gruvboxMaterialLight:()=>ep,jettwaveDark:()=>es,jettwaveLight:()=>eu,nightOwl:()=>Y,nightOwlLight:()=>K,oceanicNext:()=>ee,okaidia:()=>et,oneDark:()=>ec,oneLight:()=>ed,palenight:()=>en,shadesOfPurple:()=>er,synthwave84:()=>ea,ultramin:()=>eo,vsDark:()=>ei,vsLight:()=>el};for(var Z in Q)A(H,Z,{get:Q[Z],enumerable:!0});var V={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},W={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},q={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},G={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},Y={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},K={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},X="#c5a5c5",J="#8dc891",ee={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:X}},{types:["attr-value"],style:{color:J}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:J}},{types:["punctuation"],style:{color:J}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:X}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},et={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},en={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},er={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},ea={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},eo={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},ei={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},el={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},es={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},eu={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},ec={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},ed={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},ef={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},ep={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},em=/\r\n|\r|\n/,eh=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},eg=(e,t)=>{let n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},eb=e=>{let t=[[]],n=[e],r=[0],a=[e.length],o=0,i=0,l=[],s=[l];for(;i>-1;){for(;(o=r[i]++)<a[i];){let e,u=t[i],c=n[i][o];if("string"==typeof c?(u=i>0?u:["plain"],e=c):(u=eg(u,c.type),c.alias&&(u=eg(u,c.alias)),e=c.content),"string"!=typeof e){i++,t.push(u),n.push(e),r.push(0),a.push(e.length);continue}let d=e.split(em),f=d.length;l.push({types:u,content:d[0]});for(let e=1;e<f;e++)eh(l),s.push(l=[]),l.push({types:u,content:d[e]})}i--,t.pop(),n.pop(),r.pop(),a.pop()}return eh(l),s},ey=({children:e,language:t,code:n,theme:r,prism:a})=>{let o=t.toLowerCase(),i=((e,t)=>{let{plain:n}=e,r=e.styles.reduce((e,n)=>{let{languages:r,style:a}=n;return r&&!r.includes(t)||n.types.forEach(t=>{let n=M(M({},e[t]),a);e[t]=n}),e},{});return r.root=n,r.plain=$(M({},n),{backgroundColor:void 0}),r})(r,o),l=(0,C.useCallback)(e=>{var{className:t,style:n,line:r}=e;let a=$(M({},B(e,["className","style","line"])),{className:(0,T.Z)("token-line",t)});return"object"==typeof i&&"plain"in i&&(a.style=i.plain),"object"==typeof n&&(a.style=M(M({},a.style||{}),n)),a},[i]),s=(e=>{let t=(0,C.useCallback)(({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map(t=>e[t]))},[e]);return(0,C.useCallback)(e=>{var{token:n,className:r,style:a}=e;let o=$(M({},B(e,["token","className","style"])),{className:(0,T.Z)("token",...n.types,r),children:n.content,style:t(n)});return null!=a&&(o.style=M(M({},o.style||{}),a)),o},[t])})(i),u=a.languages[o];return e({tokens:(({prism:e,code:t,grammar:n,language:r})=>(0,C.useMemo)(()=>{if(null==n)return eb([t]);let a={code:t,grammar:n,language:r,tokens:[]};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(t,n),e.hooks.run("after-tokenize",a),eb(a.tokens)},[t,n,r,e]))({prism:a,language:o,code:n,grammar:u}),className:`prism-code language-${o}`,style:null!=i?i.root:{},getLineProps:l,getTokenProps:s})},ev=e=>(0,C.createElement)(ey,$(M({},e),{prism:e.prism||U,theme:e.theme||ei,code:e.code,language:e.language}))},21835:function(e,t,n){"use strict";n.d(t,{Z:()=>r});function r(e,t){if(!e)throw Error("Invariant failed")}},28395:function(e,t,n){"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>I,__assign:()=>o,__asyncDelegator:()=>_,__asyncGenerator:()=>E,__asyncValues:()=>C,__await:()=>S,__awaiter:()=>m,__classPrivateFieldGet:()=>j,__classPrivateFieldIn:()=>R,__classPrivateFieldSet:()=>N,__createBinding:()=>g,__decorate:()=>l,__disposeResources:()=>D,__esDecorate:()=>u,__exportStar:()=>b,__extends:()=>a,__generator:()=>h,__importDefault:()=>L,__importStar:()=>O,__makeTemplateObject:()=>T,__metadata:()=>p,__param:()=>s,__propKey:()=>d,__read:()=>v,__rest:()=>i,__rewriteRelativeImportExtension:()=>z,__runInitializers:()=>c,__setFunctionName:()=>f,__spread:()=>k,__spreadArray:()=>x,__spreadArrays:()=>w,__values:()=>y,default:()=>M});var r=function(e,t){return(r=Object.setPrototypeOf||({__proto__:[]})instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function a(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var o=function(){return(o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}).apply(this,arguments)};function i(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&0>t.indexOf(r)&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var a=0,r=Object.getOwnPropertySymbols(e);a<r.length;a++)0>t.indexOf(r[a])&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]]);return n}function l(e,t,n,r){var a,o=arguments.length,i=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var l=e.length-1;l>=0;l--)(a=e[l])&&(i=(o<3?a(i):o>3?a(t,n,i):a(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function s(e,t){return function(n,r){t(n,r,e)}}function u(e,t,n,r,a,o){function i(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var l,s=r.kind,u="getter"===s?"get":"setter"===s?"set":"value",c=!t&&e?r.static?e:e.prototype:null,d=t||(c?Object.getOwnPropertyDescriptor(c,r.name):{}),f=!1,p=n.length-1;p>=0;p--){var m={};for(var h in r)m[h]="access"===h?{}:r[h];for(var h in r.access)m.access[h]=r.access[h];m.addInitializer=function(e){if(f)throw TypeError("Cannot add initializers after decoration has completed");o.push(i(e||null))};var g=(0,n[p])("accessor"===s?{get:d.get,set:d.set}:d[u],m);if("accessor"===s){if(void 0===g)continue;if(null===g||"object"!=typeof g)throw TypeError("Object expected");(l=i(g.get))&&(d.get=l),(l=i(g.set))&&(d.set=l),(l=i(g.init))&&a.unshift(l)}else(l=i(g))&&("field"===s?a.unshift(l):d[u]=l)}c&&Object.defineProperty(c,r.name,d),f=!0}function c(e,t,n){for(var r=arguments.length>2,a=0;a<t.length;a++)n=r?t[a].call(e,n):t[a].call(e);return r?n:void 0}function d(e){return"symbol"==typeof e?e:"".concat(e)}function f(e,t,n){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:n?"".concat(n," ",t):t})}function p(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function m(e,t,n,r){return new(n||(n=Promise))(function(a,o){function i(e){try{s(r.next(e))}catch(e){o(e)}}function l(e){try{s(r.throw(e))}catch(e){o(e)}}function s(e){var t;e.done?a(e.value):((t=e.value)instanceof n?t:new n(function(e){e(t)})).then(i,l)}s((r=r.apply(e,t||[])).next())})}function h(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return i.next=l(0),i.throw=l(1),i.return=l(2),"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(l){return function(s){var u=[l,s];if(n)throw TypeError("Generator is already executing.");for(;i&&(i=0,u[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return o.label++,{value:u[1],done:!1};case 5:o.label++,r=u[1],u=[0];continue;case 7:u=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){o=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){o.label=u[1];break}if(6===u[0]&&o.label<a[1]){o.label=a[1],a=u;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(u);break}a[2]&&o.ops.pop(),o.trys.pop();continue}u=t.call(e,o)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var g=Object.create?function(e,t,n,r){void 0===r&&(r=n);var a=Object.getOwnPropertyDescriptor(t,n);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,a)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]};function b(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||g(t,e,n)}function y(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,a,o=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)i.push(r.value)}catch(e){a={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(a)throw a.error}}return i}function k(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(v(arguments[t]));return e}function w(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;for(var r=Array(e),a=0,t=0;t<n;t++)for(var o=arguments[t],i=0,l=o.length;i<l;i++,a++)r[a]=o[i];return r}function x(e,t,n){if(n||2==arguments.length)for(var r,a=0,o=t.length;a<o;a++)!r&&a in t||(r||(r=Array.prototype.slice.call(t,0,a)),r[a]=t[a]);return e.concat(r||Array.prototype.slice.call(t))}function S(e){return this instanceof S?(this.v=e,this):new S(e)}function E(e,t,n){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var r,a=n.apply(e,t||[]),o=[];return r=Object.create(("function"==typeof AsyncIterator?AsyncIterator:Object).prototype),i("next"),i("throw"),i("return",function(e){return function(t){return Promise.resolve(t).then(e,u)}}),r[Symbol.asyncIterator]=function(){return this},r;function i(e,t){a[e]&&(r[e]=function(t){return new Promise(function(n,r){o.push([e,t,n,r])>1||l(e,t)})},t&&(r[e]=t(r[e])))}function l(e,t){try{var n;(n=a[e](t)).value instanceof S?Promise.resolve(n.value.v).then(s,u):c(o[0][2],n)}catch(e){c(o[0][3],e)}}function s(e){l("next",e)}function u(e){l("throw",e)}function c(e,t){e(t),o.shift(),o.length&&l(o[0][0],o[0][1])}}function _(e){var t,n;return t={},r("next"),r("throw",function(e){throw e}),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,a){t[r]=e[r]?function(t){return(n=!n)?{value:S(e[r](t)),done:!1}:a?a(t):t}:a}}function C(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=y(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise(function(r,a){var o,i,l;o=r,i=a,l=(t=e[n](t)).done,Promise.resolve(t.value).then(function(e){o({value:e,done:l})},i)})}}}function T(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var P=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},A=function(e){return(A=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[t.length]=n);return t})(e)};function O(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n=A(e),r=0;r<n.length;r++)"default"!==n[r]&&g(t,e,n[r]);return P(t,e),t}function L(e){return e&&e.__esModule?e:{default:e}}function j(e,t,n,r){if("a"===n&&!r)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(e):r?r.value:t.get(e)}function N(e,t,n,r,a){if("m"===r)throw TypeError("Private method is not writable");if("a"===r&&!a)throw TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?a.call(e,n):a?a.value=n:t.set(e,n),n}function R(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}function I(e,t,n){if(null!=t){var r,a;if("object"!=typeof t&&"function"!=typeof t)throw TypeError("Object expected.");if(n){if(!Symbol.asyncDispose)throw TypeError("Symbol.asyncDispose is not defined.");r=t[Symbol.asyncDispose]}if(void 0===r){if(!Symbol.dispose)throw TypeError("Symbol.dispose is not defined.");r=t[Symbol.dispose],n&&(a=r)}if("function"!=typeof r)throw TypeError("Object not disposable.");a&&(r=function(){try{a.call(this)}catch(e){return Promise.reject(e)}}),e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t}var F="function"==typeof SuppressedError?SuppressedError:function(e,t,n){var r=Error(n);return r.name="SuppressedError",r.error=e,r.suppressed=t,r};function D(e){function t(t){e.error=e.hasError?new F(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}var n,r=0;return function a(){for(;n=e.stack.pop();)try{if(!n.async&&1===r)return r=0,e.stack.push(n),Promise.resolve().then(a);if(n.dispose){var o=n.dispose.call(n.value);if(n.async)return r|=2,Promise.resolve(o).then(a,function(e){return t(e),a()})}else r|=1}catch(e){t(e)}if(1===r)return e.hasError?Promise.reject(e.error):Promise.resolve();if(e.hasError)throw e.error}()}function z(e,t){return"string"==typeof e&&/^\.\.?\//.test(e)?e.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(e,n,r,a,o){return n?t?".jsx":".js":!r||a&&o?r+a+"."+o.toLowerCase()+"js":e}):e}let M={__extends:a,__assign:o,__rest:i,__decorate:l,__param:s,__esDecorate:u,__runInitializers:c,__propKey:d,__setFunctionName:f,__metadata:p,__awaiter:m,__generator:h,__createBinding:g,__exportStar:b,__values:y,__read:v,__spread:k,__spreadArrays:w,__spreadArray:x,__await:S,__asyncGenerator:E,__asyncDelegator:_,__asyncValues:C,__makeTemplateObject:T,__importStar:O,__importDefault:L,__classPrivateFieldGet:j,__classPrivateFieldSet:N,__classPrivateFieldIn:R,__addDisposableResource:I,__disposeResources:D,__rewriteRelativeImportExtension:z}},62627:function(e){"use strict";e.exports={}},37138:function(e){"use strict";e.exports=JSON.parse('{"/multi-scrobbler/playground/-18f":{"__comp":"0ce74438","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"},"/multi-scrobbler/search/-71d":{"__comp":"1a4e3797","__context":{"plugin":"138e0e15"}},"/multi-scrobbler/-2c5":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/multi-scrobbler/-bb5":{"__comp":"a7bd4aaa","__props":"7d837a1d"},"/multi-scrobbler/-d93":{"__comp":"a94703ab"},"/multi-scrobbler/category/development/-626":{"__comp":"14eb3368","__props":"97d34c1a"},"/multi-scrobbler/category/updating/-719":{"__comp":"14eb3368","__props":"4f1fc707"},"/multi-scrobbler/configuration/-230":{"__comp":"17896441","content":"04d926a5"},"/multi-scrobbler/configuration/clients/-099":{"__comp":"17896441","content":"a16703cd"},"/multi-scrobbler/configuration/clients/koito/-bcb":{"__comp":"17896441","content":"f18fd350"},"/multi-scrobbler/configuration/clients/lastfm/-5c9":{"__comp":"17896441","content":"64837553"},"/multi-scrobbler/configuration/clients/librefm/-dd4":{"__comp":"17896441","content":"7b4f75c2"},"/multi-scrobbler/configuration/clients/listenbrainz/-be2":{"__comp":"17896441","content":"4f7d60c5"},"/multi-scrobbler/configuration/clients/maloja/-dc4":{"__comp":"17896441","content":"cdda7d53"},"/multi-scrobbler/configuration/clients/rocksky/-489":{"__comp":"17896441","content":"e82a470f"},"/multi-scrobbler/configuration/clients/tealfm/-743":{"__comp":"17896441","content":"812e048c"},"/multi-scrobbler/configuration/kitchensink/-7d2":{"__comp":"17896441","content":"e7a53bbd"},"/multi-scrobbler/configuration/sources/-479":{"__comp":"17896441","content":"2a24ad03"},"/multi-scrobbler/configuration/sources/azuracast/-434":{"__comp":"17896441","content":"24a5b6e6"},"/multi-scrobbler/configuration/sources/deezer/-d7a":{"__comp":"17896441","content":"925abbc7"},"/multi-scrobbler/configuration/sources/google-cast/-434":{"__comp":"17896441","content":"72d905a9"},"/multi-scrobbler/configuration/sources/icecast/-dfe":{"__comp":"17896441","content":"8b39be93"},"/multi-scrobbler/configuration/sources/jellyfin/-2fe":{"__comp":"17896441","content":"5a378701"},"/multi-scrobbler/configuration/sources/jriver/-a36":{"__comp":"17896441","content":"498c77bd"},"/multi-scrobbler/configuration/sources/kodi/-ab6":{"__comp":"17896441","content":"d53edd15"},"/multi-scrobbler/configuration/sources/koito-source/-d25":{"__comp":"17896441","content":"202c4968"},"/multi-scrobbler/configuration/sources/lastfm-endpoint/-d0b":{"__comp":"17896441","content":"3827a595"},"/multi-scrobbler/configuration/sources/lastfm-source/-f93":{"__comp":"17896441","content":"9bcab3db"},"/multi-scrobbler/configuration/sources/librefm-source/-2b0":{"__comp":"17896441","content":"73287945"},"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/-b80":{"__comp":"17896441","content":"a93ae359"},"/multi-scrobbler/configuration/sources/listenbrainz-source/-8ff":{"__comp":"17896441","content":"af9480c3"},"/multi-scrobbler/configuration/sources/maloja/-ed2":{"__comp":"17896441","content":"fa357871"},"/multi-scrobbler/configuration/sources/mopidy/-b30":{"__comp":"17896441","content":"5930ad03"},"/multi-scrobbler/configuration/sources/mpd/-e96":{"__comp":"17896441","content":"91a78c9f"},"/multi-scrobbler/configuration/sources/mpris/-751":{"__comp":"17896441","content":"fee59995"},"/multi-scrobbler/configuration/sources/musikcube/-515":{"__comp":"17896441","content":"425b8dd3"},"/multi-scrobbler/configuration/sources/plex/-468":{"__comp":"17896441","content":"1fb61236"},"/multi-scrobbler/configuration/sources/rocksky-source/-c8d":{"__comp":"17896441","content":"08938dd7"},"/multi-scrobbler/configuration/sources/spotify/-0b5":{"__comp":"17896441","content":"778b0fa6"},"/multi-scrobbler/configuration/sources/subsonic/-c34":{"__comp":"17896441","content":"294f31e2"},"/multi-scrobbler/configuration/sources/tealfm-source/-912":{"__comp":"17896441","content":"30829cd8"},"/multi-scrobbler/configuration/sources/vlc/-918":{"__comp":"17896441","content":"41cd626a"},"/multi-scrobbler/configuration/sources/webscrobbler/-3e7":{"__comp":"17896441","content":"9fd2a592"},"/multi-scrobbler/configuration/sources/yamaha-musiccast/-5e1":{"__comp":"17896441","content":"493c00ca"},"/multi-scrobbler/configuration/sources/youtube-music/-e7a":{"__comp":"17896441","content":"2ecbbad4"},"/multi-scrobbler/configuration/transforms/-5d3":{"__comp":"17896441","content":"094000d3"},"/multi-scrobbler/configuration/transforms/musicbrainz/-7d6":{"__comp":"17896441","content":"e6ac3f64"},"/multi-scrobbler/configuration/transforms/native/-57a":{"__comp":"17896441","content":"dfa6d5b1"},"/multi-scrobbler/configuration/transforms/user/-9c5":{"__comp":"17896441","content":"44b2647e"},"/multi-scrobbler/development/dev-client/-d6f":{"__comp":"17896441","content":"07b3b246"},"/multi-scrobbler/development/dev-common/-878":{"__comp":"17896441","content":"c2e935db"},"/multi-scrobbler/development/dev-source/-98f":{"__comp":"17896441","content":"33c4ed3f"},"/multi-scrobbler/development/flatpak/-b8b":{"__comp":"17896441","content":"153c3ceb"},"/multi-scrobbler/FAQ/-07c":{"__comp":"17896441","content":"ad895e75"},"/multi-scrobbler/installation/-371":{"__comp":"17896441","content":"bf69edfb"},"/multi-scrobbler/installation/service/-97c":{"__comp":"17896441","content":"b46f7c12"},"/multi-scrobbler/quickstart/-cfc":{"__comp":"17896441","content":"74876495"},"/multi-scrobbler/updating/-065":{"__comp":"17896441","content":"d3a18f08"},"/multi-scrobbler/-e36":{"__comp":"17896441","content":"4edc808e"}}')}},function(e){e.O(0,["6212"],function(){return e(e.s=32073)}),e.O()}]);
-1
assets/js/runtime~main.02b4bf18.js
··· 1 - (()=>{"use strict";var e,a,d,t,c,r,b,f={},o={};function n(e){var a=o[e];if(void 0!==a)return a.exports;var d=o[e]={id:e,loaded:!1,exports:{}};return f[e].call(d.exports,d,d.exports,n),d.loaded=!0,d.exports}n.m=f,n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a:a}),a},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(d,t){if(1&t&&(d=this(d)),8&t||"object"==typeof d&&d&&(4&t&&d.__esModule||16&t&&"function"==typeof d.then))return d;var c=Object.create(null);n.r(c);var r={};e=e||[null,a({}),a([]),a(a)];for(var b=2&t&&d;"object"==typeof b&&!~e.indexOf(b);b=a(b))Object.getOwnPropertyNames(b).forEach(e=>{r[e]=()=>d[e]});return r.default=()=>d,n.d(c,r),c},n.d=(e,a)=>{for(var d in a)n.o(a,d)&&!n.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((a,d)=>(n.f[d](e,a),a),[])),n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.u=e=>"assets/js/"+(({1165:"24a5b6e6",1214:"72d905a9",1355:"153c3ceb",151:"138e0e15",1771:"33c4ed3f",1970:"4f1fc707",1983:"14eb3368",2583:"fee59995",3174:"1fb61236",3385:"0ce74438",3396:"2ecbbad4",3424:"2a24ad03",3432:"5e95c892",3517:"30829cd8",3664:"7d837a1d",3693:"44b2647e",3989:"778b0fa6",4021:"b46f7c12",4328:"a16703cd",4330:"8b39be93",4477:"08938dd7",4854:"41cd626a",5112:"aba21aa0",5211:"a7bd4aaa",5230:"1a4e3797",5291:"3827a595",5658:"ad895e75",5757:"e82a470f",6286:"bf69edfb",6364:"425b8dd3",6374:"9bcab3db",6658:"9fd2a592",6707:"cdda7d53",6751:"812e048c",6922:"e6ac3f64",6963:"97d34c1a",7048:"17896441",7073:"e7a53bbd",7246:"5a378701",7365:"a7456010",7375:"d53edd15",7416:"dfa6d5b1",7544:"294f31e2",7556:"f18fd350",7631:"74876495",8005:"4edc808e",8016:"common",8051:"04d926a5",8054:"202c4968",8378:"c2e935db",8569:"4f7d60c5",862:"493c00ca",8656:"d3a18f08",8670:"498c77bd",8881:"a93ae359",8934:"925abbc7",8972:"91a78c9f",9116:"07b3b246",9318:"fa357871",9325:"094000d3",9621:"64837553",974:"af9480c3",9914:"a94703ab",9982:"5930ad03"})[e]||e)+"."+({1165:"23a4c551",1214:"340d823f",1355:"dfdb2a71",151:"2d4a661f",1622:"6a2ed701",1771:"38599907",1970:"e6532b9e",1983:"be6e6860",232:"bc6904b7",2583:"55240556",3174:"74186b4f",3385:"27f78bba",3396:"ead83d98",3424:"3d498c1e",3432:"8168dcae",3517:"6aeb5c43",3664:"08c28abc",3693:"a253087b",3989:"6fbcc7c2",4021:"948646c7",4328:"8973c8af",4330:"2b927db5",4477:"cd3b7289",4854:"29bc7212",5112:"b61173be",5211:"776d5eae",5230:"f5148830",5291:"5e80120c",5648:"419a85b0",5658:"031b9363",5671:"66c8d3a5",5757:"ed3e812a",6021:"71e4c2e2",6286:"9ed17f23",6364:"6bd58558",6374:"b6e1bd94",6658:"f0eeb381",6707:"3046f063",6751:"ab4bdf23",6922:"1c34ed75",6963:"cdfa9a73",7048:"6caa3cbd",7073:"a8e243cd",7246:"7e37c733",7365:"96dc3a78",7375:"c8bda851",7416:"81b1b4e7",7469:"a13f937e",7544:"5cc2a685",7556:"f6890af4",7631:"a1d9f251",7971:"d6d41a5a",8005:"e1172d67",8016:"98cd39de",8051:"6943d148",8054:"36e03a3e",8303:"6f0b6e46",8378:"ab3b34d9",8513:"ce3f37bc",8569:"9f448f9d",862:"106ac761",8656:"469b9740",8670:"cf0fbab1",8881:"3bd41c66",8934:"fc0cfcb9",8972:"d7e6e1a2",9116:"de102eee",9151:"a330ab2d",9318:"2218d927",9325:"d5b07987",9621:"05731c91",974:"160bc425",9914:"0c803154",9982:"e3a61ab0"})[e]+".js",n.miniCssF=e=>""+e+".css",n.g=(()=>{if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}})(),n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},n.l=function(e,a,t,c){if(d[e])return void d[e].push(a);if(void 0!==t)for(var r,b,f=document.getElementsByTagName("script"),o=0;o<f.length;o++){var i=f[o];if(i.getAttribute("src")==e||i.getAttribute("data-webpack")=="my-website:"+t){r=i;break}}r||(b=!0,(r=document.createElement("script")).charset="utf-8",r.timeout=120,n.nc&&r.setAttribute("nonce",n.nc),r.setAttribute("data-webpack","my-website:"+t),r.src=e),d[e]=[a];var u=function(a,t){r.onerror=r.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],r.parentNode&&r.parentNode.removeChild(r),c&&c.forEach(function(e){return e(t)}),a)return a(t)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),b&&document.head.appendChild(r)},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t=[],n.O=(e,a,d,c)=>{if(a){c=c||0;for(var r=t.length;r>0&&t[r-1][2]>c;r--)t[r]=t[r-1];t[r]=[a,d,c];return}for(var b=1/0,r=0;r<t.length;r++){for(var a=t[r][0],d=t[r][1],c=t[r][2],f=!0,o=0;o<a.length;o++)(!1&c||b>=c)&&Object.keys(n.O).every(e=>n.O[e](a[o]))?a.splice(o--,1):(f=!1,c<b&&(b=c));if(f){t.splice(r--,1);var i=d();void 0!==i&&(e=i)}}return e},n.p="/multi-scrobbler/",n.rv=()=>"1.4.6",n.gca=function(e){return e=({0x11113f9:"7048",0x3dd57b1:"9621",0x476864f:"7631","138e0e15":"151","493c00ca":"862",af9480c3:"974","24a5b6e6":"1165","72d905a9":"1214","153c3ceb":"1355","33c4ed3f":"1771","4f1fc707":"1970","14eb3368":"1983",fee59995:"2583","1fb61236":"3174","0ce74438":"3385","2ecbbad4":"3396","2a24ad03":"3424","5e95c892":"3432","30829cd8":"3517","7d837a1d":"3664","44b2647e":"3693","778b0fa6":"3989",b46f7c12:"4021",a16703cd:"4328","8b39be93":"4330","08938dd7":"4477","41cd626a":"4854",aba21aa0:"5112",a7bd4aaa:"5211","1a4e3797":"5230","3827a595":"5291",ad895e75:"5658",e82a470f:"5757",bf69edfb:"6286","425b8dd3":"6364","9bcab3db":"6374","9fd2a592":"6658",cdda7d53:"6707","812e048c":"6751",e6ac3f64:"6922","97d34c1a":"6963",e7a53bbd:"7073","5a378701":"7246",a7456010:"7365",d53edd15:"7375",dfa6d5b1:"7416","294f31e2":"7544",f18fd350:"7556","4edc808e":"8005",common:"8016","04d926a5":"8051","202c4968":"8054",c2e935db:"8378","4f7d60c5":"8569",d3a18f08:"8656","498c77bd":"8670",a93ae359:"8881","925abbc7":"8934","91a78c9f":"8972","07b3b246":"9116",fa357871:"9318","094000d3":"9325",a94703ab:"9914","5930ad03":"9982"})[e]||e,n.p+n.u(e)},n.b=document.baseURI||self.location.href,c={2580:0,6212:0},n.f.j=function(e,a){var d=n.o(c,e)?c[e]:void 0;if(0!==d)if(d)a.push(d[2]);else if(/^(2580|6212)$/.test(e))c[e]=0;else{var t=new Promise((a,t)=>d=c[e]=[a,t]);a.push(d[2]=t);var r=n.p+n.u(e),b=Error();n.l(r,function(a){if(n.o(c,e)&&(0!==(d=c[e])&&(c[e]=void 0),d)){var t=a&&("load"===a.type?"missing":a.type),r=a&&a.target&&a.target.src;b.message="Loading chunk "+e+" failed.\n("+t+": "+r+")",b.name="ChunkLoadError",b.type=t,b.request=r,d[1](b)}},"chunk-"+e,e)}},n.O.j=e=>0===c[e],r=(e,a)=>{var d,t,r=a[0],b=a[1],f=a[2],o=0;if(r.some(e=>0!==c[e])){for(d in b)n.o(b,d)&&(n.m[d]=b[d]);if(f)var i=f(n)}for(e&&e(a);o<r.length;o++)t=r[o],n.o(c,t)&&c[t]&&c[t][0](),c[t]=0;return n.O(i)},(b=self.webpackChunkmy_website=self.webpackChunkmy_website||[]).forEach(r.bind(null,0)),b.push=r.bind(null,b.push.bind(b))})();
+1
assets/js/runtime~main.3a0237cb.js
··· 1 + (()=>{"use strict";var e,a,d,c,t,b,r,f={},o={};function n(e){var a=o[e];if(void 0!==a)return a.exports;var d=o[e]={id:e,loaded:!1,exports:{}};return f[e].call(d.exports,d,d.exports,n),d.loaded=!0,d.exports}n.m=f,n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a:a}),a},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(d,c){if(1&c&&(d=this(d)),8&c||"object"==typeof d&&d&&(4&c&&d.__esModule||16&c&&"function"==typeof d.then))return d;var t=Object.create(null);n.r(t);var b={};e=e||[null,a({}),a([]),a(a)];for(var r=2&c&&d;"object"==typeof r&&!~e.indexOf(r);r=a(r))Object.getOwnPropertyNames(r).forEach(e=>{b[e]=()=>d[e]});return b.default=()=>d,n.d(t,b),t},n.d=(e,a)=>{for(var d in a)n.o(a,d)&&!n.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((a,d)=>(n.f[d](e,a),a),[])),n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.u=e=>"assets/js/"+(({1165:"24a5b6e6",1214:"72d905a9",1355:"153c3ceb",151:"138e0e15",1771:"33c4ed3f",1970:"4f1fc707",1983:"14eb3368",2583:"fee59995",3151:"73287945",3174:"1fb61236",3385:"0ce74438",3396:"2ecbbad4",3424:"2a24ad03",3432:"5e95c892",3517:"30829cd8",3664:"7d837a1d",3693:"44b2647e",3748:"7b4f75c2",3989:"778b0fa6",4021:"b46f7c12",4328:"a16703cd",4330:"8b39be93",4477:"08938dd7",4854:"41cd626a",5112:"aba21aa0",5211:"a7bd4aaa",5230:"1a4e3797",5291:"3827a595",5658:"ad895e75",5757:"e82a470f",6286:"bf69edfb",6364:"425b8dd3",6374:"9bcab3db",6658:"9fd2a592",6707:"cdda7d53",6751:"812e048c",6922:"e6ac3f64",6963:"97d34c1a",7048:"17896441",7073:"e7a53bbd",7246:"5a378701",7365:"a7456010",7375:"d53edd15",7416:"dfa6d5b1",7544:"294f31e2",7556:"f18fd350",7631:"74876495",8005:"4edc808e",8016:"common",8051:"04d926a5",8054:"202c4968",8378:"c2e935db",8569:"4f7d60c5",862:"493c00ca",8656:"d3a18f08",8670:"498c77bd",8881:"a93ae359",8934:"925abbc7",8972:"91a78c9f",9116:"07b3b246",9318:"fa357871",9325:"094000d3",9621:"64837553",974:"af9480c3",9914:"a94703ab",9982:"5930ad03"})[e]||e)+"."+({1165:"cbb99879",1214:"340d823f",1355:"dfdb2a71",151:"2d4a661f",1622:"6a2ed701",1771:"38599907",1970:"e6532b9e",1983:"be6e6860",232:"bc6904b7",2583:"55240556",3151:"77055eea",3174:"997f1459",3385:"c335c326",3396:"30125fe5",3424:"1799cc3e",3432:"8168dcae",3517:"6aeb5c43",3664:"859e4da7",3693:"a253087b",3748:"b94d1530",3989:"6281df9d",4021:"948646c7",4328:"244bd985",4330:"ec2aa37b",4477:"cd3b7289",4854:"af102e25",5112:"b61173be",5211:"776d5eae",5230:"f5148830",5291:"d60e8b5d",5648:"419a85b0",5658:"031b9363",5671:"66c8d3a5",5757:"c703e7ea",6021:"71e4c2e2",6286:"8b21fae5",6364:"6bd58558",6374:"2c75e141",6658:"6c00e264",6707:"3046f063",6751:"33bd81e7",6922:"f3c52953",6963:"cdfa9a73",7048:"59cf19a7",7073:"a8e243cd",7246:"6c08a8bc",7365:"96dc3a78",7375:"c8bda851",7416:"81b1b4e7",7469:"a13f937e",7544:"059edf67",7556:"f6890af4",7631:"a1d9f251",7971:"bbd67a34",8005:"4b36b05e",8016:"98cd39de",8051:"bdf38d3d",8054:"36e03a3e",8378:"ab3b34d9",8513:"ce3f37bc",8569:"ab57f92e",862:"106ac761",8656:"469b9740",8670:"cf0fbab1",8689:"c103f25a",8881:"4e98bff1",8934:"fc0cfcb9",8972:"d7e6e1a2",9116:"de102eee",9151:"159fcd78",9318:"2218d927",9325:"7e10d90e",9621:"891b3708",974:"160bc425",9914:"0c803154",9982:"e3a61ab0"})[e]+".js",n.miniCssF=e=>""+e+".css",n.g=(()=>{if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}})(),n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},n.l=function(e,a,c,t){if(d[e])return void d[e].push(a);if(void 0!==c)for(var b,r,f=document.getElementsByTagName("script"),o=0;o<f.length;o++){var i=f[o];if(i.getAttribute("src")==e||i.getAttribute("data-webpack")=="my-website:"+c){b=i;break}}b||(r=!0,(b=document.createElement("script")).charset="utf-8",b.timeout=120,n.nc&&b.setAttribute("nonce",n.nc),b.setAttribute("data-webpack","my-website:"+c),b.src=e),d[e]=[a];var u=function(a,c){b.onerror=b.onload=null,clearTimeout(s);var t=d[e];if(delete d[e],b.parentNode&&b.parentNode.removeChild(b),t&&t.forEach(function(e){return e(c)}),a)return a(c)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:b}),12e4);b.onerror=u.bind(null,b.onerror),b.onload=u.bind(null,b.onload),r&&document.head.appendChild(b)},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),c=[],n.O=(e,a,d,t)=>{if(a){t=t||0;for(var b=c.length;b>0&&c[b-1][2]>t;b--)c[b]=c[b-1];c[b]=[a,d,t];return}for(var r=1/0,b=0;b<c.length;b++){for(var a=c[b][0],d=c[b][1],t=c[b][2],f=!0,o=0;o<a.length;o++)(!1&t||r>=t)&&Object.keys(n.O).every(e=>n.O[e](a[o]))?a.splice(o--,1):(f=!1,t<r&&(r=t));if(f){c.splice(b--,1);var i=d();void 0!==i&&(e=i)}}return e},n.p="/multi-scrobbler/",n.rv=()=>"1.4.6",n.gca=function(e){return e=({0x11113f9:"7048",0x3dd57b1:"9621",0x45e4909:"3151",0x476864f:"7631","138e0e15":"151","493c00ca":"862",af9480c3:"974","24a5b6e6":"1165","72d905a9":"1214","153c3ceb":"1355","33c4ed3f":"1771","4f1fc707":"1970","14eb3368":"1983",fee59995:"2583","1fb61236":"3174","0ce74438":"3385","2ecbbad4":"3396","2a24ad03":"3424","5e95c892":"3432","30829cd8":"3517","7d837a1d":"3664","44b2647e":"3693","7b4f75c2":"3748","778b0fa6":"3989",b46f7c12:"4021",a16703cd:"4328","8b39be93":"4330","08938dd7":"4477","41cd626a":"4854",aba21aa0:"5112",a7bd4aaa:"5211","1a4e3797":"5230","3827a595":"5291",ad895e75:"5658",e82a470f:"5757",bf69edfb:"6286","425b8dd3":"6364","9bcab3db":"6374","9fd2a592":"6658",cdda7d53:"6707","812e048c":"6751",e6ac3f64:"6922","97d34c1a":"6963",e7a53bbd:"7073","5a378701":"7246",a7456010:"7365",d53edd15:"7375",dfa6d5b1:"7416","294f31e2":"7544",f18fd350:"7556","4edc808e":"8005",common:"8016","04d926a5":"8051","202c4968":"8054",c2e935db:"8378","4f7d60c5":"8569",d3a18f08:"8656","498c77bd":"8670",a93ae359:"8881","925abbc7":"8934","91a78c9f":"8972","07b3b246":"9116",fa357871:"9318","094000d3":"9325",a94703ab:"9914","5930ad03":"9982"})[e]||e,n.p+n.u(e)},n.b=document.baseURI||self.location.href,t={2580:0,6212:0},n.f.j=function(e,a){var d=n.o(t,e)?t[e]:void 0;if(0!==d)if(d)a.push(d[2]);else if(/^(2580|6212)$/.test(e))t[e]=0;else{var c=new Promise((a,c)=>d=t[e]=[a,c]);a.push(d[2]=c);var b=n.p+n.u(e),r=Error();n.l(b,function(a){if(n.o(t,e)&&(0!==(d=t[e])&&(t[e]=void 0),d)){var c=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;r.message="Loading chunk "+e+" failed.\n("+c+": "+b+")",r.name="ChunkLoadError",r.type=c,r.request=b,d[1](r)}},"chunk-"+e,e)}},n.O.j=e=>0===t[e],b=(e,a)=>{var d,c,b=a[0],r=a[1],f=a[2],o=0;if(b.some(e=>0!==t[e])){for(d in r)n.o(r,d)&&(n.m[d]=r[d]);if(f)var i=f(n)}for(e&&e(a);o<b.length;o++)c=b[o],n.o(t,c)&&t[c]&&t[c][0](),t[c]=0;return n.O(i)},(r=self.webpackChunkmy_website=self.webpackChunkmy_website||[]).forEach(b.bind(null,0)),r.push=b.bind(null,r.push.bind(r))})();
+3 -3
category/development/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Development | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/category/development/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Development | Multi-Scrobbler"><meta data-rh="true" name="description" content="Developing for Multi-Scrobbler and tutorials"><meta data-rh="true" property="og:description" content="Developing for Multi-Scrobbler and tutorials"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/category/development/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/category/development/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/category/development/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Development","item":"https://foxxmd.github.io/multi-scrobbler/category/development"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
category/updating/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Updating | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/category/updating/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Updating | Multi-Scrobbler"><meta data-rh="true" name="description" content="Way to update Multi-Scrobbler"><meta data-rh="true" property="og:description" content="Way to update Multi-Scrobbler"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/category/updating/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/category/updating/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/category/updating/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Updating","item":"https://foxxmd.github.io/multi-scrobbler/category/updating"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+1 -1
client.json
··· 1 - {"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"$ref":"#/definitions/MalojaClientConfig"},{"$ref":"#/definitions/LastfmClientConfig"},{"$ref":"#/definitions/ListenBrainzClientConfig"},{"$ref":"#/definitions/KoitoClientConfig"},{"$ref":"#/definitions/TealClientConfig"},{"$ref":"#/definitions/RockSkyClientConfig"}],"definitions":{"MalojaClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/MalojaClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Maloja as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"MalojaClientConfig"},"MalojaClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaClientData"},"CommonClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonClientOptions"},"MatchLoggingOptions":{"type":"object","properties":{"onNoMatch":{"type":"boolean","description":"Log to DEBUG when a new track does NOT match an existing scrobble","default":false,"examples":[false]},"onMatch":{"type":"boolean","description":"Log to DEBUG when a new track DOES match an existing scrobble","default":false,"examples":[false]},"confidenceBreakdown":{"type":"boolean","description":"Include confidence breakdowns in track match logging, if applicable","default":false,"examples":[false]}},"description":"Scrobble matching (between new source track and existing client scrobbles) logging options. Used for debugging.","title":"MatchLoggingOptions"},"PlayTransformOptions":{"type":"object","properties":{"log":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["all"]}]},"preCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"},"compare":{"type":"object","properties":{"candidate":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"},"existing":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"}}},"postCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"}},"title":"PlayTransformOptions"},"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm)>":{"anyOf":[{"$ref":"#/definitions/PlayTransformPartsArray%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"}],"description":"Represents the weakly-defined user config. May be an array of parts or one parts object","title":"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm)>"},"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>":{"type":"array","items":{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},"title":"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>"},"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>":{"anyOf":[{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeMetadata"},"name":{"type":"string"},"score":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeUser"},"name":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string","enum":["native"]},"name":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"name":{"type":"string"}}},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{},"artists":{},"albumArtists":{},"album":{},"duration":{},"meta":{},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"}},"required":["type"]}],"title":"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>"},"WhenConditionsConfig":{"$ref":"#/definitions/WhenConditions%3Cstring%3E","title":"WhenConditionsConfig"},"WhenConditions<string>":{"type":"array","items":{"$ref":"#/definitions/WhenParts%3Cstring%3E"},"title":"WhenConditions<string>"},"WhenParts<string>":{"$ref":"#/definitions/PlayTransformPartsAtomic%3Cstring%3E","title":"WhenParts<string>"},"PlayTransformPartsAtomic<string>":{"type":"object","properties":{"title":{"type":"string"},"artists":{"type":"string"},"albumArtists":{"type":"string"},"album":{"type":"string"},"duration":{"type":"string"},"meta":{"type":"string"}},"title":"PlayTransformPartsAtomic<string>"},"Whennable":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"}},"title":"Whennable"},"FlowControlTerm":{"type":"string","enum":["continue","stop"],"title":"FlowControlTerm"},"StageTypeMetadata":{"type":"string","enum":["spotify","musicbrainz","native"],"title":"StageTypeMetadata"},"SearchAndReplaceTerm":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ConditionalSearchAndReplaceTerm"}],"title":"SearchAndReplaceTerm"},"ConditionalSearchAndReplaceTerm":{"$ref":"#/definitions/ConditionalSearchAndReplaceRegExp","title":"ConditionalSearchAndReplaceTerm"},"ConditionalSearchAndReplaceRegExp":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["replace","search"],"title":"ConditionalSearchAndReplaceRegExp"},"SearchAndReplaceRegExp":{"type":"object","properties":{"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["search","replace"],"title":"SearchAndReplaceRegExp"},"ExternalMetadataTerm":{"anyOf":[{"type":"boolean"},{"not":{}},{"$ref":"#/definitions/Whennable"}],"title":"ExternalMetadataTerm"},"StageTypeUser":{"type":"string","enum":["user"],"title":"StageTypeUser"},"LastfmClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LastfmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LastfmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using LastFM as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"LastfmClientConfig"},"LastfmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]}},"required":["apiKey","secret"],"title":"LastfmData"},"LastfmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LastfmClientOptions"},"ListenBrainzClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/ListenBrainzClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Listenbrainz as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"ListenBrainzClientConfig"},"ListenBrainzClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzClientData"},"KoitoClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/KoitoClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Koito as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"KoitoClientConfig"},"KoitoClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoClientData"},"TealClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/TealClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/TealClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Tealfm as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"TealClientConfig"},"TealClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\n\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\n\n* For **App Password** Auth - your email\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\n\nThis is created under https://bsky.app/settings/app-passwords\n\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"}},"required":["identifier"],"title":"TealClientData"},"TealClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealClientOptions"},"RockSkyClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/RockSkyClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/RockSkyClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using RockSky as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"RockSkyClientConfig"},"RockSkyClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\n\n* alice.bsky.social\n* foxxmd.com\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockSkyClientData"},"RockSkyClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockSkyClientOptions"}}} 1 + {"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"$ref":"#/definitions/MalojaClientConfig"},{"$ref":"#/definitions/LastfmClientConfig"},{"$ref":"#/definitions/LibrefmClientConfig"},{"$ref":"#/definitions/ListenBrainzClientConfig"},{"$ref":"#/definitions/KoitoClientConfig"},{"$ref":"#/definitions/TealClientConfig"},{"$ref":"#/definitions/RockSkyClientConfig"}],"definitions":{"MalojaClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/MalojaClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Maloja as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"MalojaClientConfig"},"MalojaClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaClientData"},"CommonClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonClientOptions"},"MatchLoggingOptions":{"type":"object","properties":{"onNoMatch":{"type":"boolean","description":"Log to DEBUG when a new track does NOT match an existing scrobble","default":false,"examples":[false]},"onMatch":{"type":"boolean","description":"Log to DEBUG when a new track DOES match an existing scrobble","default":false,"examples":[false]},"confidenceBreakdown":{"type":"boolean","description":"Include confidence breakdowns in track match logging, if applicable","default":false,"examples":[false]}},"description":"Scrobble matching (between new source track and existing client scrobbles) logging options. Used for debugging.","title":"MatchLoggingOptions"},"PlayTransformOptions":{"type":"object","properties":{"log":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["all"]}]},"preCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"},"compare":{"type":"object","properties":{"candidate":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"},"existing":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"}}},"postCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"}},"title":"PlayTransformOptions"},"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm)>":{"anyOf":[{"$ref":"#/definitions/PlayTransformPartsArray%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"}],"description":"Represents the weakly-defined user config. May be an array of parts or one parts object","title":"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm)>"},"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>":{"type":"array","items":{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},"title":"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>"},"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>":{"anyOf":[{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeMetadata"},"name":{"type":"string"},"stageHash":{"type":"string"},"score":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeUser"},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string","enum":["native"]},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"name":{"type":"string"}}},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{},"artists":{},"albumArtists":{},"album":{},"duration":{},"meta":{},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]}],"title":"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>"},"WhenConditionsConfig":{"$ref":"#/definitions/WhenConditions%3Cstring%3E","title":"WhenConditionsConfig"},"WhenConditions<string>":{"type":"array","items":{"$ref":"#/definitions/WhenParts%3Cstring%3E"},"title":"WhenConditions<string>"},"WhenParts<string>":{"$ref":"#/definitions/PlayTransformPartsAtomic%3Cstring%3E","title":"WhenParts<string>"},"PlayTransformPartsAtomic<string>":{"type":"object","properties":{"title":{"type":"string"},"artists":{"type":"string"},"albumArtists":{"type":"string"},"album":{"type":"string"},"duration":{"type":"string"},"meta":{"type":"string"}},"title":"PlayTransformPartsAtomic<string>"},"Whennable":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"}},"title":"Whennable"},"FlowControlTerm":{"type":"string","enum":["continue","stop"],"title":"FlowControlTerm"},"StageTypeMetadata":{"type":"string","enum":["spotify","musicbrainz","native"],"title":"StageTypeMetadata"},"SearchAndReplaceTerm":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ConditionalSearchAndReplaceTerm"}],"title":"SearchAndReplaceTerm"},"ConditionalSearchAndReplaceTerm":{"$ref":"#/definitions/ConditionalSearchAndReplaceRegExp","title":"ConditionalSearchAndReplaceTerm"},"ConditionalSearchAndReplaceRegExp":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["replace","search"],"title":"ConditionalSearchAndReplaceRegExp"},"SearchAndReplaceRegExp":{"type":"object","properties":{"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["search","replace"],"title":"SearchAndReplaceRegExp"},"ExternalMetadataTerm":{"anyOf":[{"type":"boolean"},{"not":{}},{"$ref":"#/definitions/Whennable"}],"title":"ExternalMetadataTerm"},"StageTypeUser":{"type":"string","enum":["user"],"title":"StageTypeUser"},"LastfmClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LastfmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LastfmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using LastFM as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"LastfmClientConfig"},"LastfmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm/Libre.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm/Libre.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]}},"required":["apiKey","secret"],"title":"LastfmData"},"LastfmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LastfmClientOptions"},"LibrefmClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/LibrefmData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/LibrefmClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Librefm as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"LibrefmClientConfig"},"LibrefmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"Optional Secret for Libre.fm account\n\nThis can be anything, or it will be generated by multi-scrobbler","examples":["anyValue"]},"secret":{"type":"string","description":"Optional Secret for Libre.fm account\n\nThis can be anything, or it will be generated by multi-scrobbler","examples":["anyValue"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"path":{"type":"string"},"urlBase":{"type":"string","description":"(Optional) The host and path prefix for your Libre.fm instance","default":"https://libre.fm/2.0/"},"redirectUri":{"type":"string","description":"Optional URI to use for callback. Specify this if callback should be different than the default. MUST have \"librefm/callback\" in the URL somewhere.","default":"http://localhost:9078/librefm/callback","examples":["http://localhost:9078/librefm/callback"]}},"title":"LibrefmData"},"LibrefmClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"LibrefmClientOptions"},"ListenBrainzClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/ListenBrainzClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Listenbrainz as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"ListenBrainzClientConfig"},"ListenBrainzClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzClientData"},"KoitoClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/KoitoClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/CommonClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Koito as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"KoitoClientConfig"},"KoitoClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoClientData"},"TealClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/TealClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/TealClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using Tealfm as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"TealClientConfig"},"TealClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\n\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\n\n* For **App Password** Auth - your email\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\n\nThis is created under https://bsky.app/settings/app-passwords\n\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"}},"required":["identifier"],"title":"TealClientData"},"TealClientOptions":{"type":"object","properties":{"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealClientOptions"},"RockSkyClientConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this client. Used with sources to restrict where scrobbles are sent.","examples":["MyConfig"]},"data":{"$ref":"#/definitions/RockSkyClientData","description":"Specific data required to configure this client"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"options":{"$ref":"#/definitions/RockSkyClientOptions"},"configureAs":{"type":"string","enum":["client","source"],"description":"Should always be `client` when using RockSky as a client","default":"client","examples":["client"]}},"required":["data","name"],"title":"RockSkyClientConfig"},"RockSkyClientData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\n\n* alice.bsky.social\n* foxxmd.com\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockSkyClientData"},"RockSkyClientOptions":{"type":"object","properties":{"nowPlaying":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"description":"Configure if this Client should report Now Playing from Sources that can scrobble to it\n\n* `true` (default) => Report Now Playing from any eligible Source. \n * If multiple Sources are Playing then reported Play is based on alphabetical order of Source names\n* `false` => Do not report Now Playing\n* `string` list => list of Source `names` that should be allowed to report Now Playing. Order of list determine priority of Play to Report.","default":true},"refreshEnabled":{"type":"boolean","description":"Try to get fresh scrobble history from client when tracks to be scrobbled are newer than the last scrobble found in client history","default":true,"examples":[true]},"refreshStaleAfter":{"type":"number","description":"Refresh scrobbled plays from upstream service if last refresh was at least X seconds ago\n\n**In most case this setting does NOT need to be changed.** The default value is sufficient for the majority of use-cases. Increasing this setting may increase upstream service load and slow down scrobbles.\n\nThis setting should only be changed in specific scenarios where MS is handling multiple \"relaying\" client-services (IE lfm -> lz -> lfm) and there is the potential for a client to be out of sync after more than a few seconds.","examples":[60],"default":60},"refreshMinInterval":{"type":"number","description":"Minimum time (milliseconds) required to pass before upstream scrobbles can be refreshed.\n\n**In most case this setting does NOT need to be changed.** This will always be equal to or smaller than `refreshStaleAfter`.","default":5000,"examples":[5000]},"refreshInitialCount":{"type":"number","description":"The number of tracks to retrieve on initial refresh (related to scrobbleBacklogCount). If not specified this is the maximum supported by the client in 1 API call."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"checkExistingScrobbles":{"type":"boolean","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.","default":true,"examples":[true]},"verbose":{"type":"object","properties":{"match":{"$ref":"#/definitions/MatchLoggingOptions"}},"description":"Options used for increasing verbosity of logging in MS (used for debugging)"},"deadLetterRetries":{"type":"number","description":"Number of times MS should automatically retry scrobbles in dead letter queue","default":1,"examples":[1]},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockSkyClientOptions"}}}
+5 -5
configuration/clients/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Overview | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Overview | Multi-Scrobbler"><meta data-rh="true" name="description" content="A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz..."><meta data-rh="true" property="og:description" content="A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz..."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--sublist menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Scrobble Clients</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Overview</h1></header><p>A <strong>Client</strong> is an application that stores the historical information about what songs you have played (scrobbles). Examples are <strong>Maloja, Last.fm, Listenbrainz</strong>...</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--sublist menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Scrobble Clients</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Overview</h1></header><p>A <strong>Client</strong> is an application that stores the historical information about what songs you have played (scrobbles). Examples are <strong>Maloja, Last.fm, Listenbrainz</strong>...</p> 16 16 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="clients">Clients<a href="#clients" class="hash-link" aria-label="Direct link to Clients" title="Direct link to Clients">​</a></h2> 17 - <table><thead><tr><th style="text-align:left">Name</th><th style="text-align:left">Now Playing</th></tr></thead><tbody><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/koito/">Koito</a></td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></td><td style="text-align:left">❌</td></tr></tbody></table> 17 + <table><thead><tr><th style="text-align:left">Name</th><th style="text-align:left">Now Playing</th></tr></thead><tbody><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/koito/">Koito</a></td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></td><td style="text-align:left">❌</td></tr></tbody></table> 18 18 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2> 19 19 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dead-scrobbles">Dead Scrobbles<a href="#dead-scrobbles" class="hash-link" aria-label="Direct link to Dead Scrobbles" title="Direct link to Dead Scrobbles">​</a></h3> 20 20 <p>If multi-scrobbler is unable to submit a scrobble to a Client then it places the scrobble into a queue which is retried every 5 minutes for a number of times before it gives up.</p>
+4 -4
configuration/clients/koito/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Koito | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/koito/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Koito | Multi-Scrobbler"><meta data-rh="true" name="description" content="To monitor and re-scrobble activity from a Koito account create a Koito (Source)"><meta data-rh="true" property="og:description" content="To monitor and re-scrobble activity from a Koito account create a Koito (Source)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/koito/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/koito/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/koito/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"},{"@type":"ListItem","position":3,"name":"Koito","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/koito"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Koito</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Koito</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To monitor and re-scrobble activity from a Koito account create a <a href="/multi-scrobbler/configuration/sources/koito-source/">Koito (Source)</a></p></div></div> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Koito</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Koito</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To monitor and re-scrobble activity from a Koito account create a <a href="/multi-scrobbler/configuration/sources/koito-source/">Koito (Source)</a></p></div></div> 16 16 <p>Setup a <a href="https://koito.io/guides/installation/" target="_blank" rel="noopener noreferrer">Koito server</a> if you have not already done this.</p> 17 17 <ul> 18 18 <li><a href="https://koito.io/guides/scrobbler/" target="_blank" rel="noopener noreferrer">Create (or get) an API Key</a>
+16 -11
configuration/clients/lastfm/index.html
··· 3 3 <head> 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 - <title data-rh="true">Last.fm | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Last.fm | Multi-Scrobbler"><meta data-rh="true" name="description" content="* To monitor and re-scrobble activity from your Last.fm account create a Last.fm (Source)"><meta data-rh="true" property="og:description" content="* To monitor and re-scrobble activity from your Last.fm account create a Last.fm (Source)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"},{"@type":"ListItem","position":3,"name":"Last.fm","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 6 + <title data-rh="true">Last.fm | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Last.fm | Multi-Scrobbler"><meta data-rh="true" name="description" content="* To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a Last.fm (Source)"><meta data-rh="true" property="og:description" content="* To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a Last.fm (Source)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"},{"@type":"ListItem","position":3,"name":"Last.fm","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Last.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Last.fm</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Users</div><div class="admonitionContent_BuS1"><ul> 16 - <li>To monitor and re-scrobble activity from your Last.fm account create a <a href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm (Source)</a></li> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Last.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Last.fm</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Users</div><div class="admonitionContent_BuS1"><ul> 16 + <li>To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a <a href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm (Source)</a></li> 17 17 <li>To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a <a href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Last.fm (Endpoint)</a></li> 18 18 </ul></div></div> 19 - <p><a href="https://www.last.fm/api/account/create" target="_blank" rel="noopener noreferrer">Register for an API account here.</a></p> 20 - <p>The Callback URL is actually specified by multi-scrobbler but to keep things consistent you should use</p> 21 - <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">http://localhost:9078/lastfm/callback</span><br></span></code></pre></div></div> 22 - <p>or replace <code>localhost:9078</code> with your own base URL.</p> 19 + <p>You will need a <a href="https://www.last.fm" target="_blank" rel="noopener noreferrer">Last.fm</a> account to use the Last.fm API.</p> 20 + <p>After creating your account, <a href="https://www.last.fm/api/account/create" target="_blank" rel="noopener noreferrer">register for an API account here.</a></p> 21 + <p>The callback URL in the API account form is not used, but to keep it consistent use the same value you set using the <a href="#callback-redirect-url">Callback/Redirect URL</a> section.</p> 22 + <p><strong>Take note of your API Key and Secret after account creation.</strong></p> 23 + <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="callbackredirect-url">Callback/Redirect URL<a href="#callbackredirect-url" class="hash-link" aria-label="Direct link to Callback/Redirect URL" title="Direct link to Callback/Redirect URL">​</a></h3> 24 + <p>The Redirect (Callback) URL is used to redirect your <strong>browser</strong> to multi-scrobbler after authentication has completed.</p> 25 + <p>So, the <em>base of the URL</em> you use should be the <em>same</em> as the URL you would use to navigate to the multi-scrobbler dashboard.</p> 26 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>If you can visit the multi-scrobbler dashboard by navigating to <a href="http://192.168.0.100:9078" target="_blank" rel="noopener noreferrer">http://192.168.0.100:9078</a> in your web browser...</p><p>then the ENV <code>LASTFM_REDIRECT_URI</code>, or <code>redirectUri</code> for last.fm/libre.fm json config, should be</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">http://192.168.0.100:9078/lastfm/callback</span><br></span></code></pre></div></div></div></div></details> 27 + <p>The Redirect URL can be explicitly specified in the configuration below, or by using the global <a href="/multi-scrobbler/configuration/#base-url">Base URL</a> setting.</p> 23 28 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2> 24 29 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 25 30 <table><thead><tr><th>Environmental Variable</th><th>Required?</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>LASTFM_API_KEY</code></td><td>Yes</td><td></td><td>Api Key from your API Account</td></tr><tr><td><code>LASTFM_SECRET</code></td><td>Yes</td><td></td><td>Shared secret from your API Account</td></tr><tr><td><code>LASTFM_REDIRECT_URI</code></td><td>No</td><td><code>http://localhost:9078/lastfm/callback</code></td><td>Url to use for authentication. Must include <code>lastfm/callback</code> somewhere in it</td></tr><tr><td><code>LASTFM_SESSION</code></td><td>No</td><td></td><td>Session id. Will be generated by authentication flow if not provided.</td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p> 26 31 <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/lastfm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFmClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;a89cba1569901a0671d5a9875fed4be1&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ec42e09d5ae0ee0f0816ca151008412a&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/lastfm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastfmClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 27 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFmClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;a89cba1569901a0671d5a9875fed4be1&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ec42e09d5ae0ee0f0816ca151008412a&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/lastfm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;lastfm&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastfmClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/lastfm.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/clients/koito/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Koito</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/clients/listenbrainz/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Listenbrainz</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 32 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFmClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;a89cba1569901a0671d5a9875fed4be1&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ec42e09d5ae0ee0f0816ca151008412a&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/lastfm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;lastfm&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastfmClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/lastfm.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/clients/koito/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Koito</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/clients/librefm/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Libre.fm</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#callbackredirect-url" class="table-of-contents__link toc-highlight">Callback/Redirect URL</a></li><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 28 33 </body> 29 34 </html>
+35
configuration/clients/librefm/index.html
··· 1 + <!doctype html> 2 + <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-configuration/clients/librefm" data-has-hydrated="false"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="generator" content="Docusaurus v3.8.1"> 6 + <title data-rh="true">Libre.fm | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/librefm/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Libre.fm | Multi-Scrobbler"><meta data-rh="true" name="description" content="* To monitor and re-scrobble activity from your Libre.fm account create a Libre.fm (Source)"><meta data-rh="true" property="og:description" content="* To monitor and re-scrobble activity from your Libre.fm account create a Libre.fm (Source)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/librefm/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/librefm/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/librefm/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"},{"@type":"ListItem","position":3,"name":"Libre.fm","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/librefm"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 + </head> 11 + <body class="navigation-with-keyboard"> 12 + <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 + <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 + </defs></svg> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Libre.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Libre.fm</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Users</div><div class="admonitionContent_BuS1"><ul> 16 + <li>To monitor and re-scrobble activity from your Libre.fm account create a <a href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm (Source)</a></li> 17 + </ul></div></div> 18 + <p>To use the official <a href="https://libre.fm/" target="_blank" rel="noopener noreferrer">Libre.fm</a> instance you will need an account. Or, you can run your own Libre.fm instance <a href="https://github.com/foocorp/gnu-fm" target="_blank" rel="noopener noreferrer">using the legacy source code</a>.</p> 19 + <p>No API account, <a href="https://github.com/libre-fm/developer/wiki/Libre.fm-fundamentals#api-keys" target="_blank" rel="noopener noreferrer">API Key, or Secret</a> is needed to use the Libre.fm API. Instead, use <strong>any values</strong> for API Key/Secret in the configuration. Authentication is done by allowing access from your account on redirect.</p> 20 + <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="callbackredirect-url">Callback/Redirect URL<a href="#callbackredirect-url" class="hash-link" aria-label="Direct link to Callback/Redirect URL" title="Direct link to Callback/Redirect URL">​</a></h3> 21 + <p>The Redirect (Callback) URL is used to redirect your <strong>browser</strong> to multi-scrobbler after authentication has completed.</p> 22 + <p>So, the <em>base of the URL</em> you use should be the <em>same</em> as the URL you would use to navigate to the multi-scrobbler dashboard.</p> 23 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>If you can visit the multi-scrobbler dashboard by navigating to <a href="http://192.168.0.100:9078" target="_blank" rel="noopener noreferrer">http://192.168.0.100:9078</a> in your web browser...</p><p>then the ENV <code>LIBREFM_REDIRECT_URI</code>, or <code>redirectUri</code> for libre.fm json config, should be</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">http://192.168.0.100:9078/librefm/callback</span><br></span></code></pre></div></div></div></div></details> 24 + <p>The Redirect URL can be explicitly specified in the configuration below, or by using the global <a href="/multi-scrobbler/configuration/#base-url">Base URL</a> setting.</p> 25 + <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="custom-librefm-instance">Custom Libre.fm instance<a href="#custom-librefm-instance" class="hash-link" aria-label="Direct link to Custom Libre.fm instance" title="Direct link to Custom Libre.fm instance">​</a></h3> 26 + <p>If you are <strong>not</strong> using the official Libre.fm instance then specify your custom instance using ENV <code>LIBREFM_URLBASE</code> or <code>urlBase</code> property in the <code>data</code> section in File/AIO config.</p> 27 + <p>The value should be <code>protocol://libre.tld/path/prefix</code> EX:</p> 28 + <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">https://my.cool.libre.com/2.0/</span><br></span></code></pre></div></div> 29 + <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2> 30 + <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 31 + <table><thead><tr><th>Environmental Variable</th><th>Required?</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>LIBREFM_ENABLE</code></td><td>No</td><td></td><td>Set to <code>true</code> to enable Libre.fm, if not using any of the below variables</td></tr><tr><td><code>LIBREFM_API_KEY</code></td><td>No</td><td><code>anything</code></td><td>Optional API Key</td></tr><tr><td><code>LIBREFM_SECRET</code></td><td>No</td><td><code>anything</code></td><td>Optional shared secret</td></tr><tr><td><code>LIBREFM_REDIRECT_URI</code></td><td>No</td><td><code>http://localhost:9078/librefm/callback</code></td><td>Url to use for authentication. Must include <code>librefm/callback</code> somewhere in it</td></tr><tr><td><code>LIBREFM_SESSION</code></td><td>No</td><td></td><td>Session id. Will be generated by authentication flow if not provided.</td></tr><tr><td><code>LIBREFM_URLBASE</code></td><td>No</td><td></td><td>Use for custom Libre.fm instance only. The host + path prefix EX <code>https://my.libre.example/2.0/</code></td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p> 32 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/librefm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLibreFmClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;anything&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;anything&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/librefm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLibrefmClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 33 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLibreFmClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;anything&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;anything&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/librefm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;librefm&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLibrefmClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/librefm.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/clients/lastfm/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Last.fm</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/clients/listenbrainz/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Listenbrainz</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#callbackredirect-url" class="table-of-contents__link toc-highlight">Callback/Redirect URL</a></li><li><a href="#custom-librefm-instance" class="table-of-contents__link toc-highlight">Custom Libre.fm instance</a></li><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 34 + </body> 35 + </html>
+5 -5
configuration/clients/listenbrainz/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Listenbrainz | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/listenbrainz/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Listenbrainz | Multi-Scrobbler"><meta data-rh="true" name="description" content="* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)"><meta data-rh="true" property="og:description" content="* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/listenbrainz/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/listenbrainz/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/listenbrainz/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"},{"@type":"ListItem","position":3,"name":"Listenbrainz","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/listenbrainz"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Listenbrainz</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Listenbrainz</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Users</div><div class="admonitionContent_BuS1"><ul> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Listenbrainz</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Listenbrainz</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Users</div><div class="admonitionContent_BuS1"><ul> 16 16 <li>To monitor and re-scrobble activity from a Listenbrainz account create a <a href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz (Source)</a></li> 17 17 <li>To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a <a href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li> 18 18 </ul></div></div> ··· 22 22 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 23 23 <table><thead><tr><th>Environmental Variable</th><th>Required?</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td>LZ_TOKEN</td><td>Yes</td><td></td><td>User token from your LZ profile</td></tr><tr><td>LZ_USER</td><td>Yes</td><td></td><td>Your LZ username</td></tr><tr><td>LZ_URL</td><td>No</td><td><a href="https://api.listenbrainz.org/" target="_blank" rel="noopener noreferrer">https://api.listenbrainz.org/</a></td><td>The base URL for the LZ server</td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p> 24 24 <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/listenbrainz.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;brainzClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;029b081ba-9156-4pe7-88e5-3be671f5ea2b&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;username&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;https://api.listenbrainz.org&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FListenbrainzClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 25 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;brainzClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;029b081ba-9156-4pe7-88e5-3be671f5ea2b&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;username&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;https://api.listenbrainz.org&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;listenbrainz&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FListenbrainzClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/listenbrainz.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/clients/lastfm/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Last.fm</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/clients/maloja/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Maloja</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 25 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;brainzClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;029b081ba-9156-4pe7-88e5-3be671f5ea2b&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;username&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;https://api.listenbrainz.org&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;listenbrainz&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FListenbrainzClientConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/clients/listenbrainz.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/clients/librefm/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Libre.fm</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/clients/maloja/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Maloja</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 26 26 </body> 27 27 </html>
+4 -4
configuration/clients/maloja/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Maloja | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/maloja/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Maloja | Multi-Scrobbler"><meta data-rh="true" name="description" content="Setup a Maloja server if you have not already done this."><meta data-rh="true" property="og:description" content="Setup a Maloja server if you have not already done this."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/maloja/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/maloja/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/maloja/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"},{"@type":"ListItem","position":3,"name":"Maloja","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/maloja"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Maloja</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Maloja</h1></header><p>Setup a <a href="https://github.com/krateng/maloja?tab=readme-ov-file#how-to-install" target="_blank" rel="noopener noreferrer">Maloja server</a> if you have not already done this.</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Maloja</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Maloja</h1></header><p>Setup a <a href="https://github.com/krateng/maloja?tab=readme-ov-file#how-to-install" target="_blank" rel="noopener noreferrer">Maloja server</a> if you have not already done this.</p> 16 16 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Maloja Setup Intructions</summary><div><div class="collapsibleContent_i85q"><p>Using Maloja&#x27;s example <code>docker-compose.yml</code>:</p><div class="docusaurus-theme-github-codeblock"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">~/malojaData/docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">loading</span><span class="token punctuation" style="color:rgb(248, 248, 242)">...</span><br></span></code></pre></div></div><div style="font-size:.9em;font-weight:600;color:#0E75DD;text-align:right;padding-bottom:13px;text-decoration:underline"><a href="https://github.com/krateng/maloja/blob/master/example-compose.yml" class="githubLink" style="margin:0 10px" target="_blank">View on GitHub</a></div></div><p>Uncomment <code>environment</code> and add <code>MALOJA_FORCE_PASSWORD=CHANGE_ME</code> to set an admin password</p><p>Start the container:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">~/malojaData</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose up </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><br></span></code></pre></div></div></div></div></details> 17 17 <ul> 18 18 <li>Navigate to the Admin Panel (Cog in upper-right corner) -&gt; API Keys (or at <a href="http://myMalojaServerIP/admin_apikeys" target="_blank" rel="noopener noreferrer">http://myMalojaServerIP/admin_apikeys</a>)<!-- -->
+6 -6
configuration/clients/rocksky/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Rocksky | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/rocksky/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Rocksky | Multi-Scrobbler"><meta data-rh="true" name="description" content="To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)"><meta data-rh="true" property="og:description" content="To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/rocksky/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/rocksky/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/rocksky/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"},{"@type":"ListItem","position":3,"name":"Rocksky","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/rocksky"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Rocksky</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Rocksky</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To monitor and re-scrobble activity <strong>from</strong> Rocksky create a <a href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky (Source)</a></p></div></div> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Rocksky</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Rocksky</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To monitor and re-scrobble activity <strong>from</strong> Rocksky create a <a href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky (Source)</a></p></div></div> 16 16 <p><a href="https://rocksky.app/" target="_blank" rel="noopener noreferrer"><strong>Rocksky</strong></a> is music tracking and discovery platform built on the AT Protocol (Bluesky).</p> 17 17 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>How does that work?</summary><div><div class="collapsibleContent_i85q"><p>The <a href="https://docs.bsky.app/docs/advanced-guides/atproto" target="_blank" rel="noopener noreferrer">AT Protocol</a> is a standard to allow different applications to share and interpret your social data.</p> 18 18 <p>Your data is stored in a personal <a href="https://atproto.com/guides/data-repos" target="_blank" rel="noopener noreferrer">repository</a> in a <a href="https://github.com/Bluesky-social/pds" target="_blank" rel="noopener noreferrer">PDS (Personal Data Server)</a>, which is data-type agnostic (it&#x27;s just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc...</p> ··· 27 27 </li> 28 28 <li>when accessing <!-- -->Rocksky<!-- -->, or another application that knows how to read it, your data is pulled from the repository to render the app</li> 29 29 </ul></div></div></details> 30 - <div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Public Data</div><div class="admonitionContent_BuS1"><p>The default Bluesky PDS is <strong>public</strong>, meaning your scrobbles are also public (read-only). This isn&#x27;t any different than using Last.fm or Listenbrainz, in terms of privacy.</p></div></div> 31 - <div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>No Scrobbling Guarantee</div><div class="admonitionContent_BuS1"><p>Rocksky <strong>does not guarantee</strong> that every scrobble you send will be persisted. Rocksky&#x27;s design goal is to store scrobbles with <strong>metdata-complete, 3rd party verifiable track information</strong> so that it can be a metadata-rich discovery platform, rather than an exhaustive scrobble data source-of-truth.</p><p>To do this it <em>asynchronously</em> matches your scrobble data against Musicbrainz&#x27;s and/or Spotify&#x27;s catalogs, <em>after the scrobble has been submitted.</em> <strong>If the scrobble does not end up matching then it is not persisted.</strong></p><p>If you need your scrobbles to be 100% captured then you should scrobble to an <em>additional</em> <a href="/multi-scrobbler/configuration/clients/">Scrobble Client</a>.</p></div></div> 30 + <details class="details_lb9f alert alert--info details_b_Ee alert--warning" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Your Data Is Public</summary><div><div class="collapsibleContent_i85q"><p>The default Bluesky PDS is <strong>public</strong>, meaning your scrobbles are also public (read-only). This isn&#x27;t any different than using Last.fm or Listenbrainz, in terms of privacy.</p></div></div></details> 31 + <details class="details_lb9f alert alert--info details_b_Ee alert--warning" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>No Scrobbling Guarantee</summary><div><div class="collapsibleContent_i85q"><p>Rocksky <strong>does not guarantee</strong> that every scrobble you send will be persisted. Rocksky&#x27;s design goal is to store scrobbles with <strong>metdata-complete, 3rd party verifiable track information</strong> so that it can be a metadata-rich discovery platform, rather than an exhaustive scrobble data source-of-truth.</p><p>To do this it <em>asynchronously</em> matches your scrobble data against Musicbrainz&#x27;s and/or Spotify&#x27;s catalogs, <em>after the scrobble has been submitted.</em> <strong>If the scrobble does not end up matching then it is not persisted.</strong></p><p>If you need your scrobbles to be 100% captured then you should scrobble to an <em>additional</em> <a href="/multi-scrobbler/configuration/clients/">Scrobble Client</a>.</p></div></div></details> 32 32 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="setup">Setup<a href="#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup">​</a></h2> 33 33 <p>You will need a <a href="https://bsky.app/" target="_blank" rel="noopener noreferrer">Bluesky</a> account to use Rocksky.</p> 34 34 <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Usage is adapted from <a href="https://docs.rocksky.app/migrating-to-rocksky-scrobble-api-957839m0" target="_blank" rel="noopener noreferrer">Rocksky docs</a> on <a href="https://docs.rocksky.app" target="_blank" rel="noopener noreferrer">docs.rocksky.app</a></p></div></div>
+7 -7
configuration/clients/tealfm/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Teal.fm | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/clients/tealfm/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Teal.fm | Multi-Scrobbler"><meta data-rh="true" name="description" content="To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source)"><meta data-rh="true" property="og:description" content="To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/tealfm/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/tealfm/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/clients/tealfm/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Clients","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/"},{"@type":"ListItem","position":3,"name":"Teal.fm","item":"https://foxxmd.github.io/multi-scrobbler/configuration/clients/tealfm"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Teal.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Teal.fm</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To monitor and re-scrobble activity from a ATProto Profile create a <a href="/multi-scrobbler/configuration/sources/tealfm-source/">teal.fm (Source)</a></p></div></div> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Collapse sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/clients/tealfm/">Teal.fm</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Expand sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/clients/"><span>Scrobble Clients</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Teal.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Teal.fm</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To monitor and re-scrobble activity from a ATProto Profile create a <a href="/multi-scrobbler/configuration/sources/tealfm-source/">teal.fm (Source)</a></p></div></div> 16 16 <p><a href="https://teal.fm/" target="_blank" rel="noopener noreferrer"><strong>teal.fm</strong></a> is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a <a href="https://github.com/Bluesky-social/pds" target="_blank" rel="noopener noreferrer">PDS (Personal Data Server)</a>.</p> 17 17 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>How does that work?</summary><div><div class="collapsibleContent_i85q"><p>The <a href="https://docs.bsky.app/docs/advanced-guides/atproto" target="_blank" rel="noopener noreferrer">AT Protocol</a> is a standard to allow different applications to share and interpret your social data.</p> 18 18 <p>Your data is stored in a personal <a href="https://atproto.com/guides/data-repos" target="_blank" rel="noopener noreferrer">repository</a> in a <a href="https://github.com/Bluesky-social/pds" target="_blank" rel="noopener noreferrer">PDS (Personal Data Server)</a>, which is data-type agnostic (it&#x27;s just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc...</p> ··· 27 27 </li> 28 28 <li>when accessing <!-- -->teal.fm<!-- -->, or another application that knows how to read it, your data is pulled from the repository to render the app</li> 29 29 </ul></div></div></details> 30 - <div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>The default Bluesky PDS is <strong>public</strong>, meaning your scrobbles are also public (read-only). This isn&#x27;t any different than using Last.fm or Listenbrainz, in terms of privacy.</p></div></div> 31 - <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><a href="https://notes.teal.fm/3lzlwe6puis2l" target="_blank" rel="noopener noreferrer">teal.fm is still in developement</a> and does not have a public website, yet.</p><p>To view your teal.fm scrobbles you can:</p><ul> 30 + <details class="details_lb9f alert alert--info details_b_Ee alert--warning" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Your Data Is Public</summary><div><div class="collapsibleContent_i85q"><p>The default Bluesky PDS is <strong>public</strong>, meaning your scrobbles are also public (read-only). This isn&#x27;t any different than using Last.fm or Listenbrainz, in terms of privacy.</p></div></div></details> 31 + <details class="details_lb9f alert alert--info details_b_Ee alert--secondary" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>teal.fm Is Still In Development</summary><div><div class="collapsibleContent_i85q"><p><a href="https://notes.teal.fm/3lzlwe6puis2l" target="_blank" rel="noopener noreferrer">teal.fm is still in developement</a> and does not have a public website, yet.</p><p>To view your teal.fm scrobbles you can:</p><ul> 32 32 <li>use <a href="https://wrapped.baileytownsend.dev/" target="_blank" rel="noopener noreferrer">wrapped.baileytownsend.dev</a> which gives a simple stats overview of your scrobbles</li> 33 33 <li>use <a href="https://tealfm-slice.wisp.place/" target="_blank" rel="noopener noreferrer">teal-slice.wisp.place</a> for a preview of teal.fm</li> 34 34 <li>use <a href="https://atproto.at" target="_blank" rel="noopener noreferrer">atproto.at</a> to view the raw data (convenience URLs are generated in multi-scrobbler for you to do this)</li> 35 - </ul></div></div> 35 + </ul></div></div></details> 36 36 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="setup">Setup<a href="#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup">​</a></h2> 37 37 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bluesky">Bluesky<a href="#bluesky" class="hash-link" aria-label="Direct link to Bluesky" title="Direct link to Bluesky">​</a></h4> 38 38 <ul>
+7 -7
configuration/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Overview | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Overview | Multi-Scrobbler"><meta data-rh="true" name="description" content="Check the FAQ if you have any issues after configuration!"><meta data-rh="true" property="og:description" content="Check the FAQ if you have any issues after configuration!"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> ··· 73 73 <li>Is replaced by the value of the Environmental Variable named <code>MY_ENV</code></li> 74 74 </ul> 75 75 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Given this <a href="/multi-scrobbler/configurations/clients/lastfm/#configuration">Last.fm</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File</a> config:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">lastfm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFmClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;[[MY_APIKEY]]&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;[[MY_SECRET]]&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/lastfm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>And these environmental variables, in this scenario set through <code>environment</code> in the <a href="/multi-scrobbler/quickstart/#create-docker-compose-file">docker compose installation</a>:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">MY_APIKEY=a89cba1569901a0671d5a9875fed4be1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">MY_SECRET=ec42e09d5ae0ee0f0816ca151008412a</span><br></span></code></pre></div></div><p>The resulting json multi-scrobbler would use:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">lastfm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFmClient&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;a89cba1569901a0671d5a9875fed4be1&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ec42e09d5ae0ee0f0816ca151008412a&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/lastfm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 76 - <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Caveats</div><div class="admonitionContent_BuS1"><ul> 76 + <details class="details_lb9f alert alert--info details_b_Ee alert--secondary" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Caveats</summary><div><div class="collapsibleContent_i85q"><ul> 77 77 <li>ENV variable names/interpolation keys are case-insensitive</li> 78 78 <li>Interpolation only works for <strong>string</strong> values within json. This cannot be used for numbers, booleans, objects, etc...</li> 79 - </ul></div></div> 80 - <div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Missing ENVS</div><div class="admonitionContent_BuS1"><p>Multi-scrobbler <strong>will not</strong> throw an error if the environmental value is not found. Instead, it will leave the string as-is and log a warning (<code>WARN</code> level) with the names of the missing environmental variable names like so:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">WARN : [App] [Sources] [spotify Secrets] Matched: None | Unmatched: SPOTIFY_SECRET</span><br></span></code></pre></div></div></div></div> 81 - <div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>ENV Name Collisions</div><div class="admonitionContent_BuS1"><p><strong>Verify that interpolation keys/environmental variable names you will use do not collide with existing ENV names used by multi-scrobbler.</strong> Use the docs search to verify the name you want to use is not already used elsewhere by multi-scrobbler.</p></div></div> 79 + </ul></div></div></details> 80 + <details class="details_lb9f alert alert--info details_b_Ee alert--warning" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Missing ENVs</summary><div><div class="collapsibleContent_i85q"><p>Multi-scrobbler <strong>will not</strong> throw an error if the environmental value is not found. Instead, it will leave the string as-is and log a warning (<code>WARN</code> level) with the names of the missing environmental variable names like so:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">WARN : [App] [Sources] [spotify Secrets] Matched: None | Unmatched: SPOTIFY_SECRET</span><br></span></code></pre></div></div></div></div></details> 81 + <details class="details_lb9f alert alert--info details_b_Ee alert--warning" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>ENV Name Collisions</summary><div><div class="collapsibleContent_i85q"><p><strong>Verify that interpolation keys/environmental variable names you will use do not collide with existing ENV names used by multi-scrobbler.</strong> Use the docs search to verify the name you want to use is not already used elsewhere by multi-scrobbler.</p></div></div></details> 82 82 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="application-options">Application Options<a href="#application-options" class="hash-link" aria-label="Direct link to Application Options" title="Direct link to Application Options">​</a></h2> 83 83 <p>These options affect multi-scrobbler&#x27;s behavior and are not specific to any source/client.</p> 84 84 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="base-url">Base URL<a href="#base-url" class="hash-link" aria-label="Direct link to Base URL" title="Direct link to Base URL">​</a></h3>
+3 -3
configuration/kitchensink/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Kitchen Sink | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/kitchensink/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Kitchen Sink | Multi-Scrobbler"><meta data-rh="true" name="description" content="Scenario:"><meta data-rh="true" property="og:description" content="Scenario:"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/kitchensink/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/kitchensink/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/kitchensink/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Kitchen Sink","item":"https://foxxmd.github.io/multi-scrobbler/configuration/kitchensink"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+7 -8
configuration/sources/azuracast/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Azuracast | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/azuracast/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Azuracast | Multi-Scrobbler"><meta data-rh="true" name="description" content="Azuracast may not correctly report track length or position. If this is the case you should reduce the &quot;listened to&quot; duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly."><meta data-rh="true" property="og:description" content="Azuracast may not correctly report track length or position. If this is the case you should reduce the &quot;listened to&quot; duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/azuracast/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/azuracast/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/azuracast/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Azuracast","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/azuracast"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Azuracast</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Azuracast</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Scrobbling Threshold</div><div class="admonitionContent_BuS1"><p>Azuracast may not correctly report track length or position. If this is the case you should reduce the &quot;listened to&quot; <strong>duration</strong> using <a href="/multi-scrobbler/configuration/sources/#scrobble-thresholds">Scrobble Thresholds</a> so that multi-scrobbler scrobbles correctly.</p></div></div> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Azuracast</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Azuracast</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Scrobbling Threshold</div><div class="admonitionContent_BuS1"><p>Azuracast may not correctly report track length or position. If this is the case you should reduce the &quot;listened to&quot; <strong>duration</strong> using <a href="/multi-scrobbler/configuration/sources/#scrobble-thresholds">Scrobble Thresholds</a> so that multi-scrobbler scrobbles correctly.</p></div></div> 16 16 <p>The Azuracast server should have <strong>Use High-Performance Now Playing Updates</strong> enabled in <em>Administration -&gt; System Settings</em></p> 17 17 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="url">URL<a href="#url" class="hash-link" aria-label="Direct link to URL" title="Direct link to URL">​</a></h4> 18 18 <p>The URL used by MS to connect to Azuracast has the syntax:</p> 19 19 <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">[ws|wss]://HOST:[PORT]</span><br></span></code></pre></div></div> 20 20 <p>MS will automatically add the path required for websockets, <a href="https://www.azuracast.com/docs/developers/now-playing-data/#websockets" target="_blank" rel="noopener noreferrer"><code>/api/live/nowplaying/websocket</code></a>, to your URL if none is provided. If you use a reverse proxy with a path-based URL or otherwise need a custom path to access the websockets path correctly then explicitly provide it. Examples:</p> 21 21 <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">URL From Config =&gt; MS Uses</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&#x27;ws://192.168.0.101&#x27; =&gt; ws://192.168.0.101/api/live/nowplaying/websocket</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&#x27;ws://azura.mydomain.com&#x27; =&gt; ws://azura.mydomain.com.com/api/live/nowplaying/websocket</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&#x27;wss://mydomain.com/custom/azura/ws&#x27; =&gt; wss://mydomain.com/custom/azura/ws</span><br></span></code></pre></div></div> 22 - <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="scrobble-behavior">Scrobble Behavior<a href="#scrobble-behavior" class="hash-link" aria-label="Direct link to Scrobble Behavior" title="Direct link to Scrobble Behavior">​</a></h4> 23 - <div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This <strong>Source</strong> supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to <strong>Should Scrobble</strong> found in each Source&#x27;s status card.</p> 22 + <details class="details_lb9f alert alert--info details_b_Ee alert--secondary" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Should Scrobble Behavior</summary><div><div class="collapsibleContent_i85q"><p>This <strong>Source</strong> supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to <strong>Should Scrobble</strong> found in each Source&#x27;s status card.</p> 24 23 <p>Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source&#x27;s <code>options</code> in <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">file or aio config</a>:</p> 25 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">azuracast.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// set to true to always scrobble automatically</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// set to false to never scrobble automatically</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;systemScrobble&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div> 24 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">azuracast.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// set to true to always scrobble automatically</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// set to false to never scrobble automatically</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;systemScrobble&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 26 25 <p>Multi-scrobbler will set the default <strong>scrobbling behavior</strong> based on if either of these settings is configured:</p> 27 26 <ul> 28 27 <li>live status (<code>AZURA_LIVE</code> or <code>monitorWhenLive</code>) or</li> ··· 31 30 <p>If either is configured then MS will automatically scrobble based on when these conditions are met.</p> 32 31 <p>If neither is configured automatic scrobble defaults to <strong>off</strong> and you should either manually initiate it or explicitly set the default behavior.</p> 33 32 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2> 34 - <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><table><thead><tr><th style="text-align:left">Environmental Variable</th><th style="text-align:left">Required?</th><th style="text-align:left">Default</th><th>Description</th></tr></thead><tbody><tr><td style="text-align:left"><code>AZ_URL</code></td><td style="text-align:left">Yes</td><td style="text-align:left"></td><td>Azuracast URL <em>without station name</em></td></tr><tr><td style="text-align:left"><code>AZ_STATION</code></td><td style="text-align:left">Yes</td><td style="text-align:left"></td><td>The station name shown on the public page</td></tr><tr><td style="text-align:left"><code>AZURA_LIVE</code></td><td style="text-align:left">No</td><td style="text-align:left">Yes</td><td>Only scrobble when station status is ONLINE</td></tr><tr><td style="text-align:left"><code>AZURA_LISTENERS_NUM</code></td><td style="text-align:left">No</td><td style="text-align:left"><code>true</code></td><td>Only scrobble if station has any listeners (<code>true</code>) or listeners are equal-to/greater-than <code>X</code></td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/azuracast.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;azuracast&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;azura&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ws://192.168.0.101&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;station&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;my-station-name&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;monitorWhenLive&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;monitorWhenListeners&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FAzuracastSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;azuracast&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;azura&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ws://192.168.0.101&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;station&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;my-station-name&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;monitorWhenLive&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;monitorWhenListeners&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FAzuracastSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/azuracast.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Overview</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/deezer/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Deezer</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#url" class="table-of-contents__link toc-highlight">URL</a></li><li><a href="#scrobble-behavior" class="table-of-contents__link toc-highlight">Scrobble Behavior</a></li><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 33 + <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><table><thead><tr><th style="text-align:left">Environmental Variable</th><th style="text-align:left">Required?</th><th style="text-align:left">Default</th><th>Description</th></tr></thead><tbody><tr><td style="text-align:left"><code>AZ_URL</code></td><td style="text-align:left">Yes</td><td style="text-align:left"></td><td>Azuracast URL <em>without station name</em></td></tr><tr><td style="text-align:left"><code>AZ_STATION</code></td><td style="text-align:left">Yes</td><td style="text-align:left"></td><td>The station name shown on the public page</td></tr><tr><td style="text-align:left"><code>AZURA_LIVE</code></td><td style="text-align:left">No</td><td style="text-align:left">Yes</td><td>Only scrobble when station status is ONLINE</td></tr><tr><td style="text-align:left"><code>AZURA_LISTENERS_NUM</code></td><td style="text-align:left">No</td><td style="text-align:left"><code>true</code></td><td>Only scrobble if station has any listeners (<code>true</code>) or listeners are equal-to/greater-than <code>X</code></td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/azuracast.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;azuracast&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;azura&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ws://192.168.0.101&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;station&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;my-station-name&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;monitorWhenLive&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;monitorWhenListeners&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FAzuracastSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;azuracast&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;azura&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ws://192.168.0.101&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;station&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;my-station-name&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;monitorWhenLive&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;monitorWhenListeners&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FAzuracastSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/azuracast.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Overview</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/deezer/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Deezer</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#url" class="table-of-contents__link toc-highlight">URL</a></li><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 35 34 </body> 36 35 </html>
+4 -4
configuration/sources/deezer/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Deezer | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/deezer/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Deezer | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer&#x27;s TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk."><meta data-rh="true" property="og:description" content="This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer&#x27;s TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/deezer/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/deezer/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/deezer/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Deezer","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/deezer"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Deezer</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Deezer</h1></header><div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Unofficial ARL</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Official API</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer&#x27;s TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk.</p></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This Source will work only if you have a <strong>Premium</strong> Deezer account.</p></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="retrieve-arl">Retrieve ARL<a href="#retrieve-arl" class="hash-link" aria-label="Direct link to Retrieve ARL" title="Direct link to Retrieve ARL">​</a></h3><p>The <code>arl</code> is a browser cookie that Deezer uses to store your login information. Multi-scrobbler uses the <code>arl</code> value to make authorized requests to Deezer&#x27;s API where it can retrieve listening history.</p><p><strong>After logging into Deezer</strong>, use one of the methods below to retrieve the <code>arl</code> cookie value:</p><div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Chrome</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Firefox</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><ol> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Deezer</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Deezer</h1></header><div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Unofficial ARL</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Official API</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer&#x27;s TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk.</p></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This Source will work only if you have a <strong>Premium</strong> Deezer account.</p></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="retrieve-arl">Retrieve ARL<a href="#retrieve-arl" class="hash-link" aria-label="Direct link to Retrieve ARL" title="Direct link to Retrieve ARL">​</a></h3><p>The <code>arl</code> is a browser cookie that Deezer uses to store your login information. Multi-scrobbler uses the <code>arl</code> value to make authorized requests to Deezer&#x27;s API where it can retrieve listening history.</p><p><strong>After logging into Deezer</strong>, use one of the methods below to retrieve the <code>arl</code> cookie value:</p><div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Chrome</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Firefox</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><ol> 16 16 <li>On deezer.com, press F12 to open the Developer Tools window.</li> 17 17 <li>Go to the Applications tab. Press the &#x27;&gt;&gt;&#x27; More tabs icon if it&#x27;s hidden.</li> 18 18 <li>Under the Cookies Filter, click deezer.com, then the text bar name <code>arl</code>.</li>
+4 -4
configuration/sources/google-cast/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Google Cast (Chromecast) | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/google-cast/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Google Cast (Chromecast) | Multi-Scrobbler"><meta data-rh="true" name="description" content="If your media device can be Cast to using this button Chromecast Icon on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play."><meta data-rh="true" property="og:description" content="If your media device can be Cast to using this button Chromecast Icon on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/google-cast/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/google-cast/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/google-cast/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Google Cast (Chromecast)","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/google-cast"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Google Cast (Chromecast)</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Google Cast (Chromecast)</h1></header><p>If your media device can be <strong>Cast</strong> to using this button <img decoding="async" loading="lazy" src="https://upload.wikimedia.org/wikipedia/commons/2/26/Chromecast_cast_button_icon.svg" alt="Chromecast Icon" class="img_ev3q"> on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play.</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Google Cast (Chromecast)</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Google Cast (Chromecast)</h1></header><p>If your media device can be <strong>Cast</strong> to using this button <img decoding="async" loading="lazy" src="https://upload.wikimedia.org/wikipedia/commons/2/26/Chromecast_cast_button_icon.svg" alt="Chromecast Icon" class="img_ev3q"> on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play.</p> 16 16 <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Google Cast support is <strong>experimental</strong>. You may experience crashes and errors while using this Source. Please open an issue if you experience problems and include all information detailed in the issue template to help debug your issue.</p></div></div> 17 17 <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This source relies on common, <strong>basic</strong> music data provided by the cast device which will always be less exhaustive than data parsed from full source integrations. If there is an existing <a href="/multi-scrobbler/configuration/sources/">Source</a> it is recommended to configure for it and blacklist the app on Google Cast, rather than relying solely on Google Cast for scrobbling.</p></div></div> 18 18 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="connecting-devices">Connecting Devices<a href="#connecting-devices" class="hash-link" aria-label="Direct link to Connecting Devices" title="Direct link to Connecting Devices">​</a></h4>
+8 -5
configuration/sources/icecast/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Icecast | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/icecast/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Icecast | Multi-Scrobbler"><meta data-rh="true" name="description" content="Parse metadata from any Icecast Station (streams) to use for scrobbling."><meta data-rh="true" property="og:description" content="Parse metadata from any Icecast Station (streams) to use for scrobbling."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/icecast/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/icecast/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/icecast/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Icecast","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/icecast"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Icecast</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Icecast</h1></header><p>Parse metadata from any Icecast Station (streams) to use for scrobbling.</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Icecast</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Icecast</h1></header><p>Parse metadata from any Icecast Station (streams) to use for scrobbling.</p> 16 16 <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>There is no standard format for presenting track information in an Icecast stream and the majority of streams that do include metadata only use a single string (<code>StreamTitle</code>) from which metadata can be parsed.</p><p>Multi-scrobbler will do its best to parse Artist/Album/Track information from this data but the quality and consistency for this is solely based on how the Icecast broadcaster chooses to format their tracks.</p></div></div> 17 - <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Scrobbling Behavior</div><div class="admonitionContent_BuS1"><p>Multi-scrobbler cannot automatically determine if you are listening to a Station. Therefore, <strong>automatic scrobbling for Icecast Sources is off by default.</strong></p><p>Use <a href="/multi-scrobbler/configuration/sources/#should-scrobble-behavior">Should Scrobble Behavior</a> to initiate scrobbling or configure automatic scrobble.</p></div></div> 17 + <p>Multi-scrobbler cannot automatically determine if you are listening to a Station. Therefore, <strong>automatic scrobbling for Icecast Sources is off by default.</strong> Use <strong>Should Scrobble Behavior</strong> to initiate scrobbling or configure automatic scrobble.</p> 18 + <details class="details_lb9f alert alert--info details_b_Ee alert--secondary" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Should Scrobble Behavior</summary><div><div class="collapsibleContent_i85q"><p>This <strong>Source</strong> supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to <strong>Should Scrobble</strong> found in each Source&#x27;s status card.</p> 19 + <p>Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source&#x27;s <code>options</code> in <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">file or aio config</a>:</p> 20 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">icecast.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// set to true to always scrobble automatically</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// set to false to never scrobble automatically</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;systemScrobble&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 18 21 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Scrobbling Threshold</div><div class="admonitionContent_BuS1"><p>Icecast does not report track lengths so multi-scrobbler cannot determine if it should scrobble based on percent played. You should instead set a shorter &quot;listened to&quot; <strong>duration</strong> using <a href="/multi-scrobbler/configuration/sources/#scrobble-thresholds">Scrobble Thresholds.</a></p></div></div> 19 22 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="url-and-sources">URL and Sources<a href="#url-and-sources" class="hash-link" aria-label="Direct link to URL and Sources" title="Direct link to URL and Sources">​</a></h4> 20 23 <p>The URL should be the URL you would use to stream audio.</p>
+5 -5
configuration/sources/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Overview | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Overview | Multi-Scrobbler"><meta data-rh="true" name="description" content="A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc..."><meta data-rh="true" property="og:description" content="A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc..."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--sublist menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Scrobble Sources</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Overview</h1></header><p>A <strong>Source</strong> is a data source that contains information about tracks you are playing like a music player or platform. Examples are <strong>Spotify, Jellyfin, Plex, Youtube Music, Airsonic</strong>, etc...</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--sublist menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Scrobble Sources</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Overview</h1></header><p>A <strong>Source</strong> is a data source that contains information about tracks you are playing like a music player or platform. Examples are <strong>Spotify, Jellyfin, Plex, Youtube Music, Airsonic</strong>, etc...</p> 16 16 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sources">Sources<a href="#sources" class="hash-link" aria-label="Direct link to Sources" title="Direct link to Sources">​</a></h2> 17 - <table><thead><tr><th style="text-align:left">Name</th><th style="text-align:left">Networking</th><th style="text-align:left">Scrobble SOT</th><th style="text-align:left"><a href="#multi-deviceuser">Multi Device/User</a></th><th style="text-align:left"><a href="#limiting-scrobble-destination">Scrobble Destination</a></th><th style="text-align:left"><a href="#scrobble-thresholds">Thresholds</a></th><th style="text-align:left"><a href="#should-scrobble-behavior">Should Scrobble</a></th></tr></thead><tbody><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Last.fm (Endpoint)</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=ingress#by-communication-method">Ingress</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/listenbrainz-source/">ListenBrainz</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">ListenBrainz (Endpoint)</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=ingress#by-communication-method">Ingress</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/plex/">Plex</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic-compatible APIs</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/tealfm-source/">teal.fm</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/webscrobbler/">WebScrobbler</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Ingress</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr></tbody></table> 17 + <table><thead><tr><th style="text-align:left">Name</th><th style="text-align:left">Networking</th><th style="text-align:left">Scrobble SOT</th><th style="text-align:left"><a href="#multi-deviceuser">Multi Device/User</a></th><th style="text-align:left"><a href="#limiting-scrobble-destination">Scrobble Destination</a></th><th style="text-align:left"><a href="#scrobble-thresholds">Thresholds</a></th><th style="text-align:left"><a href="#should-scrobble-behavior">Should Scrobble</a></th></tr></thead><tbody><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Last.fm (Endpoint)</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=ingress#by-communication-method">Ingress</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/listenbrainz-source/">ListenBrainz</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">ListenBrainz (Endpoint)</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=ingress#by-communication-method">Ingress</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/plex/">Plex</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic-compatible APIs</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/tealfm-source/">teal.fm</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/webscrobbler/">WebScrobbler</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Ingress</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=activity#by-data-source-of-truth">Activity</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td></tr><tr><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sourceComm=active#by-communication-method">Active</a></td><td style="text-align:left"><a href="/multi-scrobbler/configuration/sources/?sot=history#by-data-source-of-truth">History</a></td><td style="text-align:left">❌</td><td style="text-align:left">✅</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td></tr></tbody></table> 18 18 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2> 19 19 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="types-of-sources">Types of Sources<a href="#types-of-sources" class="hash-link" aria-label="Direct link to Types of Sources" title="Direct link to Types of Sources">​</a></h3> 20 20 <p>The Sources implemented in multi-scrobbler can be broken down into two categories.</p>
+6 -6
configuration/sources/jellyfin/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Jellyfin | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/jellyfin/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Jellyfin | Multi-Scrobbler"><meta data-rh="true" name="description" content="Must be using Jellyfin 10.7 or greater"><meta data-rh="true" property="og:description" content="Must be using Jellyfin 10.7 or greater"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/jellyfin/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/jellyfin/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/jellyfin/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Jellyfin","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/jellyfin"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Jellyfin</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Jellyfin</h1></header><p>Must be using Jellyfin 10.7 or greater</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Jellyfin</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Jellyfin</h1></header><p>Must be using Jellyfin 10.7 or greater</p> 16 16 <ul> 17 17 <li>Create an <strong>API Key</strong> for multi-scrobbler<!-- --> 18 18 <ul> ··· 23 23 </li> 24 24 </ul> 25 25 <p>It is <strong>recommended</strong> to use API Key + username but if you are not an admin for your Jellyfin instance you can also authenticate with your Jellyfin username and <strong>password.</strong></p> 26 - <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Important Defaults</div><div class="admonitionContent_BuS1"><p>By default...</p><ul> 26 + <details class="details_lb9f alert alert--info details_b_Ee alert--success" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Important Defaults</summary><div><div class="collapsibleContent_i85q"><p>By default...</p><ul> 27 27 <li>multi-scrobbler will <strong>only</strong> scrobble for the user authenticated with the API.<!-- --> 28 28 <ul> 29 29 <li>Allowed Users (<code>usersAllow</code> or <code>JELLYFIN_USERS_ALLOW</code>) are only necessary if you want to scrobble for additional users.</li> ··· 40 40 <li>To force multi-scrobbler to scrobble when media is detected as <strong>Unknown</strong> use <code>&quot;allowUnknown&quot;: true</code> in file/aio configuration.</li> 41 41 </ul> 42 42 </li> 43 - </ul></div></div> 43 + </ul></div></div></details> 44 44 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h4> 45 45 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><table><thead><tr><th>Environmental Variable</th><th>Required?</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>JELLYFIN_URL</code></td><td><strong>Yes</strong></td><td></td><td>The URL of the Jellyfin server IE <code>http://localhost:8096</code></td></tr><tr><td><code>JELLYFIN_USER</code></td><td><strong>Yes</strong></td><td></td><td>The user to authenticate with the API</td></tr><tr><td><code>JELLYFIN_APIKEY</code></td><td>No</td><td></td><td>The API Key to use for authentication <strong>(Must provide either apikey or password)</strong></td></tr><tr><td><code>JELLYFIN_PASSWORD</code></td><td>No</td><td></td><td>The password of the user to authenticate for. <strong>(Must provide either apikey or password)</strong></td></tr><tr><td><code>JELLYFIN_USERS_ALLOW</code></td><td>No</td><td></td><td>Comma-separated list of usernames (from Jellyfin) to scrobble for</td></tr><tr><td><code>JELLYFIN_USERS_BLOCK</code></td><td>No</td><td></td><td>Comma-separated list of usernames (from Jellyfin) to disallow scrobble for</td></tr><tr><td><code>JELLYFIN_DEVICES_ALLOW</code></td><td>No</td><td></td><td>Comma-separated list of devices to scrobble from</td></tr><tr><td><code>JELLYFIN_DEVICES_BLOCK</code></td><td>No</td><td></td><td>Comma-separated list of devices to disallow scrobbles from</td></tr><tr><td><code>JELLYFIN_LIBRARIES_ALLOW</code></td><td>No</td><td></td><td>Comma-separated list of libraries to allow scrobbles from</td></tr><tr><td><code>JELLYFIN_LIBRARIES_BLOCK</code></td><td>No</td><td></td><td>Comma-separated list of libraries to disallow scrobbles from</td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/jellyfin.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyJellyfin&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:8096&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;user&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;c9fae8756fbf481ebd9c5bb56bd6540c&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// everything below is optional</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;SomeOtherUser&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;AnotherUser&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;firefox&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;google-home&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;GoodMusic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;BadMusic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;additionalAllowedLibraryTypes&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicvideos&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;allowUnknown&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logPayload&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logFilterFailure&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;debug&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FJellyApiSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyJellyfin&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:8096&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;user&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;c9fae8756fbf481ebd9c5bb56bd6540c&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;SomeOtherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;AnotherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;firefox&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;google-home&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;GoodMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;BadMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;additionalAllowedLibraryTypes&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicvideos&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;allowUnknown&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logPayload&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logFilterFailure&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;debug&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;jellyfin&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FJellyApiSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/jellyfin.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/icecast/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Icecast</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/jriver/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">JRiver</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 46 46 </body>
+4 -4
configuration/sources/jriver/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">JRiver | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/jriver/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="JRiver | Multi-Scrobbler"><meta data-rh="true" name="description" content="In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can can be in the JRiver GUI:"><meta data-rh="true" property="og:description" content="In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can can be in the JRiver GUI:"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/jriver/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/jriver/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/jriver/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"JRiver","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/jriver"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">JRiver</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>JRiver</h1></header><p>In order for multi-scrobbler to communicate with JRiver you must have <a href="https://wiki.jriver.com/index.php/Web_Service_Interface#Documentation_of_Functions" target="_blank" rel="noopener noreferrer">Web Server Interface</a> enabled. This can can be in the JRiver GUI:</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">JRiver</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>JRiver</h1></header><p>In order for multi-scrobbler to communicate with JRiver you must have <a href="https://wiki.jriver.com/index.php/Web_Service_Interface#Documentation_of_Functions" target="_blank" rel="noopener noreferrer">Web Server Interface</a> enabled. This can can be in the JRiver GUI:</p> 16 16 <ul> 17 17 <li>Tools -&gt; Options -&gt; Media Network<!-- --> 18 18 <ul>
+4 -4
configuration/sources/kodi/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Kodi | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/kodi/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Kodi | Multi-Scrobbler"><meta data-rh="true" name="description" content="In order for multi-scrobbler to communicate with Kodi you must have the Web Interface enabled. This can be done in the Kodi GUI:"><meta data-rh="true" property="og:description" content="In order for multi-scrobbler to communicate with Kodi you must have the Web Interface enabled. This can be done in the Kodi GUI:"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/kodi/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/kodi/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/kodi/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Kodi","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/kodi"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Kodi</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Kodi</h1></header><p>In order for multi-scrobbler to communicate with Kodi you must have the <a href="https://kodi.wiki/view/Web_interface" target="_blank" rel="noopener noreferrer">Web Interface</a> enabled. This can be done in the Kodi GUI:</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Kodi</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Kodi</h1></header><p>In order for multi-scrobbler to communicate with Kodi you must have the <a href="https://kodi.wiki/view/Web_interface" target="_blank" rel="noopener noreferrer">Web Interface</a> enabled. This can be done in the Kodi GUI:</p> 16 16 <ul> 17 17 <li>Settings -&gt; Services -&gt; Control<!-- --> 18 18 <ul>
+4 -4
configuration/sources/koito-source/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Koito | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/koito-source/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Koito | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source monitors a Koito account&#x27;s scrobble history and then re-scrobbles discovered tracks to configured Clients."><meta data-rh="true" property="og:description" content="This Source monitors a Koito account&#x27;s scrobble history and then re-scrobbles discovered tracks to configured Clients."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/koito-source/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/koito-source/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/koito-source/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Koito","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/koito-source"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Koito</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Koito</h1></header><p>This Source monitors a Koito account&#x27;s scrobble history and then re-scrobbles discovered tracks to configured <a href="/multi-scrobbler/configuration/clients/">Clients.</a></p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Koito</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Koito</h1></header><p>This Source monitors a Koito account&#x27;s scrobble history and then re-scrobbles discovered tracks to configured <a href="/multi-scrobbler/configuration/clients/">Clients.</a></p> 16 16 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To <em>scrobble to</em> a Koito server, create a <a href="/multi-scrobbler/configuration/clients/koito/">Koito (Client)</a></p></div></div> 17 17 <p>See the <a href="/multi-scrobbler/configuration/clients/koito/">Koito (Client)</a> configuration for general setup. The only difference for <strong>Source</strong> configuration:</p> 18 18 <ul>
+5 -5
configuration/sources/lastfm-endpoint/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Lastfm (Endpoint) | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-endpoint/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Lastfm (Endpoint) | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server."><meta data-rh="true" property="og:description" content="This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-endpoint/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-endpoint/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-endpoint/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Lastfm (Endpoint)","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-endpoint"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Lastfm (Endpoint)</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Lastfm (Endpoint)</h1></header><p>This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server.</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Lastfm (Endpoint)</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Lastfm (Endpoint)</h1></header><p>This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server.</p> 16 16 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 17 17 <li>To <strong>scrobble to</strong> Last.fm, create a <a href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm (Client)</a></li> 18 18 <li>To monitor and re-scrobble activity from your Last.fm account, create a <a href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm (Source)</a></li> ··· 28 28 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 29 29 <table><thead><tr><th style="text-align:left">Environmental Variable</th><th style="text-align:left">Required?</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td style="text-align:left"><code>LFMENDPOINT_ENABLE</code></td><td style="text-align:left">No</td><td></td><td>Use LFM Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs</td></tr><tr><td style="text-align:left"><code>LFM_SLUG</code></td><td style="text-align:left">No</td><td></td><td>(Optional) The URL suffix to use for accepting LFM scrobbles</td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p> 30 30 <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/endpointlfm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLfm&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;slug&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;mySlug&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastFMEndpointSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 31 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLfm&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;slug&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;mySlug&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;endpointlfm&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastFMEndpointSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/lastfm-endpoint.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/koito-source/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Koito</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/lastfm-source/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Lastfm</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#url" class="table-of-contents__link toc-highlight">URL</a></li><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 31 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLfm&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;slug&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;mySlug&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;endpointlfm&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastFMEndpointSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/lastfm-endpoint.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/koito-source/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Koito</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/lastfm-source/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Last.fm</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#url" class="table-of-contents__link toc-highlight">URL</a></li><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 32 32 </body> 33 33 </html>
+7 -7
configuration/sources/lastfm-source/index.html
··· 3 3 <head> 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 - <title data-rh="true">Lastfm | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Lastfm | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients."><meta data-rh="true" property="og:description" content="This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Lastfm","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 6 + <title data-rh="true">Last.fm | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Last.fm | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients."><meta data-rh="true" property="og:description" content="This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Last.fm","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Lastfm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Lastfm</h1></header><p>This Source <strong>monitors your Last.fm scrobble history</strong> and re-scrobbles new activity to configured <a href="/multi-scrobbler/configuration/clients/">Clients.</a></p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Last.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Last.fm</h1></header><p>This Source <strong>monitors your Last.fm scrobble history</strong> and re-scrobbles new activity to configured <a href="/multi-scrobbler/configuration/clients/">Clients.</a></p> 16 16 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 17 - <li>To <strong>scrobble to</strong> Last.fm, create a <a href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm (Client)</a></li> 17 + <li>To <strong>scrobble to</strong> Last.fm/Libre.fm, create a <a href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm (Client)</a></li> 18 18 <li>To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a <a href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Last.fm (Endpoint)</a></li> 19 19 </ul></div></div> 20 20 <p>To configure this Source use the same registration instructions and configuration data shown in <a href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm (Client)</a> with the difference being <code>&quot;configureAs&quot;: &quot;source&quot;</code> defined in the File/AIO configuration below.</p> ··· 22 22 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 23 23 <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>You cannot use ENV variables shown in the <a href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm Client config</a> -- multi-scrobbler assumes Last.fm ENVs are always used for the <strong>client</strong> configuration. You must use the <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File or AIO</a> config to setup Last.fm as a Source.</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p> 24 24 <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/lastfm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFmSource&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;source&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;a89cba1569901a0671d5a9875fed4be1&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ec42e09d5ae0ee0f0816ca151008412a&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/lastfm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastfmSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 25 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFmSource&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;source&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;a89cba1569901a0671d5a9875fed4be1&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ec42e09d5ae0ee0f0816ca151008412a&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/lastfm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;lastfm&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastfmSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/lastfm-source.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Lastfm (Endpoint)</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Listenbrainz (Endpoint)</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 25 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFmSource&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;source&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;a89cba1569901a0671d5a9875fed4be1&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ec42e09d5ae0ee0f0816ca151008412a&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/lastfm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;lastfm&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLastfmSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/lastfm-source.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Lastfm (Endpoint)</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/librefm-source/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Libre.fm</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 26 26 </body> 27 27 </html>
+26
configuration/sources/librefm-source/index.html
··· 1 + <!doctype html> 2 + <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-configuration/sources/librefm-source" data-has-hydrated="false"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="generator" content="Docusaurus v3.8.1"> 6 + <title data-rh="true">Libre.fm | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/librefm-source/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Libre.fm | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source monitors your Libre.fm scrobble history and re-scrobbles new activity to configured Clients."><meta data-rh="true" property="og:description" content="This Source monitors your Libre.fm scrobble history and re-scrobbles new activity to configured Clients."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/librefm-source/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/librefm-source/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/librefm-source/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Libre.fm","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/librefm-source"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 + </head> 11 + <body class="navigation-with-keyboard"> 12 + <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 + <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 + </defs></svg> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Libre.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Libre.fm</h1></header><p>This Source <strong>monitors your Libre.fm scrobble history</strong> and re-scrobbles new activity to configured <a href="/multi-scrobbler/configuration/clients/">Clients.</a></p> 16 + <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 17 + <li>To <strong>scrobble to</strong> Libre.fm, create a <a href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm (Client)</a></li> 18 + </ul></div></div> 19 + <p>To configure this Source use the same registration instructions and configuration data shown in <a href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm (Client)</a> with the difference being <code>&quot;configureAs&quot;: &quot;source&quot;</code> defined in the File/AIO configuration below.</p> 20 + <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2> 21 + <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 22 + <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>You cannot use ENV variables shown in the <a href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm Client config</a> -- multi-scrobbler assumes Libre.fm ENVs are always used for the <strong>client</strong> configuration. You must use the <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File or AIO</a> config to setup Libre.fm as a Source.</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p> 23 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/librefm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLibreFmSource&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;source&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;anything&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;anything&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/librefm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLibrefmSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 24 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLibreFmSource&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;source&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apiKey&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;anything&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;secret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;anything&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;redirectUri&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://localhost:9078/librefm/callback&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;librefm&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FLibrefmSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/librefm-source.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/lastfm-source/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Last.fm</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Listenbrainz (Endpoint)</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 25 + </body> 26 + </html>
+5 -5
configuration/sources/listenbrainz-endpoint/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Listenbrainz (Endpoint) | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-endpoint/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Listenbrainz (Endpoint) | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server."><meta data-rh="true" property="og:description" content="This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-endpoint/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-endpoint/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-endpoint/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Listenbrainz (Endpoint)","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-endpoint"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Listenbrainz (Endpoint)</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Listenbrainz (Endpoint)</h1></header><p>This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server.</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Listenbrainz (Endpoint)</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Listenbrainz (Endpoint)</h1></header><p>This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server.</p> 16 16 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 17 17 <li>To <strong>scrobble to</strong> Listenbrainz, create a <a href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz (Client)</a></li> 18 18 <li>To monitor and re-scrobble activity from your Listenbrainz account, create a <a href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz (Source)</a></li> ··· 33 33 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 34 34 <table><thead><tr><th style="text-align:left">Environmental Variable</th><th style="text-align:left">Required?</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td style="text-align:left"><code>LZENDPOINT_ENABLE</code></td><td style="text-align:left">No</td><td></td><td>Use LZ Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs</td></tr><tr><td style="text-align:left"><code>LZE_TOKEN</code></td><td style="text-align:left">No</td><td></td><td>LZ &quot;Authentication Token&quot; you provided to the scrobbling application</td></tr><tr><td style="text-align:left"><code>LZE_SLUG</code></td><td style="text-align:left">No</td><td></td><td>(Optional) The URL suffix to use for accepting LZ scrobbles</td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p> 35 35 <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/endpointlz.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myToken&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FListenbrainzEndpointSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 36 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myToken&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;endpointlz&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FListenbrainzEndpointSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/listenbrainz-endpoint.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/lastfm-source/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Lastfm</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/listenbrainz-source/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Listenbrainz</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#url" class="table-of-contents__link toc-highlight">URL</a><ul><li><a href="#navidrome" class="table-of-contents__link toc-highlight">Navidrome</a></li></ul></li><li><a href="#token" class="table-of-contents__link toc-highlight">Token</a></li><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 36 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myToken&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;endpointlz&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FListenbrainzEndpointSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/listenbrainz-endpoint.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/librefm-source/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Libre.fm</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/listenbrainz-source/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Listenbrainz</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#url" class="table-of-contents__link toc-highlight">URL</a><ul><li><a href="#navidrome" class="table-of-contents__link toc-highlight">Navidrome</a></li></ul></li><li><a href="#token" class="table-of-contents__link toc-highlight">Token</a></li><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 37 37 </body> 38 38 </html>
+4 -4
configuration/sources/listenbrainz-source/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Listenbrainz | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-source/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Listenbrainz | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source monitors a Listenbrainz account&#x27;s scrobble history and then re-scrobbles discovered tracks to configured clients."><meta data-rh="true" property="og:description" content="This Source monitors a Listenbrainz account&#x27;s scrobble history and then re-scrobbles discovered tracks to configured clients."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-source/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-source/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-source/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Listenbrainz","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-source"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Listenbrainz</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Listenbrainz</h1></header><p>This Source monitors a Listenbrainz account&#x27;s scrobble history and then re-scrobbles discovered tracks to configured clients.</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Listenbrainz</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Listenbrainz</h1></header><p>This Source monitors a Listenbrainz account&#x27;s scrobble history and then re-scrobbles discovered tracks to configured clients.</p> 16 16 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 17 17 <li>To <strong>scrobble to</strong> a Listenbrainz server, create a <a href="/multi-scrobbler/configuration/clients/listenbrainz/">Listenbrainz (Client)</a></li> 18 18 <li>To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a <a href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li>
+4 -4
configuration/sources/maloja/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Maloja | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/maloja/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Maloja | Multi-Scrobbler"><meta data-rh="true" name="description" content="To scrobble to a Maloja server, create a Maloja (Client)"><meta data-rh="true" property="og:description" content="To scrobble to a Maloja server, create a Maloja (Client)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/maloja/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/maloja/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/maloja/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Maloja","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/maloja"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Maloja</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Maloja</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To <em>scrobble to</em> a Maloja server, create a <a href="/multi-scrobbler/configuration/clients/maloja/">Maloja (Client)</a></p></div></div> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Maloja</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Maloja</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><p>To <em>scrobble to</em> a Maloja server, create a <a href="/multi-scrobbler/configuration/clients/maloja/">Maloja (Client)</a></p></div></div> 16 16 <p>See the <a href="/multi-scrobbler/configuration/clients/maloja/">Maloja (Client)</a> configuration for general setup. The only difference for <strong>Source</strong> configuration:</p> 17 17 <ul> 18 18 <li>Cannot be setup with ENV config</li>
+4 -4
configuration/sources/mopidy/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Mopidy | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mopidy/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Mopidy | Multi-Scrobbler"><meta data-rh="true" name="description" content="Mopidy is a headless music server that supports playing music from many standard and non-standard sources such as Pandora, Bandcamp, and Tunein."><meta data-rh="true" property="og:description" content="Mopidy is a headless music server that supports playing music from many standard and non-standard sources such as Pandora, Bandcamp, and Tunein."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mopidy/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mopidy/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mopidy/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Mopidy","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/mopidy"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Mopidy</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Mopidy</h1></header><p>Mopidy is a headless music server that supports playing music from many <a href="https://mopidy.com/ext/" target="_blank" rel="noopener noreferrer">standard and non-standard sources such as Pandora, Bandcamp, and Tunein.</a></p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Mopidy</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Mopidy</h1></header><p>Mopidy is a headless music server that supports playing music from many <a href="https://mopidy.com/ext/" target="_blank" rel="noopener noreferrer">standard and non-standard sources such as Pandora, Bandcamp, and Tunein.</a></p> 16 16 <p>multi-scrobbler can scrobble tracks played from any Mopidy backend source, regardless of where you listen to them.</p> 17 17 <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>You must have <a href="https://mopidy.com/ext/http" target="_blank" rel="noopener noreferrer">Mopidy-HTTP extension</a> enabled for this integration to work.</p></div></div> 18 18 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="url">URL<a href="#url" class="hash-link" aria-label="Direct link to URL" title="Direct link to URL">​</a></h4>
+4 -4
configuration/sources/mpd/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">MPD (Music Player Daemon) | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpd/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="MPD (Music Player Daemon) | Multi-Scrobbler"><meta data-rh="true" name="description" content="MS communicates with MPD using the TCP client connection."><meta data-rh="true" property="og:description" content="MS communicates with MPD using the TCP client connection."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpd/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpd/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpd/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"MPD (Music Player Daemon)","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpd"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">MPD (Music Player Daemon)</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>MPD (Music Player Daemon)</h1></header><p>MS communicates with MPD using the <a href="https://mpd.readthedocs.io/en/stable/user.html#client-connections" target="_blank" rel="noopener noreferrer">TCP client connection.</a></p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">MPD (Music Player Daemon)</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>MPD (Music Player Daemon)</h1></header><p>MS communicates with MPD using the <a href="https://mpd.readthedocs.io/en/stable/user.html#client-connections" target="_blank" rel="noopener noreferrer">TCP client connection.</a></p> 16 16 <p>You should uncomment/create the following settings in your mpd config:</p> 17 17 <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">bind_to_address &quot;any&quot; # or a specific ipv4/v6 address</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">port &quot;6600&quot;</span><br></span></code></pre></div></div> 18 18 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2>
+4 -4
configuration/sources/mpris/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">MPRIS | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpris/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="MPRIS | Multi-Scrobbler"><meta data-rh="true" name="description" content="MPRIS is a standard interface for communicating with Music Players on linux operating systems."><meta data-rh="true" property="og:description" content="MPRIS is a standard interface for communicating with Music Players on linux operating systems."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpris/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpris/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpris/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"MPRIS","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpris"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">MPRIS</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>MPRIS</h1></header><p><a href="https://specifications.freedesktop.org/mpris-spec/latest" target="_blank" rel="noopener noreferrer">MPRIS</a> is a standard interface for communicating with Music Players on <strong>linux operating systems.</strong></p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">MPRIS</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>MPRIS</h1></header><p><a href="https://specifications.freedesktop.org/mpris-spec/latest" target="_blank" rel="noopener noreferrer">MPRIS</a> is a standard interface for communicating with Music Players on <strong>linux operating systems.</strong></p> 16 16 <p>If you run Linux and have a notification tray that shows what media you are listening to, you likely have access to MPRIS.</p> 17 17 <p><img decoding="async" loading="lazy" alt="Notification Tray" src="/multi-scrobbler/assets/images/mpris-e95a64bfe1b46a618dc43729685d6114.jpg" width="542" height="592" class="img_ev3q"></p> 18 18 <p>multi-scrobbler can listen to this interface and scrobble tracks played by <strong>any media player</strong> that communicates to the operating system with MPRIS.</p>
+4 -4
configuration/sources/musikcube/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Musikcube | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/musikcube/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Musikcube | Multi-Scrobbler"><meta data-rh="true" name="description" content="In order to use Musikcube configure it to accept websocket connections in server setup:"><meta data-rh="true" property="og:description" content="In order to use Musikcube configure it to accept websocket connections in server setup:"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/musikcube/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/musikcube/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/musikcube/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Musikcube","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/musikcube"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Musikcube</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Musikcube</h1></header><p>In order to use <a href="https://musikcube.com" target="_blank" rel="noopener noreferrer">Musikcube</a> configure it to accept <a href="https://github.com/clangen/musikcube/wiki/remote-api-documentation" target="_blank" rel="noopener noreferrer">websocket connections</a> in <strong>server setup</strong>:</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Musikcube</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Musikcube</h1></header><p>In order to use <a href="https://musikcube.com" target="_blank" rel="noopener noreferrer">Musikcube</a> configure it to accept <a href="https://github.com/clangen/musikcube/wiki/remote-api-documentation" target="_blank" rel="noopener noreferrer">websocket connections</a> in <strong>server setup</strong>:</p> 16 16 <ul> 17 17 <li>Enable the <strong>Metadata Server</strong></li> 18 18 <li>Set a <strong>Password</strong></li>
+6 -6
configuration/sources/plex/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Plex | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/plex/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Plex | Multi-Scrobbler"><meta data-rh="true" name="description" content="Find your Plex Token and make note of the URL and Port used to connect to your Plex instance."><meta data-rh="true" property="og:description" content="Find your Plex Token and make note of the URL and Port used to connect to your Plex instance."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/plex/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/plex/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/plex/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Plex","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/plex"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Plex</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Plex</h1></header><p>Find your <a href="https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/" target="_blank" rel="noopener noreferrer"><strong>Plex Token</strong></a> and make note of the <strong>URL</strong> and <strong>Port</strong> used to connect to your Plex instance.</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Plex</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Plex</h1></header><p>Find your <a href="https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/" target="_blank" rel="noopener noreferrer"><strong>Plex Token</strong></a> and make note of the <strong>URL</strong> and <strong>Port</strong> used to connect to your Plex instance.</p> 16 16 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Allowed Users and Defaults</summary><div><div class="collapsibleContent_i85q"><p><strong>Multi-scrobbler will automatically scrobble for these users by default:</strong></p><ul> 17 17 <li>The User authenticated with the Plex Token</li> 18 18 <li>and the <strong>Local User</strong></li> ··· 29 29 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h4> 30 30 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 31 31 <table><thead><tr><th>Environmental Variable</th><th>Required?</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>PLEX_URL</code></td><td><strong>Yes</strong></td><td></td><td>The URL of the Plex server IE <code>http://localhost:32400</code></td></tr><tr><td><code>PLEX_TOKEN</code></td><td><strong>Yes</strong></td><td></td><td>The <strong>Plex Token</strong> to use with the API</td></tr><tr><td><code>PLEX_USERS_ALLOW</code></td><td>No</td><td></td><td>Comma-separated list of usernames (from Plex) to scrobble for</td></tr><tr><td><code>PLEX_USERS_BLOCK</code></td><td>No</td><td></td><td>Comma-separated list of usernames (from Plex) to disallow scrobble for</td></tr><tr><td><code>PLEX_DEVICES_ALLOW</code></td><td>No</td><td></td><td>Comma-separated list of devices to scrobble from</td></tr><tr><td><code>PLEX_DEVICES_BLOCK</code></td><td>No</td><td></td><td>Comma-separated list of devices to disallow scrobbles from</td></tr><tr><td><code>PLEX_LIBRARIES_ALLOW</code></td><td>No</td><td></td><td>Comma-separated list of libraries to allow scrobbles from</td></tr><tr><td><code>PLEX_LIBRARIES_BLOCK</code></td><td>No</td><td></td><td>Comma-separated list of libraries to disallow scrobbles from</td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p> 32 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/plex.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyPlexApi&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;1234&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://192.168.0.120:32400&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;SomeOtherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;AnotherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;firefox&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;google-home&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;GoodMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;BadMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logPayload&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logFilterFailure&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;debug&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;ignoreInvalidCert&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;false&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FPlexApiSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 33 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyPlexApi&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;1234&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://192.168.0.120:32400&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;SomeOtherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;AnotherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;firefox&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;google-home&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;GoodMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;BadMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logPayload&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logFilterFailure&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;debug&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;ignoreInvalidCert&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;false&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;plex&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FPlexApiSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/plex.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/musikcube/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Musikcube</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/rocksky-source/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Rocksky</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 32 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG/plex.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyPlexApi&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;1234&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://192.168.0.120:32400&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;SomeOtherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;AnotherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;firefox&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;google-home&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;GoodMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;BadMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logPayload&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logFilterFailure&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;debug&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;ignoreInvalidCert&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FPlexApiSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=aio#configuration-types"><strong>AIO</strong> Config Type</a></p> 33 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">CONFIG_DIR/config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;sources&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyPlexApi&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;token&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;1234&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;url&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;http://192.168.0.120:32400&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;FoxxMD&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;SomeOtherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;usersBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;AnotherUser&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;firefox&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;devicesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;google-home&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesAllow&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;GoodMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;librariesBlock&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;BadMusic&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logPayload&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logFilterFailure&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;debug&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;ignoreInvalidCert&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;plex&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>or <a target="_blank" href="https://json-schema.app/view/%23/%23%2Fdefinitions%2FPlexApiSourceConfig?url=https%3A%2F%2Fraw.githubusercontent.com%2FFoxxMD%2Fmulti-scrobbler%2Fmaster%2Fsrc%2Fbackend%2Fcommon%2Fschema%2Fsource.json">explore<!-- --> the schema with an example and live editor/validator</a></p></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/sources/plex.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/sources/musikcube/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Musikcube</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/sources/rocksky-source/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Rocksky</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 34 34 </body> 35 35 </html>
+4 -4
configuration/sources/rocksky-source/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Rocksky | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/rocksky-source/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Rocksky | Multi-Scrobbler"><meta data-rh="true" name="description" content="To scrobble to* Rocksky, create a Rocksky (Client)"><meta data-rh="true" property="og:description" content="To scrobble to* Rocksky, create a Rocksky (Client)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/rocksky-source/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/rocksky-source/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/rocksky-source/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Rocksky","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/rocksky-source"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Rocksky</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Rocksky</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Rocksky</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Rocksky</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 16 16 <li>To <strong>scrobble to</strong> Rocksky, create a <a href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky (Client)</a></li> 17 17 </ul></div></div> 18 18 <p><a href="https://rocksky.app/" target="_blank" rel="noopener noreferrer"><strong>Rocksky</strong></a> is music tracking and discovery platform built on the AT Protocol (Bluesky).</p>
+5 -5
configuration/sources/spotify/index.html
··· 3 3 <head> 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 - <title data-rh="true">Spotify | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Spotify | Multi-Scrobbler"><meta data-rh="true" name="description" content="Spotify and Automix"><meta data-rh="true" property="og:description" content="Spotify and Automix"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Spotify","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 6 + <title data-rh="true">Spotify | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Spotify | Multi-Scrobbler"><meta data-rh="true" name="description" content="If your Spotify player has Automix enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is &quot;mixed&quot; in your queue with a shorter play time than its actual length and Spotify does not report this modified play time in its API. This does not affect MS&#x27;s ability to scrobble from Spotify but it will affect the accuracy of the duration MS reports was played."><meta data-rh="true" property="og:description" content="If your Spotify player has Automix enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is &quot;mixed&quot; in your queue with a shorter play time than its actual length and Spotify does not report this modified play time in its API. This does not affect MS&#x27;s ability to scrobble from Spotify but it will affect the accuracy of the duration MS reports was played."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Spotify","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Spotify</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Spotify</h1></header><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Spotify and Automix</summary><div><div class="collapsibleContent_i85q"><p>If your Spotify player has <a href="https://community.spotify.com/t5/FAQs/What-is-Automix/ta-p/5257278" target="_blank" rel="noopener noreferrer">Automix</a> enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is &quot;mixed&quot; in your queue with a shorter play time than its actual length and <a href="https://community.spotify.com/t5/Spotify-for-Developers/Wrong-duration-ms-of-track-with-Automix/m-p/5429147" target="_blank" rel="noopener noreferrer">Spotify does not report this modified play time in its API.</a> This <strong>does not affect MS&#x27;s ability to scrobble</strong> from Spotify but it will affect the accuracy of the duration MS reports was played.</p></div></div></details> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Spotify</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Spotify</h1></header><details class="details_lb9f alert alert--info details_b_Ee alert--secondary" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Spotify and Automix</summary><div><div class="collapsibleContent_i85q"><p>If your Spotify player has <a href="https://community.spotify.com/t5/FAQs/What-is-Automix/ta-p/5257278" target="_blank" rel="noopener noreferrer">Automix</a> enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is &quot;mixed&quot; in your queue with a shorter play time than its actual length and <a href="https://community.spotify.com/t5/Spotify-for-Developers/Wrong-duration-ms-of-track-with-Automix/m-p/5429147" target="_blank" rel="noopener noreferrer">Spotify does not report this modified play time in its API.</a> This <strong>does not affect MS&#x27;s ability to scrobble</strong> from Spotify but it will affect the accuracy of the duration MS reports was played.</p></div></div></details> 16 16 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="authenticate-spotify-with-multi-scrobbler">Authenticate Spotify with Multi-Scrobbler<a href="#authenticate-spotify-with-multi-scrobbler" class="hash-link" aria-label="Direct link to Authenticate Spotify with Multi-Scrobbler" title="Direct link to Authenticate Spotify with Multi-Scrobbler">​</a></h4> 17 17 <p>To access your Spotify history you must <a href="https://developer.spotify.com/dashboard" target="_blank" rel="noopener noreferrer">create a Spotify App</a> to get a 18 18 Client ID/Secret.</p>
+7 -7
configuration/sources/subsonic/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Subsonic | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/subsonic/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Subsonic | Multi-Scrobbler"><meta data-rh="true" name="description" content="This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome)"><meta data-rh="true" property="og:description" content="This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/subsonic/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/subsonic/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/subsonic/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Subsonic","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/subsonic"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Subsonic</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Subsonic</h1></header><p>This Source can be used for any application that implements the <a href="http://www.subsonic.org/pages/api.jsp" target="_blank" rel="noopener noreferrer">Subsonic API</a> and supports the <a href="http://www.subsonic.org/pages/api.jsp#getNowPlaying" target="_blank" rel="noopener noreferrer"><code>getNowPlaying</code></a> endpoint (such as <a href="https://airsonic.github.io/" target="_blank" rel="noopener noreferrer">Airsonic</a> and <a href="https://www.navidrome.org/" target="_blank" rel="noopener noreferrer">Navidrome</a>)</p> 16 - <div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Known Issues</div><div class="admonitionContent_BuS1"><ul> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Subsonic</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Subsonic</h1></header><p>This Source can be used for any application that implements the <a href="http://www.subsonic.org/pages/api.jsp" target="_blank" rel="noopener noreferrer">Subsonic API</a> and supports the <a href="http://www.subsonic.org/pages/api.jsp#getNowPlaying" target="_blank" rel="noopener noreferrer"><code>getNowPlaying</code></a> endpoint (such as <a href="https://airsonic.github.io/" target="_blank" rel="noopener noreferrer">Airsonic</a> and <a href="https://www.navidrome.org/" target="_blank" rel="noopener noreferrer">Navidrome</a>)</p> 16 + <details class="details_lb9f alert alert--info details_b_Ee alert--warning" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Known Issues</summary><div><div class="collapsibleContent_i85q"><ul> 17 17 <li>Multiple artists are reported as one value and cannot be separated</li> 18 18 <li>If using <a href="https://github.com/airsonic-advanced/airsonic-advanced" target="_blank" rel="noopener noreferrer">Airsonic Advanced</a> the password used (under <strong>Credentials</strong>) must be <strong>Decodable</strong></li> 19 - </ul></div></div> 20 - <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If your serivce supports scrobbling to <strong>Listenbrainz</strong> (such as Navidrome), considering using a <a href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/"><strong>Listenbrainz (Endpoint)</strong> Source</a> instead of this one.</p><p>Service-specific scrobble implementations tend to be more accurate and provide more information (multiple artists) compared to the Subsonic API.</p></div></div> 19 + </ul></div></div></details> 20 + <details class="details_lb9f alert alert--info details_b_Ee alert--success" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Recommended Alternative Sources</summary><div><div class="collapsibleContent_i85q"><p>If your serivce supports scrobbling to <strong>Listenbrainz</strong> (such as Navidrome), considering using a <a href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/"><strong>Listenbrainz (Endpoint)</strong> Source</a> instead of this one.</p><p>Service-specific scrobble implementations tend to be more accurate and provide more information (multiple artists) compared to the Subsonic API.</p></div></div></details> 21 21 <p>Use the optional <code>usersAllow</code> property with <strong>File</strong> or <strong>AIO</strong> configuration to restrict scrobbling to a list of defined users.</p> 22 22 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2> 23 23 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p>
+4 -4
configuration/sources/tealfm-source/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Teal.fm | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/tealfm-source/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Teal.fm | Multi-Scrobbler"><meta data-rh="true" name="description" content="To scrobble to* an ATProto PDS, create a teal.fm (Client)"><meta data-rh="true" property="og:description" content="To scrobble to* an ATProto PDS, create a teal.fm (Client)"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/tealfm-source/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/tealfm-source/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/tealfm-source/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Teal.fm","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/tealfm-source"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Teal.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Teal.fm</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Teal.fm</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Teal.fm</h1></header><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Other Uses</div><div class="admonitionContent_BuS1"><ul> 16 16 <li>To <strong>scrobble to</strong> an ATProto PDS, create a <a href="/multi-scrobbler/configuration/clients/tealfm/">teal.fm (Client)</a></li> 17 17 </ul></div></div> 18 18 <p><a href="https://teal.fm/" target="_blank" rel="noopener noreferrer"><strong>teal.fm</strong></a> is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a <a href="https://github.com/Bluesky-social/pds" target="_blank" rel="noopener noreferrer">PDS (Personal Data Server)</a>.</p>
+6 -7
configuration/sources/vlc/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">VLC | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/vlc/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="VLC | Multi-Scrobbler"><meta data-rh="true" name="description" content="MS communicates with VLC using the Web (http) interface module"><meta data-rh="true" property="og:description" content="MS communicates with VLC using the Web (http) interface module"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/vlc/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/vlc/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/vlc/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"VLC","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/vlc"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">VLC</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>VLC</h1></header><p>MS communicates with <a href="https://www.videolan.org/vlc/" target="_blank" rel="noopener noreferrer">VLC</a> using the <a href="https://wiki.videolan.org/VLC_HTTP_requests/" target="_blank" rel="noopener noreferrer">Web (<code>http</code>) interface module</a></p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">VLC</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>VLC</h1></header><p>MS communicates with <a href="https://www.videolan.org/vlc/" target="_blank" rel="noopener noreferrer">VLC</a> using the <a href="https://wiki.videolan.org/VLC_HTTP_requests/" target="_blank" rel="noopener noreferrer">Web (<code>http</code>) interface module</a></p> 16 16 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="enable-http-interface">Enable HTTP Interface<a href="#enable-http-interface" class="hash-link" aria-label="Direct link to Enable HTTP Interface" title="Direct link to Enable HTTP Interface">​</a></h4> 17 17 <p>Open VLC:</p> 18 18 <ul> ··· 46 46 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="filename-parsing">Filename Parsing<a href="#filename-parsing" class="hash-link" aria-label="Direct link to Filename Parsing" title="Direct link to Filename Parsing">​</a></h4> 47 47 <p>If the file being played in VLC does not have ID3 tags/metadata information multi-scrobbler can attempt to extract artist, title, and album information from the raw filename using regular expressions. Mutli-scrobbler will only do this if there is <strong>no other information</strong> reported by VLC about these fields.</p> 48 48 <p>To extract this information use <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Named_capturing_group" target="_blank" rel="noopener noreferrer">named capture groups</a> in your expression matching the field that should be extracted: <code>artist</code> <code>title</code> and/or <code>album</code>. MS accepts multiple expressions, the first one that matches a filename will be used.</p> 49 - <p>Example usage in <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">a file-based config:</a></p> 50 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config/vlc.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyVlc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;filenamePatterns&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Extracts artist and title from filenames that look like:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// My Artist - My Cool title.mp4</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;/^\\s*(?&lt;artist&gt;.+?) - (?&lt;title&gt;.+?)\\.\\w+$/i&quot;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// logs to DEBUG when MS tries to extract data from a filename</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logFilenamePatterns&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div> 49 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Example usage in <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">a file-based config:</a></p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config/vlc.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyVlc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;filenamePatterns&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Extracts artist and title from filenames that look like:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// My Artist - My Cool title.mp4</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;/^\\s*(?&lt;artist&gt;.+?) - (?&lt;title&gt;.+?)\\.\\w+$/i&quot;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// logs to DEBUG when MS tries to extract data from a filename</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logFilenamePatterns&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 51 50 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="vlc-information-reporting">Vlc Information Reporting<a href="#vlc-information-reporting" class="hash-link" aria-label="Direct link to Vlc Information Reporting" title="Direct link to Vlc Information Reporting">​</a></h4> 52 51 <p>If you find that VLC is incorrectly reporting track information (in its interface) but multi-scrobbler is not parsing it correctly it may be due to the <em>name</em> of the fields VLC is reporting. mutli-scrobbler uses the most common field name but does not cover all use cases. Before reporting an issue please turn on metadata logging and include output from your logs while it is turned on:</p> 53 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config/vlc.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyVlc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;dumpVlcMetadata&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div> 52 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Metadata Logging Configuration</summary><div><div class="collapsibleContent_i85q"><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config/vlc.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyVlc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;dumpVlcMetadata&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 54 53 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2> 55 54 <div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">ENV</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">File</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AIO</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><a href="/multi-scrobbler/configuration/?configType=env#configuration-types"><strong>ENV</strong> Config Type</a></p> 56 55 <table><thead><tr><th>Environmental Variable</th><th>Required?</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>VLC_URL</code></td><td>No</td><td><code>localhost:8080</code></td><td></td></tr><tr><td><code>VLC_PASSWORD</code></td><td>Yes</td><td></td><td></td></tr></tbody></table></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><a href="/multi-scrobbler/configuration/?configType=file#configuration-types"><strong>File</strong> Config Type</a></p>
+7 -7
configuration/sources/webscrobbler/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Webscrobbler | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/webscrobbler/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Webscrobbler | Multi-Scrobbler"><meta data-rh="true" name="description" content="After installing the Webscrobbler extension open the preferences/settings for it:"><meta data-rh="true" property="og:description" content="After installing the Webscrobbler extension open the preferences/settings for it:"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/webscrobbler/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/webscrobbler/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/webscrobbler/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Webscrobbler","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/webscrobbler"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Webscrobbler</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Webscrobbler</h1></header><p>After installing the <a href="https://web-scrobbler.com/" target="_blank" rel="noopener noreferrer">Webscrobbler extension</a> open the preferences/settings for it:</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Webscrobbler</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Webscrobbler</h1></header><p>After installing the <a href="https://web-scrobbler.com/" target="_blank" rel="noopener noreferrer">Webscrobbler extension</a> open the preferences/settings for it:</p> 16 16 <ul> 17 17 <li>Under <strong>Accounts</strong> 18 18 <ul> ··· 26 26 </li> 27 27 </ul> 28 28 <p>Reload the extension after adding the webhook.</p> 29 - <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><ul> 29 + <details class="details_lb9f alert alert--info details_b_Ee alert--secondary" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>URL Types Supported by Webscrobbler</summary><div><div class="collapsibleContent_i85q"><ul> 30 30 <li><strong>On Firefox</strong> - Only FQNs (domain.tld), <code>localhost</code>, and <code>127.0.0.1</code> are supported for API URL due to <a href="https://github.com/web-scrobbler/web-scrobbler/issues/4183#issuecomment-1749222006" target="_blank" rel="noopener noreferrer">firefox requiring https</a></li> 31 31 <li><strong>On Chromium-based Browsers</strong> - Any domain will work for API URL</li> 32 32 <li>All other browsers are untested</li> 33 - </ul></div></div> 34 - <div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Multi-scrobbler is <strong>not</strong> designed to be publicly accessible from the internet. To use Webscrobbler outside your local network you should be accessing MS through a VPN or through a reverse proxy with some kind of authentication (though this is still not recommended).</p></div></div> 33 + </ul></div></div></details> 34 + <details class="details_lb9f alert alert--info details_b_Ee alert--warning" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Public-Facing Usage</summary><div><div class="collapsibleContent_i85q"><p>Multi-scrobbler is <strong>not</strong> designed to be publicly accessible from the internet. To use Webscrobbler outside your local network you should be accessing MS through a VPN or through a reverse proxy with some kind of authentication (though this is still not recommended).</p></div></div></details> 35 35 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="multiple-users">Multiple Users<a href="#multiple-users" class="hash-link" aria-label="Direct link to Multiple Users" title="Direct link to Multiple Users">​</a></h3> 36 36 <p>If you would like use multiple WebScrobbler sources they can be matched using a <strong>slug</strong> at the end of the <strong>API URL.</strong> This requires using <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">a file-based config.</a></p> 37 37 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">webscrobbler.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;aUserWS&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client1Maloja&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;slug&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;usera&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;bUserWS&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clients&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;client2Maloja&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;slug&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;userb&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><ul>
+4 -4
configuration/sources/yamaha-musiccast/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Yamaha MusicCast | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/yamaha-musiccast/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Yamaha MusicCast | Multi-Scrobbler"><meta data-rh="true" name="description" content="Monitor MusicCast device/receivers for music played on Network/USB/CD inputs."><meta data-rh="true" property="og:description" content="Monitor MusicCast device/receivers for music played on Network/USB/CD inputs."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/yamaha-musiccast/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/yamaha-musiccast/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/yamaha-musiccast/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Yamaha MusicCast","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/yamaha-musiccast"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Yamaha MusicCast</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Yamaha MusicCast</h1></header><p>Monitor <a href="https://usa.yamaha.com/products/contents/audio_visual/musiccast/index.html" target="_blank" rel="noopener noreferrer">MusicCast</a> device/receivers for music played on Network/USB/CD inputs.</p> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Yamaha MusicCast</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Yamaha MusicCast</h1></header><p>Monitor <a href="https://usa.yamaha.com/products/contents/audio_visual/musiccast/index.html" target="_blank" rel="noopener noreferrer">MusicCast</a> device/receivers for music played on Network/USB/CD inputs.</p> 16 16 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Scrobbling Threshold</div><div class="admonitionContent_BuS1"><p>Musiccast may not correctly report track length. If this is the case you should reduce the &quot;listened to&quot; <strong>duration</strong> using <a href="/multi-scrobbler/configuration/sources/#scrobble-thresholds">Scrobble Thresholds</a> so that multi-scrobbler scrobbles correctly.</p></div></div> 17 17 <h5 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="url">URL<a href="#url" class="hash-link" aria-label="Direct link to URL" title="Direct link to URL">​</a></h5> 18 18 <p>If only a domain/IP<!-- -->:PORT<!-- --> is provided to multi-scrobbler it will automatically append the default Musiccast API path. If your Musiccast device is located behind a custom URL (or reverse proxy) you should explicitly provide the base path to use.</p>
+5 -5
configuration/sources/youtube-music/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Youtube Music | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/sources/youtube-music/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Youtube Music | Multi-Scrobbler"><meta data-rh="true" name="description" content="Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser."><meta data-rh="true" property="og:description" content="Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/youtube-music/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/youtube-music/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/sources/youtube-music/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Scrobble Sources","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/"},{"@type":"ListItem","position":3,"name":"Youtube Music","item":"https://foxxmd.github.io/multi-scrobbler/configuration/sources/youtube-music"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> 13 13 <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> 14 14 </defs></svg> 15 - <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Lastfm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Youtube Music</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Youtube Music</h1></header><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Communication with YT Music is <strong>unofficial</strong> and not supported or endorsed by Google. This means that <strong>this integration may stop working at any time</strong> if Google decides to change how YT Music works in the browser.</p></div></div> 15 + <script>!function(){var t="dark";var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",e||t),document.documentElement.setAttribute("data-theme-choice",e||t)}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/multi-scrobbler/img/icon.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/multi-scrobbler/"><div class="navbar__logo"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"></div><b class="navbar__title text--truncate">Multi-Scrobbler</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/multi-scrobbler/">Docs</a><a class="navbar__item navbar__link" href="/multi-scrobbler/playground/">Config Playground</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input searchInput_YFbd" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/multi-scrobbler/"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="40"><img src="/multi-scrobbler/img/icon.svg" alt="Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="40"><b>Multi-Scrobbler</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/installation/">Installation</a><button aria-label="Expand sidebar category &#x27;Installation&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/updating/">Updating</a><button aria-label="Expand sidebar category &#x27;Updating&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/multi-scrobbler/configuration/">Configuration</a><button aria-label="Collapse sidebar category &#x27;Configuration&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/clients/">Scrobble Clients</a><button aria-label="Expand sidebar category &#x27;Scrobble Clients&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/multi-scrobbler/configuration/sources/">Scrobble Sources</a><button aria-label="Collapse sidebar category &#x27;Scrobble Sources&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/azuracast/">Azuracast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/deezer/">Deezer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/google-cast/">Google Cast (Chromecast)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/icecast/">Icecast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jellyfin/">Jellyfin</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/jriver/">JRiver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Lastfm (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">Listenbrainz (Endpoint)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/listenbrainz-source/">Listenbrainz</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/maloja/">Maloja</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mopidy/">Mopidy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpd/">MPD (Music Player Daemon)</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/mpris/">MPRIS</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/musikcube/">Musikcube</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/plex/">Plex</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/rocksky-source/">Rocksky</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/spotify/">Spotify</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/tealfm-source/">Teal.fm</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/vlc/">VLC</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/webscrobbler/">Webscrobbler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/sources/yamaha-musiccast/">Yamaha MusicCast</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/multi-scrobbler/configuration/sources/youtube-music/">Youtube Music</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/multi-scrobbler/configuration/kitchensink/">Kitchen Sink</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/multi-scrobbler/configuration/transforms/">Enhance Scrobbles</a><button aria-label="Expand sidebar category &#x27;Enhance Scrobbles&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/multi-scrobbler/category/development/">Development</a><button aria-label="Expand sidebar category &#x27;Development&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/FAQ/">FAQ</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/multi-scrobbler/playground/">Config Playground</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/multi-scrobbler/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/"><span>Configuration</span></a></li><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/multi-scrobbler/configuration/sources/"><span>Scrobble Sources</span></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Youtube Music</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Youtube Music</h1></header><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Communication with YT Music is <strong>unofficial</strong> and not supported or endorsed by Google. This means that <strong>this integration may stop working at any time</strong> if Google decides to change how YT Music works in the browser.</p></div></div> 16 16 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Scrobble Troubleshooting</div><div class="admonitionContent_BuS1"><p>Due to monitoring being unofficial, listening history from YTM can be inconsistent and can cause missed scrobbles.</p><p><a href="/multi-scrobbler/FAQ/#youtube-music-misses-or-duplicates-scrobbles"><strong>See the FAQ</strong></a> for a detailed explanation, how to see more details about MS&#x27;s detection of tracks, and how to properly report an issue.</p></div></div> 17 17 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ytm-auth">Authentication<a href="#ytm-auth" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication">​</a></h4> 18 18 <p>Only one of these methods needs to be used.</p> ··· 56 56 </li> 57 57 </ul> 58 58 </li> 59 - </ul><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ytmusic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyYTM&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clientId&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;8910....6jqupl.apps.googleusercontent.com&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clientSecret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;GOCSPX-WGXL6BSuQ343...&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logAuthUpdateChanges&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logDiff&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>Now, start MS and during the YTMusic startup it will log something like this:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Will use custom OAuth Client:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Client ID: ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Client Secret: ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Redirect URI: http://localhost:9078/api/ytmusic/callback?name=MyYTM</span><br></span></code></pre></div></div><p>If the beginning of the Redirect URI (before <code>api</code>) is EXACTLY how you would reach the MS dashboard from your browser (EX <code>http://localhost:9078</code>) then edit your google oauth client section for <code>Authorized redirect URIs</code> and add the URL MS has displayed.</p><p>If it is NOT EXACTLY the same you either need to set MS&#x27;s <a href="https://foxxmd.github.io/multi-scrobbler/docs/configuration/#base-url" target="_blank" rel="noopener noreferrer">base url</a> or you can provide your own (Custom) Redirect URI for MS to use by setting it in <code>ytmusic.json</code> or ENV.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Using a Custom Redirect URI</summary><div><div class="collapsibleContent_i85q"><p>The three parts of the URL that must be the same:</p><ul> 59 + </ul><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ytmusic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;enable&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyYTM&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clientId&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;8910....6jqupl.apps.googleusercontent.com&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;clientSecret&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;GOCSPX-WGXL6BSuQ343...&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logAuthUpdateChanges&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;logDiff&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>Now, start MS and during the YTMusic startup it will log something like this:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Will use custom OAuth Client:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Client ID: ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Client Secret: ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Redirect URI: http://localhost:9078/api/ytmusic/callback?name=MyYTM</span><br></span></code></pre></div></div><p>If the beginning of the Redirect URI (before <code>api</code>) is EXACTLY how you would reach the MS dashboard from your browser (EX <code>http://localhost:9078</code>) then edit your google oauth client section for <code>Authorized redirect URIs</code> and add the URL MS has displayed.</p><p>If it is NOT EXACTLY the same you either need to set MS&#x27;s <a href="/multi-scrobbler/configuration/#base-url">base url</a> or you can provide your own (Custom) Redirect URI for MS to use by setting it in <code>ytmusic.json</code> or ENV.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Using a Custom Redirect URI</summary><div><div class="collapsibleContent_i85q"><p>The three parts of the URL that must be the same:</p><ul> 60 60 <li>it must start with <code>api</code> (after domain or subdirectory IE <code>my.domain.tld/api...</code> or <code>whatever.tld/subDir/api...</code></li> 61 61 <li>it must end in <code>ytmusic/callback</code></li> 62 62 <li>It must include <code>name=[NameOfSource]</code> in the query string</li>
+6 -6
configuration/transforms/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Enhancing Scrobbles | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Enhancing Scrobbles | Multi-Scrobbler"><meta data-rh="true" name="description" content="Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler&#x27;s lifecycle."><meta data-rh="true" property="og:description" content="Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler&#x27;s lifecycle."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Enhance Scrobbles","item":"https://foxxmd.github.io/multi-scrobbler/configuration/transforms/"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> ··· 56 56 <li><code>compare</code> - temporarily modify Play data when it is being compared to see if it was already scrobbled</li> 57 57 <li><code>postCompare</code> - modify Play data before scrobbling it to downstream service and adding to already seen scrobbles</li> 58 58 </ul> 59 - <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Keep in mind that modifying Scrobble/Play data earlier in the lifecycle will affect that data at all times later in the lifecycle (except when using the <strong>compare</strong> hook).</p><p>For example, to modify the track so it&#x27;s the same anywhere it is processed in multi-scrobbler you only need to modify it in the <strong>Source&#x27;s</strong> <code>preCompare</code> hook because all later processes will receive the data with the modified track.</p></div></div> 59 + <details class="details_lb9f alert alert--info details_b_Ee alert--success" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Transformed Scrobbles Are Permanently Modified</summary><div><div class="collapsibleContent_i85q"><p>Keep in mind that modifying Scrobble/Play data earlier in the lifecycle will affect that data at all times later in the lifecycle (except when using the <strong>compare</strong> hook).</p><p>For example, to modify the track so it&#x27;s the same anywhere it is processed in multi-scrobbler you only need to modify it in the <strong>Source&#x27;s</strong> <code>preCompare</code> hook because all later processes will receive the data with the modified track.</p></div></div></details> 60 60 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>TLDR</div><div class="admonitionContent_BuS1"><p><strong>To modify a scrobble coming from one of your Sources use the <code>preCompare</code> hook.</strong></p></div></div> 61 61 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Using <code>compare</code> hook</summary><div><div class="collapsibleContent_i85q"><p>The <code>compare</code> <a href="#hook">hook</a> is slightly different than <code>preCompare</code> and <code>postCompare</code>. It consists of an object where you define which side(s) of the comparison should be modified. It also <strong>does not modify downstream data!</strong> Instead, the modifications are made only for use in the comparison.</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">lastfm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;myLastFm&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;compare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;candidate&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// modify the &quot;new&quot; Play being compared</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;existing&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// modify all &quot;existing&quot; Play/Scrobbles the new Play is being compared against</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 62 62 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="stage">Modification Stage<a href="#stage" class="hash-link" aria-label="Direct link to Modification Stage" title="Direct link to Modification Stage">​</a></h2> ··· 78 78 <li><code>defaults</code> - An object defining default configuration for this stage, when used in a Hook.</li> 79 79 <li><code>data</code> - An object containing any data required to initially configure the stage itself (Example: API URL, username, password, etc...)</li> 80 80 </ul> 81 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyNativeTransformer&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// default delimiters when this Stage is used in a hook</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;delimiters&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;•&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// default delimiters when this Stage is used in a hook</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artistsParseFrom&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artists&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// when &quot;name&quot; is not defined, uses first found &quot;native&quot; transformer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 81 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyNativeTransformer&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// default delimiters when this Stage is used in a hook</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;delimiters&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;•&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// default delimiters when this Stage is used in a hook</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artistsParseFrom&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artists&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyNativeTransformer&quot;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// when &quot;name&quot; is not defined, uses first found &quot;native&quot; transformer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 82 82 <p>Multiple stages of the same type may be configured, allowing you to define several sets of default behavior.</p> 83 83 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;DotTransformer&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;delimiters&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;•&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artistsParseFrom&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artists&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;TitleOnly&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// extracts and uses *only* artists found in title string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artistsParseFrom&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;title&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;DotTransformer&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/sources/vlc/">VLC</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">vlc.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyVLC&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;TitleOnly&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 84 84 <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="overriding-configuration">Overriding Configuration<a href="#overriding-configuration" class="hash-link" aria-label="Direct link to Overriding Configuration" title="Direct link to Overriding Configuration">​</a></h4> ··· 89 89 <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will not apply any changes to Play title</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;when&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only apply changes to Play artists if &quot;when&quot; is satisfied</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;albumArtists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will always apply changes to Play album artists</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;album&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will always apply changes to Play album</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;duration&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will always apply changes to Play duration (length of track)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;meta&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will always apply changes to Play meta (MBIDs, spotify links, etc...)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 90 90 <p>The actual value of each property may be different for each Stage. Check the docs for the Stage you want to use to see its usage of each.</p> 91 91 <p>Generically, though, each property may be some value <strong>or</strong> an object combining a <a href="#conditional-modification"><code>when</code> condition</a> and that value.</p> 92 - <p>If none of the properties are specified in the stage then it&#x27;s assumed all transformed data should be used.</p> 92 + <p><strong>If none of the properties are specified in the stage then it&#x27;s assumed all transformed data should be used.</strong></p> 93 93 <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Specifying these Rules is <strong>not</strong> the same as <a href="#configuring-stages">configuring the Stage</a>. Rules only determine if the <em>result</em> of the transformation should be used (replace) the existing Play Data.</p></div></div> 94 94 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="flow-control">Stage Flow Control<a href="#flow-control" class="hash-link" aria-label="Direct link to Stage Flow Control" title="Direct link to Stage Flow Control">​</a></h2> 95 95 <p>Stages may be optionally configured to <strong>continue</strong> to the next Stage or <strong>stop</strong> (end early) all subsequent Stages, based on the outcome of the currently running Stage.</p>
+75 -40
configuration/transforms/musicbrainz/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Musicbrainz Stage | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/musicbrainz/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Musicbrainz Stage | Multi-Scrobbler"><meta data-rh="true" name="description" content="The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data."><meta data-rh="true" property="og:description" content="The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/musicbrainz/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/musicbrainz/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/musicbrainz/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Enhance Scrobbles","item":"https://foxxmd.github.io/multi-scrobbler/configuration/transforms/"},{"@type":"ListItem","position":3,"name":"Musicbrainz Stage","item":"https://foxxmd.github.io/multi-scrobbler/configuration/transforms/musicbrainz"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> ··· 30 30 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="stage-configuration">Stage Configuration<a href="#stage-configuration" class="hash-link" aria-label="Direct link to Stage Configuration" title="Direct link to Stage Configuration">​</a></h3> 31 31 <p>All of the properties found in <a href="#matching-with-musicbrainz"><strong>Matching with Musicbrainz</strong></a> section are configured in <a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> as <code>defaults</code>.</p> 32 32 <p>Example:</p> 33 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;official&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;fallbackArtistSearch&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseAllowEmpty&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 34 - <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="rules">Rules<a href="#rules" class="hash-link" aria-label="Direct link to Rules" title="Direct link to Rules">​</a></h3> 35 - <p>Each <a href="/multi-scrobbler/configuration/transforms/#stage-rules">Rule</a> should be either a boolean, specifying if the transformed data should be used for this field, or a <a href="/multi-scrobbler/configuration/transforms/#conditional-moditication"><code>when</code> condition</a>:</p> 36 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will not apply any changes to Play title</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;when&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only apply changes to Play artists if &quot;when&quot; is satisfied</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;album&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will always apply changes to Play album</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;meta&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// adds MusicBrainz MBIDs to scrobble data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 33 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;official&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseAllowEmpty&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 34 + <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="rules-and-hooks">Rules and Hooks<a href="#rules-and-hooks" class="hash-link" aria-label="Direct link to Rules and Hooks" title="Direct link to Rules and Hooks">​</a></h3> 35 + <p><a href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/#stage" target="_blank" rel="noopener noreferrer">Add your Stage</a> to a Source or Client by specifying it in a <a href="/multi-scrobbler/configuration/transforms/#hook">Hook</a>:</p> 36 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div> 37 + <p>Each <a href="/multi-scrobbler/configuration/transforms/#stage-rules"><strong>Stage Rule</strong></a> should be either a boolean, specifying if the transformed data should be used for this field, or a <a href="/multi-scrobbler/configuration/transforms/#conditional-moditication"><code>when</code> condition</a>:</p> 38 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will not apply any changes to Play title</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;when&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only apply changes to Play artists if &quot;when&quot; is satisfied</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;album&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will always apply changes to Play album</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;meta&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// adds MusicBrainz MBIDs to scrobble data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 39 + <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Per Component Override</div><div class="admonitionContent_BuS1"><p>The <code>defaults</code> you set in <a href="#stage-configuration">Stage Configuration</a> <a href="/multi-scrobbler/configuration/transforms/#overriding-configuration">can be overriden/added to</a> (per property) in each Hook.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;psuedo-release&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// override from defaults</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;freetext&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// add new property, combined with defaults</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details></div></div> 37 40 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="env-configuration">ENV Configuration<a href="#env-configuration" class="hash-link" aria-label="Direct link to ENV Configuration" title="Direct link to ENV Configuration">​</a></h2> 38 41 <p>The general configuration shown above can also be configured from a selection of <em>presets</em> using <a href="/multi-scrobbler/configuration/?configType=env#configuration-types">ENV Config</a> for individual Sources/Clients.</p> 39 42 <p>You must <strong>always</strong> include the <code>MB_CONTACT</code> ENV to <a href="#api-setup">identify your application</a>:</p> 40 43 <div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key attr-name" style="color:rgb(241, 250, 140)">MB_CONTACT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token value attr-value">contact@mydomain.com</span><br></span></code></pre></div></div> 41 44 <p>To configure <a href="#stage-configuration">stage defaults</a> use <code>MB_PRESETS</code> with a comma-delimited list of presets you wish to apply. More than one preset can be applied, in which case they combine. You must choose at least one of the presets below:</p> 42 45 <ul> 43 - <li><code>default</code> - Applies no defaults. This is the same as using no options from <a href="#matching-with-musicbrainz">Matching With Musicbrainz</a></li> 44 - <li><code>sensible</code> - Applies the <a href="#sensible-default">Sensible Default</a> configuration for sorting releases</li> 45 - <li><code>native</code> - Applies <code>fallbackArtistSearch: native</code> for <a href="#artist-extraction">Artist Extraction</a> if the first search fails to find matches</li> 46 - <li><code>aggressive</code> - Applies <a href="#free-text">Free Text Search</a> <code>fallbackFreeTextSearch: true</code> if all other searches fail</li> 46 + <li><code>default</code> - Adds the default <a href="#search-methods"><code>searchOrder</code></a> <code>isrc</code>+<code>basic</code> (same as using no presets that affect <code>searchOrder</code>)</li> 47 + <li><code>id</code> - Adds <a href="#search-methods"><code>searchOrder</code></a> methods that priorites searching by ID: <code>isrc</code> + <code>mbidrecording</code> + <code>basicOrIds</code> + <code>basic</code></li> 48 + <li><code>native</code> - Adds <strong>Extracted Artists</strong> (<code>artist</code>) in <code>native</code> mode to <a href="#search-methods"><code>searchOrder</code></a></li> 49 + <li><code>aggressive</code> - Adds <strong>Free Text Search</strong> (<code>freetext</code>) to <a href="#search-methods"><code>searchOrder</code></a></li> 50 + <li><code>fields</code> - Applies <a href="#field-scoring">Field Scoring</a> to match sorting so match text is baised towards similarity to original scrobble</li> 51 + <li><code>sensible</code> - Applies the <a href="#sensible-default">Sensible Default</a> configuration for <a href="#sorting-releases">sorting releases</a></li> 47 52 </ul> 48 53 <p>Finally, use ENV <code>*_TRANSFORMS=musicbrainz</code> on each Source/Client you wish to apply this stage to. This applies the stage in the <a href="/multi-scrobbler/configuration/transforms/#lifecycle-hooks"><code>preTransform</code> Hook</a> with all <a href="#rules">Rules</a> enabled.</p> 49 54 <p>The <code>*</code> stands for the prefix used for each Source/Client&#x27;s ENV keys. Refer to the individual Source/Client Configuration sections to find this. Example:</p> ··· 51 56 <li>All <a href="http://localhost:3000/docs/configuration/sources/subsonic/" target="_blank" rel="noopener noreferrer">Subsonic Source</a> ENVs look like <code>SUBSONIC_USER=myuser</code> etc...</li> 52 57 <li>Use <code>SUBSONIC_TRANSFORMS=musicbrainz</code></li> 53 58 </ul> 54 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example Full Docker Deploy with ENV Configuration</summary><div><div class="collapsibleContent_i85q"><p>Using <a href="/multi-scrobbler/quickstart/#create-docker-compose-file">Jellyfin + Maloja</a> example from Quickstart:</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">multi-scrobbler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> foxxmd/multi</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">scrobbler</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> multi</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">scrobbler</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MB_CONTACT=contact@mydomain.com</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MB_PRESETS=sensible</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">native </span><span class="token comment" style="color:rgb(98, 114, 164)"># creates sensible defaults with native fallback searching</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> JELLYFIN_URL=192.168.0.110</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">8096</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> JELLYFIN_USER=MyUser</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> JELLYFIN_TRANSFORMS=musicbrainz </span><span class="token comment" style="color:rgb(98, 114, 164)"># applies musicbrainz Stage to preTransform of Jellyfin source</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MALOJA_URL=http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//192.168.0.100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">42010</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># maloja receives enhanced scrobble from Jellyfin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MALOJA_API_KEY=myApiKey</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;./config:/config&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;9078:9078&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></span></code></pre></div></div></div></div></details> 59 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example Full Docker Deploy with ENV Configuration</summary><div><div class="collapsibleContent_i85q"><p>Using <a href="/multi-scrobbler/quickstart/#create-docker-compose-file">Jellyfin + Maloja</a> example from Quickstart:</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">multi-scrobbler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> foxxmd/multi</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">scrobbler</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> multi</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">scrobbler</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MB_CONTACT=contact@mydomain.com</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># searches with sensible release sorting with the searchOrder</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># isrc =&gt; basic =&gt; artist (native mode)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MB_PRESETS=default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">sensible</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">native</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> JELLYFIN_URL=192.168.0.110</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">8096</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> JELLYFIN_USER=MyUser</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># applies musicbrainz Stage to preTransform of Jellyfin source</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> JELLYFIN_TRANSFORMS=musicbrainz</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># maloja receives enhanced scrobble from Jellyfin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MALOJA_URL=http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//192.168.0.100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">42010</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MALOJA_API_KEY=myApiKey</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;./config:/config&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;9078:9078&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></span></code></pre></div></div></div></div></details> 55 60 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="matching-with-musicbrainz">Matching with Musicbrainz<a href="#matching-with-musicbrainz" class="hash-link" aria-label="Direct link to Matching with Musicbrainz" title="Direct link to Matching with Musicbrainz">​</a></h2> 56 61 <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><strong>All properties found in this section are optional.</strong></p><p>If you just want a sensible default for configuraion refer to the <a href="#best-practices">Best Practices</a> section.</p></div></div> 57 62 <p>Matching your Scrobble&#x27;s Play data with a result from Musicbrainz is comprised of two steps:</p> ··· 61 66 </ul> 62 67 <p>Both steps have separate configuration.</p> 63 68 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="searching">Searching<a href="#searching" class="hash-link" aria-label="Direct link to Searching" title="Direct link to Searching">​</a></h3> 64 - <p>Before MS begins a search it checks Scrobble data it checks if your data already contains:</p> 69 + <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="should-ms-search">Should MS Search?<a href="#should-ms-search" class="hash-link" aria-label="Direct link to Should MS Search?" title="Direct link to Should MS Search?">​</a></h4> 70 + <p>Before MS begins a search it checks if your Scrobble data already contains:</p> 65 71 <ul> 66 72 <li><a href="https://musicbrainz.org/doc/MusicBrainz_Identifier" target="_blank" rel="noopener noreferrer">MBIDs</a> for <a href="https://musicbrainz.org/doc/Artist" target="_blank" rel="noopener noreferrer">artists</a>, <a href="https://musicbrainz.org/doc/Release" target="_blank" rel="noopener noreferrer">album</a>, and specific <a href="https://musicbrainz.org/doc/Recording" target="_blank" rel="noopener noreferrer">track/recording</a></li> 67 73 <li>and duration</li> ··· 72 78 <li><code>searchWhenMissing</code> (defaults to all) - A list containing any of: <code>artists</code> <code>title</code> <code>album</code> <code>duration</code></li> 73 79 <li><code>forceSearch</code> (default <code>false</code>) - Force searching even if all required data is present</li> 74 80 </ul> 75 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// only search if MBIDs for artists or album is missing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchWithMissing&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&#x27;artists&#x27;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&#x27;album&#x27;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// uncomment to make the stage always search, even if above data is present</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//forceSearch: true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 76 - <p>If required data is missing then the next step is making <a href="https://musicbrainz.org/doc/MusicBrainz_API/Search" target="_blank" rel="noopener noreferrer">search queries to the Musicbrainz database</a> to try to get potential candidates. Multi-scrobbler uses the <strong>title, artist(s), and album</strong> from your Scrobble data to query for matches.</p> 77 - <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If your Scrobble data contains an <a href="https://musicbrainz.org/doc/ISRC" target="_blank" rel="noopener noreferrer">ISRC</a> (usually from Spotify) then Multi-scrobbler will search using this ID first, before the above criteria. If no match is found with the ISRC then it automatically retries with the title, artist(s), and album.</p></div></div> 78 - <p>Musicbrainz agressively normalizes these fields in its database which means that if your Scrobble data contains major innaccuracies or phrases fields in a non-normal way, it&#x27;s possible Musicbrainz won&#x27;t find any matches. This is a more common occurrence when trying to match Scrobble data from Sources that don&#x27;t support multiple artist data, like <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> and <a href="/multi-scrobbler/configuration/sources/lastfm/">Last.fm</a>.</p> 79 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Examples of Bad Data</summary><div><div class="collapsibleContent_i85q"><p>Last.fm Scrobble returns an Artist in the title and combines two artists into one string:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup &amp; Punk Rock Factory&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>The corresponding <a href="https://musicbrainz.org/release/85bf284b-8b39-414e-8ad9-61f593072588" target="_blank" rel="noopener noreferrer">Musicbrainz Recording</a> has all artists separated and no artist in the title:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Punk Rock Factory&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Wheatus&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 80 - <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If the initial search(es), and any <a href="#retrying-search">retried searches</a>, do not return any results then the stage is marked as <a href="/multi-scrobbler/configuration/transforms/#flow-control"><strong>failed</strong> (<code>onFailure</code>) for <strong>Flow Control</strong></a>.</p></div></div> 81 - <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="retrying-search">Retrying Search<a href="#retrying-search" class="hash-link" aria-label="Direct link to Retrying Search" title="Direct link to Retrying Search">​</a></h4> 82 - <p>If normal searches using all the fields mentioned above does not return any matches Multi-scrobbler can try additional searches with modified queries.</p> 83 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Album Only</summary><div><div class="collapsibleContent_i85q"><p>If your Scrobble data contains a title, artist(s), and an album (all three fields) then Multi-scrobbler can retry the search using only title and album, if <code>fallbackAlbumSearch</code> is set in <a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a>:</p><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will try an additional search using only title + album name</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;fallbackAlbumSearch&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;true&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 84 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Artist Extraction</summary><div><div class="collapsibleContent_i85q"><p>If...</p><ul> 85 - <li><a href="#album-only">Album Only</a> returns no results or did not run</li> 86 - <li>Your scrobble data contains only <strong>one</strong> artist string</li> 87 - <li><code>fallbackArtistSearch</code> is set in <a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a></li> 88 - </ul><p>Then Multi-scrobbler will attempt to extract multiple artists from your artist and track string. <strong>This is not automatic. You must set <code>fallbackArtistSearch</code> to enable this additional search.</strong></p><p><code>fallbackArtistSearch</code> can be set to <strong>Native</strong> or <strong>Naive</strong> mode:</p><div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Native (Recommended)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Naive</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>Native</strong> (<code>native</code>) mode uses an aggressive configuration of the <a href="/multi-scrobbler/configuration/transforms/native/">Native Stage</a> to extract artists using common delimiters and common &quot;joined&quot; artist patterns from the artist and title string of your Scrobble data.</p><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If you already have a Native Stage configured you should use that instead, running it before the Musicbrainz stage.</p></div></div><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Native Mode Example</summary><div><div class="collapsibleContent_i85q"><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup &amp; Punk Rock Factory, My Cool Band&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><ul> 81 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// only search if MBIDs for artists or album is missing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchWithMissing&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artists&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;album&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// uncomment to make the stage always search, even if above data is present</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//forceSearch: true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 82 + <p>If required data is missing then the next step is making <a href="https://musicbrainz.org/doc/MusicBrainz_API/Search" target="_blank" rel="noopener noreferrer">search queries to the Musicbrainz database</a> to try to get potential candidates.</p> 83 + <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="search-methods">Search Methods<a href="#search-methods" class="hash-link" aria-label="Direct link to Search Methods" title="Direct link to Search Methods">​</a></h4> 84 + <p>Multi-scrobbler can search for Musicbrainz matches using <strong>multiple</strong> methods. You control:</p> 85 + <ul> 86 + <li>the search methods that are used</li> 87 + <li><strong>the order</strong> in which search methods are executed</li> 88 + </ul> 89 + <p>All search methods will be run in the order they were defined until one method returns at least one match.</p> 90 + <p><strong>The methods you choose, and the order they run in, can drastically change how many API calls are needed to get a match, and what types of matches are returned.</strong> See <a href="#search-considerations"><strong>Search Considerations</strong></a> for guidance on how to decide on methods based on Source.</p> 91 + <p>To set search methods and their order use the <code>searchOrder</code> option in your <a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a>:</p> 92 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// only searches using these methods, in the order they are listed here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;isrc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;mbidrecording&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;basic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;freetext&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 93 + <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Default Search Methods</div><div class="admonitionContent_BuS1"><p>If <code>searchOrder</code> is undefined then Multi-scrobbler will default to using <code>isrc</code> then <code>basic</code> method.</p></div></div> 94 + <h4>Available Methods</h4> 95 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ISRC (<code>isrc</code>)</summary><div><div class="collapsibleContent_i85q"><p>If your Scrobble data contains an <a href="https://musicbrainz.org/doc/ISRC" target="_blank" rel="noopener noreferrer">ISRC</a> (usually from Spotify) then Multi-scrobbler can search using this ID, only.</p><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using isrc</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;isrc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 96 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Track MBID (<code>mbidrecording</code>)</summary><div><div class="collapsibleContent_i85q"><p>If your Scrobble data contains an <a href="https://musicbrainz.org/doc/Recording" target="_blank" rel="noopener noreferrer">Track (Recording) MBID</a> then Multi-scrobbler can search using this MBID, only.</p><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using recording mbid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;mbidrecording&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 97 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Album, Artist, and Title Fields (<code>basic</code>)</summary><div><div class="collapsibleContent_i85q"><p>Will search Musicbrainz using any/all available text fields from your scrobble: Album, Artists(s), and Title. Does not leverage any existing MBIDs.</p><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using album, artist(s), and title</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;basic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 98 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Album/Artist/Title OR MBIDs (<code>basicOrIds</code>)</summary><div><div class="collapsibleContent_i85q"><p>This is the same as the above <strong>Album, Artist, and Title Fields</strong> search except that if the scrobble data contains any corresponding MBIDs it will use those instead of the plain text field.</p><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using album, artist(s), and title</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;basicOrIds&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>Example:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;albumMbid&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;c9f91cdc-984e-4303-9a51-4ac0dfa2348f&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;album&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;My Cool Album&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>Multi-scrobbler will search Musicbrainz using <code>title</code>, <code>artists</code>, and <code>albumMbid</code> but NOT <code>album</code>.</p></div></div></details> 99 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Album And Title Only (<code>album</code>)</summary><div><div class="collapsibleContent_i85q"><p>If your Scrobble data contains a title, artist(s), and an album (all three fields) then Multi-scrobbler can search using only title and album by using <code>album</code> for <code>searchOrder</code>:</p><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using only title + album name</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;album&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 100 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Extracted Artists (<code>artist</code>)</summary><div><div class="collapsibleContent_i85q"><p>If your scrobble data contains only <strong>one</strong> artist string then Multi-scrobbler can attempt to extract multiple artists from your artist and track string.</p><p>Use <code>artist</code> with <code>searchOrder</code> and optionally specify the extraction mode with <code>searchArtistMethod</code>:</p><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using title/album + extracted artists</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artist&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//searchArtistMethod: &#x27;native&#x27; // optional</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p><code>searchArtistMethod</code> can be set to <strong>Native</strong> or <strong>Naive</strong> mode:</p><div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Native (Recommended)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Naive</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>Native</strong> (<code>native</code>) mode uses an aggressive configuration of the <a href="/multi-scrobbler/configuration/transforms/native/">Native Stage</a> to extract artists using common delimiters and common &quot;joined&quot; artist patterns from the artist and title string of your Scrobble data.</p><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If you already have a Native Stage configured you should use that instead, running it before the Musicbrainz stage.</p></div></div><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Native Mode Example</summary><div><div class="collapsibleContent_i85q"><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup &amp; Punk Rock Factory, My Cool Band&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><ul> 89 101 <li>Extracts <code>Bowling For Soup</code> <code>Punk Rock Factory</code> <code>My Cool Band</code> from artist string</li> 90 102 <li>Extracts <code>Wheatus</code> from title string<!-- --> 91 103 <ul> 92 104 <li>Removes <code>(feat. Wheatus)</code> from title string because it found an artist there</li> 93 105 </ul> 94 106 </li> 95 - </ul><p>Resulting data used for Musicbrainz search:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Punk Rock Factory&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;My Cool Band&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Wheatus&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;fallbackArtistSearch&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>Naive</strong> (<code>naive</code>) mode looks for the first found common delimiter in the artist string. If it finds one then it uses the preceding value as the only artist in the Musicbrainz search. It does not try to extract additional artists from the artist string, or extract anything from the title string.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Naive Mode Example</summary><div><div class="collapsibleContent_i85q"><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup, Punk Rock Factory &amp; Wheatus&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><ul> 107 + </ul><p>Resulting data used for Musicbrainz search:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Punk Rock Factory&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;My Cool Band&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Wheatus&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using title/album + native extracted artists</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artist&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchArtistMethod&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>Naive</strong> (<code>naive</code>) mode looks for the first found common delimiter in the artist string. If it finds one then it uses the preceding value as the only artist in the Musicbrainz search. It does not try to extract additional artists from the artist string, or extract anything from the title string.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Naive Mode Example</summary><div><div class="collapsibleContent_i85q"><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup, Punk Rock Factory &amp; Wheatus&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><ul> 96 108 <li>Finds <code>&amp;</code> as first common delimiter, extracts &quot;Bowling For Soup&quot;</li> 97 - </ul><p>Resulting data used for Musicbrainz search:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;fallbackArtistSearch&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;naive&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></div></div></div></details> 98 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Free Text</summary><div><div class="collapsibleContent_i85q"><p>If both <a href="#album-only">Album Only</a> and <a href="#artist-extraction">Artist Extraction</a> searches fail to return results, or were not run, you can additionally enable <strong>Free Text</strong> search. This will search Musicbrainz for <strong>all</strong> text of your Scrobble data artist/title/album, without constraint.</p><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Free text search is <strong>unconstrained</strong> which means that Musicbrainz will match text in <strong>any</strong> part of a Recording (artist, release, or recording field), regardless of where it is found. This may lead to results that are unexpected and undesired.</p><p>If you know your Source&#x27;s Play data is well organized you <strong>should not</strong> enable this. Free Text search should only be used if:</p><ul> 109 + </ul><p>Resulting data used for Musicbrainz search:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using title/album + naive extracted artists</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artist&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchArtistMethod&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;naive&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></div></div></div></details> 110 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Free Text (<code>freetext</code>)</summary><div><div class="collapsibleContent_i85q"><p>This will search Musicbrainz for <strong>all</strong> text of your Scrobble data artist/title/album, without constraint.</p><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Free text search is <strong>unconstrained</strong> which means that Musicbrainz will match text in <strong>any</strong> part of a Recording (artist, release, or recording field), regardless of where it is found. This may lead to results that are unexpected and undesired.</p><p>If you know your Source&#x27;s Play data is well organized you <strong>should not</strong> enable this. Free Text search should only be used if:</p><ul> 99 111 <li>your music is not well organized or</li> 100 112 <li>there may be many alternative titles/artists for the music you listen to (such as with <a href="https://wiki.musicbrainz.org/Release#Status" target="_blank" rel="noopener noreferrer">psuedo-releases</a>)</li> 101 113 <li>you can tolerate that matches may not be accurate for releases.<!-- --> ··· 103 115 <li>Generally, if you keep <a href="#score">score</a> high then matched releases should <em>at least</em> be the right artist or what you would expect within a reason, as a match. The release may not be the one you actually listened to but it would be &quot;close enough&quot;.</li> 104 116 </ul> 105 117 </li> 106 - </ul></div></div><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;fallbackFreeTextSearch&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 118 + </ul></div></div><p><a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> example:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// will only search using free text search of all artist/album/title</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;freetext&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 119 + <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If all defined search methods do not return any results then the stage is marked as <a href="/multi-scrobbler/configuration/transforms/#flow-control"><strong>failed</strong> (<code>onFailure</code>) for <strong>Flow Control</strong></a>.</p></div></div> 107 120 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="refining">Refining<a href="#refining" class="hash-link" aria-label="Direct link to Refining" title="Direct link to Refining">​</a></h3> 108 121 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="score">Score<a href="#score" class="hash-link" aria-label="Direct link to Score" title="Direct link to Score">​</a></h3> 109 122 <p>Each match returned by MusicBrainz contains a numeric score representing how close it was to the search parameters. Set <code>score</code> in configuration to set a minimum score that must be met by matches. Default is <code>90</code>.</p> ··· 136 149 <p>You may want to filter the majority of your matches by releases but allow matching a Recording that has no releases to begin with. To allow this set <code>releaseAllowEmpty</code> to <code>true</code> in configuration:</p> 137 150 <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseAllowEmpty&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// don&#x27;t remove a match during filtering just because it has no releases</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 138 151 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sorting">Sorting<a href="#sorting" class="hash-link" aria-label="Direct link to Sorting" title="Direct link to Sorting">​</a></h3> 139 - <p>Each <a href="#release-attribute">Release Attribute</a> has one additional property that can be used to <strong>rank</strong> releases based on the order of the values you give it. This is the <code>priority</code> property.</p> 140 - <p><em>After</em> matches have been <a href="#filtering">filtered</a>, the remaining matches will have their releases sorted. Release with an attribute that does not match are <strong>not</strong> removed, but they are sorted lower than releases that do match.</p> 152 + <p><em>After</em> matches have been <a href="#filtering">filtered</a>, the remaining matches <em>and their releases</em>* can be sorted. Matches/Releases with an attribute that does not match are <strong>not</strong> removed, but they are sorted lower than matches that do match.</p> 141 153 <p>Sorting can be a good alternative to filtering: with filters there is a possibility your filters may eliminate all matches; if you want to ensure that <strong>some</strong> match will be used then sorting can ensure that the <strong>best choice</strong> out of those given will always be used, without accidentally ending up with <strong>no choice</strong>.</p> 142 154 <p>Sorting can be used instead of filters, or in conjunction with filters, it&#x27;s your choice.</p> 155 + <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sorting-releases">Release Attributes<a href="#sorting-releases" class="hash-link" aria-label="Direct link to Release Attributes" title="Direct link to Release Attributes">​</a></h4> 156 + <p>Each <a href="#release-attribute">Release Attribute</a> has one additional property that can be used to <strong>rank</strong> releases based on the order of the values you give it. This is the <code>priority</code> property.</p> 143 157 <p>In configuration:</p> 144 158 <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">[attribute_name]Priority = [...]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">EX to prefer &quot;official&quot; releases over everything else</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&quot;releaseStatusPriority&quot;: [&quot;official&quot;]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">EX to prefer albums, then singles, over everything else</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&quot;releaseGroupPrimaryTypePriority&quot;: [&quot;album&quot;, &quot;single&quot;]</span><br></span></code></pre></div></div> 145 - <p>If a rule is not present then multi-scrobbler defaults it to <code>true</code>.</p> 159 + <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="field-scoring">Field Scoring<a href="#field-scoring" class="hash-link" aria-label="Direct link to Field Scoring" title="Direct link to Field Scoring">​</a></h4> 160 + <p>Matches can additionally be sorted/ranked based on how similar their fields are to the original Scrobble. Use these properties for sorting when you want the final Musicbrainz match to be as closely matched to the original Scrobble, as opposed to what may be the most &quot;correct&quot; match based on the Musicbrainz score or suggested Release.</p> 161 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example Scenario</summary><div><div class="collapsibleContent_i85q"><p>You scrobble <a href="https://open.spotify.com/track/21trRQA61afzljSK9V0SHX" target="_blank" rel="noopener noreferrer">this track from spotify</a>, which has an English title, Album name, and Artist name.</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;track&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Price&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ATLUS Sound Team&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;album&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;PERSONA5 ORIGINAL SOUNDTRACK&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>However, the <a href="https://beta.musicbrainz.org/search?query=isrc%3AJPK651601515&amp;type=recording&amp;limit=25&amp;method=advanced" target="_blank" rel="noopener noreferrer">Recording found by Musicbrainz</a> has multiple Releases (albums). The first suggested release is a <em>related</em> Album with similar name (<code>Persona 25th Anniversary Deluxe Vinyl Box Set</code>) but it&#x27;s not the same as your album. Additionally, the artists for this album are in Japanese, rather than English.</p><p>You have used <code>releaseStatusPriority</code> to prioritize <code>psuedo-release</code> which does work but there are still multiple releases chosen, and some are non-English (<code>『ペルソナ5』オリジナル・サウンドトラック</code>).</p><p>Using <code>&quot;albumWeight&quot;: 0.4</code> and <code>&quot;artistWeight&quot;: 0.3</code> ensures that the releases that have an album name, and artist names, more similar to your original scrobble are ranked higher. Resulting in <a href="https://beta.musicbrainz.org/release/82de33b1-1cd6-4236-b116-561d0ecc8acf" target="_blank" rel="noopener noreferrer">the correct Release (<code>PERSONA5 ORIGINAL SOUNDTRACK</code>)</a> being chosen as the final match.</p></div></div></details> 162 + <p>Add one or more of these weight properties to your <a href="/multi-scrobbler/configuration/transforms/#configuring-stages">Stage Configuration</a> to enable Field Scoring:</p> 163 + <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// enables album text similiarity scoring</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;albumWeight&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0.33</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// enables title text similiarity scoring</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;titleWeight&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0.33</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// enables artist text similiarity scoring</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artistWeight&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0.33</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 164 + <p>While not enforced, it&#x27;s a good idea to keep these weights under <code>1</code>. And if using more than one weight, they should be add up to <code>1</code>.</p> 165 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>How Scoring is Combined</summary><div><div class="collapsibleContent_i85q"><p>The score similarity from <code>albumWeight</code> will be added to the score accumulated by <a href="#sorting-releases">Release Attributes</a> to affect the final ranking of each Release for a Match/Recording.</p><p>In the final sorting of Recordings, title score + artist score is combined with the top ranked release album score. The top ranked score is then used to choose the matched Recording.</p></div></div></details> 146 166 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="best-practices">Best Practices<a href="#best-practices" class="hash-link" aria-label="Direct link to Best Practices" title="Direct link to Best Practices">​</a></h2> 147 167 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sensible-default">Sensible Default<a href="#sensible-default" class="hash-link" aria-label="Direct link to Sensible Default" title="Direct link to Sensible Default">​</a></h3> 148 168 <p>Generally, the Musicbrainz Stage can be used without any of the <a href="#configuration">optional configuration</a> and you should still see good results from matches. The top <a href="#score">scored</a> match is, anecdotally, good enough for correcting and filling in surface-level play data like Title and Artist names.</p> 149 169 <p>For a more opinionated match that will mirror what you would expect from data from large music services:</p> 150 170 <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// use official release over anything else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;official&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// prefer album, then single, then ep</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseGroupPrimaryTypePriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;album&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;single&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ep&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// prefer worldwide release</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseCountryPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;XW&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 151 - <p>Consider adding <a href="/multi-scrobbler/configuration/transforms/musicbrainz/?fallbackArtist=native#artist-extraction">Artist Extraction</a> in <strong>Native Mode</strong> if any of your Sources do not support multiple artists or your music collection is not tagged well.</p> 152 - <div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// add the line below to the sensible defaults above</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// (don&#x27;t forget commas)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;fallbackArtistSearch&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div> 171 + <p>Consider adding <a href="#search-methods">Artist Extraction (<code>artist</code>)</a> in <strong>Native Mode</strong> if any of your Sources do not support multiple artists or your music collection is not tagged well.</p> 172 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Details</summary><div><div class="collapsibleContent_i85q"><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// use official release over anything else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;official&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// prefer album, then single, then ep</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseGroupPrimaryTypePriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;album&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;single&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ep&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// prefer worldwide release</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseCountryPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;XW&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// search using extracted artist as last search attempt</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;isrc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;basic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artist&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchArtistMethod&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 173 + <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="search-considerations">Search Considerations<a href="#search-considerations" class="hash-link" aria-label="Direct link to Search Considerations" title="Direct link to Search Considerations">​</a></h3> 174 + <p>How complete, and accurate, your scrobble data is from a certain Source should dictate what <a href="#search-methods">Search Methods</a> you should use for matching.</p> 175 + <p>Musicbrainz agressively normalizes <strong>artist, album, and title</strong> fields in its database which means that if your Scrobble data contains major innaccuracies or phrases fields in a non-normal way, it&#x27;s possible Musicbrainz won&#x27;t find any matches. This is a more common occurrence when trying to match Scrobble data from Sources that don&#x27;t support multiple artist data, like <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> and <a href="/multi-scrobbler/configuration/sources/lastfm/">Last.fm</a>.</p> 176 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Examples of Bad Data</summary><div><div class="collapsibleContent_i85q"><p>Last.fm Scrobble returns an Artist in the title and combines two artists into one string:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility (feat. Wheatus)&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup &amp; Punk Rock Factory&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>The corresponding <a href="https://musicbrainz.org/release/85bf284b-8b39-414e-8ad9-61f593072588" target="_blank" rel="noopener noreferrer">Musicbrainz Recording</a> has all artists separated and no artist in the title:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Endless Possibility&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Bowling For Soup&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Punk Rock Factory&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Wheatus&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div></div></div></details> 177 + <p><strong>In general, you should prioritize methods that search by unique identifiers</strong> (<code>isrc</code> <code>mbidRecording</code> <code>basicOrIds</code>) if you know your Sources may contain <em>accurate</em> data for these. Such as: Spotify, Jellyfin, Plex, and Listenbrainz (Source).</p> 178 + <p>Use field-based methods if your Sources do not return IDs consistently (or at all). Add more field-based methods the more inaccurate your scrobble data may be, but be aware that more aggressive/broad searches may return less accurate results.</p> 179 + <details class="details_lb9f alert alert--info details_b_Ee alert--success" data-collapsed="true"><summary><span class="admoIcon"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Matching Scrobbles from Last.fm</summary><div><div class="collapsibleContent_i85q"><p>Last.fm is inconsistent when it comes to matching your scrobbles. It will accept (almost) any fields for track/title/album and aggressively attempt to match/correct these, regardless of your intentions.</p><p>Unless the client scrobbling to Last.fm is also sending an <code>mbid</code>, it&#x27;s likely your scrobble will not be <strong>consistently</strong> matched correctly and so the <code>mbid</code> supplied by last.fm in its scrobble data will be wrong.</p><p>Therefore, you should <em>avoid</em> using <code>mbidRecording</code> and <code>basicOrIds</code> as the primary search methods (or understand the risks of using them). Instead, prefer to use field-based methods <em>before</em> falling back to id-based methods.</p></div></div></details> 153 180 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="filter-considerations">Filter Considerations<a href="#filter-considerations" class="hash-link" aria-label="Direct link to Filter Considerations" title="Direct link to Filter Considerations">​</a></h3> 154 181 <p>When using your own filters consider:</p> 155 182 <ul> ··· 176 203 <li>or the resulting enhanced Scrobble is not what you expected</li> 177 204 </ul> 178 205 <p>Enable logging by turning on <a href="/multi-scrobbler/configuration/#debug-mode"><strong>Debug Mode</strong></a> to help diagnose any issues with the Musicbrainz API and Scrobble enhancement. <strong>Before creating an issue</strong> please enable logging and include any logs with your issue as this is needed to debug.</p> 179 - <p>If you have multiple Modification Stages and need to see the diff for your Play between each Stage, enable <code>&quot;log&quot;: &quot;all&quot;</code> in the individual <a href="http://localhost:3000/docs/configuration/transforms/musicbrainz/?fallbackArtist=native#artist-extraction" target="_blank" rel="noopener noreferrer">Modification Stage</a>.</p> 206 + <p>If you have multiple Modification Stages and need to see the diff for your Play between each Stage, enable <code>&quot;log&quot;: &quot;all&quot;</code> in the individual <a href="#rules-and-hooks">Modification Stage</a>.</p> 180 207 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>In a <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;log&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;all&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 181 208 <h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="examples">Examples<a href="#examples" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples">​</a></h2> 182 209 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="minimal">Minimal<a href="#minimal" class="hash-link" aria-label="Direct link to Minimal" title="Direct link to Minimal">​</a></h3> 183 210 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 184 211 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sensible-default-1">Sensible Default<a href="#sensible-default-1" class="hash-link" aria-label="Direct link to Sensible Default" title="Direct link to Sensible Default">​</a></h3> 185 212 <p>Using the config shown in <a href="#sensible-default">Sensible Default</a> with File/AIO config, instead of <a href="#env-configuration">ENV Config</a>.</p> 186 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;official&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseGroupPrimaryTypePriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;album&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;single&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ep&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseCountryPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;XW&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;fallbackArtistSearch&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 213 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;official&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseGroupPrimaryTypePriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;album&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;single&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ep&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseCountryPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;XW&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchArtistMethod&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;isrc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;basic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artist&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/sources/subsonic/">Subsonic</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">subsonic.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySubsonic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 187 214 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="add-metadata-only-no-scrobble-modification">Add Metadata Only (No Scrobble Modification)<a href="#add-metadata-only-no-scrobble-modification" class="hash-link" aria-label="Direct link to Add Metadata Only (No Scrobble Modification)" title="Direct link to Add Metadata Only (No Scrobble Modification)">​</a></h3> 188 215 <p>If you do not want your scrobble data to be modified (artists/album/title) but still want to benefit from associating the scrobble with a Musicbrainz match (for Scrobble <a href="/multi-scrobbler/configuration/clients/">Clients</a> like <a href="/multi-scrobbler/configuration/clients/tealfm/">Tealfm</a>, <a href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a>, and <a href="/multi-scrobbler/configuration/clients/koito/">Koito</a>), then use <a href="#using-partial-match">Partial Match</a> rules to specify only <code>meta</code> to be updated.</p> 189 216 <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// maybe something like Sensible Default?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/clients/jellyfin/">Jellyfin</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">jellyfin.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyJellyfin&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;title&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;album&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;albumArtists&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;meta&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// only update scrobble metadata with MBIDs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> ··· 192 219 <li>Musicbrainz Stage configured with<!-- --> 193 220 <ul> 194 221 <li><a href="#sensible-default">Sensible Defaults</a></li> 195 - <li>Fallback search with <a href="#retrying-search">Artist Extraction</a></li> 222 + <li>Fallback search with <a href="#search-methods">Artist Extraction</a></li> 196 223 </ul> 197 224 </li> 198 225 <li><a href="/multi-scrobbler/configuration/transforms/native/#default-stage">Default Native Stage</a></li> 199 226 <li>Uses <a href="/multi-scrobbler/configurations/transforms/#flow-control">Flow Control</a> to run Native only if there are no Musicbrainz matches</li> 200 227 </ul> 201 - <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;official&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseGroupPrimaryTypePriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;album&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;single&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ep&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseCountryPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;XW&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;fallbackArtistSearch&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/clients/jellyfin/">Jellyfin</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">jellyfin.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyJellyfin&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// if musicbrainz is successful then do NOT run native,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// only run native if musicbrainz fails to find a match (onFailure)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;onSuccess&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;stop&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;onFailure&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;continue&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/transforms/musicbrainz.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/transforms/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Enhancing Scrobbles</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/transforms/native/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Native Stage</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a><ul><li><a href="#api-setup" class="table-of-contents__link toc-highlight">API Setup</a></li><li><a href="#stage-configuration" class="table-of-contents__link toc-highlight">Stage Configuration</a></li><li><a href="#rules" class="table-of-contents__link toc-highlight">Rules</a></li></ul></li><li><a href="#env-configuration" class="table-of-contents__link toc-highlight">ENV Configuration</a></li><li><a href="#matching-with-musicbrainz" class="table-of-contents__link toc-highlight">Matching with Musicbrainz</a><ul><li><a href="#searching" class="table-of-contents__link toc-highlight">Searching</a><ul><li><a href="#retrying-search" class="table-of-contents__link toc-highlight">Retrying Search</a></li></ul></li><li><a href="#refining" class="table-of-contents__link toc-highlight">Refining</a></li><li><a href="#score" class="table-of-contents__link toc-highlight">Score</a></li><li><a href="#filtering" class="table-of-contents__link toc-highlight">Filtering</a><ul><li><a href="#release-attributes" class="table-of-contents__link toc-highlight">Release Attributes</a></li><li><a href="#empty-releases" class="table-of-contents__link toc-highlight">Empty Releases</a></li></ul></li><li><a href="#sorting" class="table-of-contents__link toc-highlight">Sorting</a></li></ul></li><li><a href="#best-practices" class="table-of-contents__link toc-highlight">Best Practices</a><ul><li><a href="#sensible-default" class="table-of-contents__link toc-highlight">Sensible Default</a></li><li><a href="#filter-considerations" class="table-of-contents__link toc-highlight">Filter Considerations</a></li><li><a href="#using-partial-match" class="table-of-contents__link toc-highlight">Using Partial Match</a></li></ul></li><li><a href="#logging" class="table-of-contents__link toc-highlight">Logging</a></li><li><a href="#examples" class="table-of-contents__link toc-highlight">Examples</a><ul><li><a href="#minimal" class="table-of-contents__link toc-highlight">Minimal</a></li><li><a href="#sensible-default-1" class="table-of-contents__link toc-highlight">Sensible Default</a></li><li><a href="#add-metadata-only-no-scrobble-modification" class="table-of-contents__link toc-highlight">Add Metadata Only (No Scrobble Modification)</a></li><li><a href="#use-native-stage-if-no-musicbrainz-matches" class="table-of-contents__link toc-highlight">Use Native Stage if no Musicbrainz Matches</a></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 228 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Your <a href="/multi-scrobbler/configuration/?configType=aio#configuration-types">AIO Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseStatusPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;official&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseGroupPrimaryTypePriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;album&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;single&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;ep&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;releaseCountryPriority&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;XW&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchArtistMethod&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;isrc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;basic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artist&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><p>In a <a href="/multi-scrobbler/configuration/clients/jellyfin/">Jellyfin</a> <a href="/multi-scrobbler/configuration/?configType=file#configuration-types">File Config</a>:</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">jellyfin.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyJellyfin&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// if musicbrainz is successful then do NOT run native,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// only run native if musicbrainz fails to find a match (onFailure)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;onSuccess&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;stop&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;onFailure&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;continue&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details> 229 + <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="override-stage-configuration-example">Different Search Methods Based on Source (Last.fm and Spotify)<a href="#override-stage-configuration-example" class="hash-link" aria-label="Direct link to Different Search Methods Based on Source (Last.fm and Spotify)" title="Direct link to Different Search Methods Based on Source (Last.fm and Spotify)">​</a></h3> 230 + <p><a href="#search-considerations">Last.fm has unreliable MBIDs</a> and Spotify provides an <a href="https://musicbrainz.org/doc/ISRC" target="_blank" rel="noopener noreferrer">ISRC</a> and consistent formatting.</p> 231 + <ul> 232 + <li>For Spotify, we want to rely on ID <a href="#search-methods">searches</a> and matches that are <a href="#field-scoring">close to original scrobble text</a></li> 233 + <li>For Last.fm, we want to use only text searches and take whatever correction is given to us</li> 234 + </ul> 235 + <p>Use <a href="#rules-and-hooks"><strong>Per Component Overrides</strong></a> with the default (or <a href="#sensible-default">sensible</a>) <a href="#stage-configuration">Stage Configuration</a> to specify different search behavior for each Source.</p> 236 + <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Example</summary><div><div class="collapsibleContent_i85q"><p>Stage Configuration</p><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;transformers&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;apis&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;contact&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;contact@mydomain.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;defaults&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// maybe use sensible?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">lastfm.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyLFM&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;configureAs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;source&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchArtistMethod&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;native&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// does not use any ID searches</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// fallback to more aggressive/broad searches</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;basic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;artist&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;freetext&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div><div class="language-json5 codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">spotify.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json5 codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MySpotify&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;data&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;options&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;playTransform&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;preCompare&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;type&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;musicbrainz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;name&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;MyMB&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// use ISRC as first search</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;searchOrder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;isrc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;basic&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// bias matches towards similarity to original data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;albumWeight&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0.33</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;titleWeight&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0.33</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;artistWeight&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0.33</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div></div></div></details></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/configuration/transforms/musicbrainz.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/multi-scrobbler/configuration/transforms/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Enhancing Scrobbles</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/multi-scrobbler/configuration/transforms/native/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Native Stage</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#configuration" class="table-of-contents__link toc-highlight">Configuration</a><ul><li><a href="#api-setup" class="table-of-contents__link toc-highlight">API Setup</a></li><li><a href="#stage-configuration" class="table-of-contents__link toc-highlight">Stage Configuration</a></li><li><a href="#rules-and-hooks" class="table-of-contents__link toc-highlight">Rules and Hooks</a></li></ul></li><li><a href="#env-configuration" class="table-of-contents__link toc-highlight">ENV Configuration</a></li><li><a href="#matching-with-musicbrainz" class="table-of-contents__link toc-highlight">Matching with Musicbrainz</a><ul><li><a href="#searching" class="table-of-contents__link toc-highlight">Searching</a><ul><li><a href="#should-ms-search" class="table-of-contents__link toc-highlight">Should MS Search?</a></li><li><a href="#search-methods" class="table-of-contents__link toc-highlight">Search Methods</a></li></ul></li><li><a href="#refining" class="table-of-contents__link toc-highlight">Refining</a></li><li><a href="#score" class="table-of-contents__link toc-highlight">Score</a></li><li><a href="#filtering" class="table-of-contents__link toc-highlight">Filtering</a><ul><li><a href="#release-attributes" class="table-of-contents__link toc-highlight">Release Attributes</a></li><li><a href="#empty-releases" class="table-of-contents__link toc-highlight">Empty Releases</a></li></ul></li><li><a href="#sorting" class="table-of-contents__link toc-highlight">Sorting</a><ul><li><a href="#sorting-releases" class="table-of-contents__link toc-highlight">Release Attributes</a></li><li><a href="#field-scoring" class="table-of-contents__link toc-highlight">Field Scoring</a></li></ul></li></ul></li><li><a href="#best-practices" class="table-of-contents__link toc-highlight">Best Practices</a><ul><li><a href="#sensible-default" class="table-of-contents__link toc-highlight">Sensible Default</a></li><li><a href="#search-considerations" class="table-of-contents__link toc-highlight">Search Considerations</a></li><li><a href="#filter-considerations" class="table-of-contents__link toc-highlight">Filter Considerations</a></li><li><a href="#using-partial-match" class="table-of-contents__link toc-highlight">Using Partial Match</a></li></ul></li><li><a href="#logging" class="table-of-contents__link toc-highlight">Logging</a></li><li><a href="#examples" class="table-of-contents__link toc-highlight">Examples</a><ul><li><a href="#minimal" class="table-of-contents__link toc-highlight">Minimal</a></li><li><a href="#sensible-default-1" class="table-of-contents__link toc-highlight">Sensible Default</a></li><li><a href="#add-metadata-only-no-scrobble-modification" class="table-of-contents__link toc-highlight">Add Metadata Only (No Scrobble Modification)</a></li><li><a href="#use-native-stage-if-no-musicbrainz-matches" class="table-of-contents__link toc-highlight">Use Native Stage if no Musicbrainz Matches</a></li><li><a href="#override-stage-configuration-example" class="table-of-contents__link toc-highlight">Different Search Methods Based on Source (Last.fm and Spotify)</a></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/installation/">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/configuration/">Configuration</a></li><li class="footer__item"><a class="footer__link-item" href="/multi-scrobbler/development/dev-common/">Development</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foxxmd/multi-scrobbler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://foxxmd.github.io/multi-scrobbler/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Website<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Multi-Scrobbler. Built with Docusaurus.</div></div></div></footer></div> 202 237 </body> 203 238 </html>
+3 -3
configuration/transforms/native/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Native Stage | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/native/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Native Stage | Multi-Scrobbler"><meta data-rh="true" name="description" content="The Native Stage uses built-in heuristics to try to extract Artists from Play artist/track data."><meta data-rh="true" property="og:description" content="The Native Stage uses built-in heuristics to try to extract Artists from Play artist/track data."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/native/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/native/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/native/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Enhance Scrobbles","item":"https://foxxmd.github.io/multi-scrobbler/configuration/transforms/"},{"@type":"ListItem","position":3,"name":"Native Stage","item":"https://foxxmd.github.io/multi-scrobbler/configuration/transforms/native"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
configuration/transforms/user/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">User Stage | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/user/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="User Stage | Multi-Scrobbler"><meta data-rh="true" name="description" content="The User Stage uses search-and-replace expressions, provided by you, to modify/replace parts of Play data."><meta data-rh="true" property="og:description" content="The User Stage uses search-and-replace expressions, provided by you, to modify/replace parts of Play data."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/user/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/user/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/configuration/transforms/user/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Configuration","item":"https://foxxmd.github.io/multi-scrobbler/configuration/"},{"@type":"ListItem","position":2,"name":"Enhance Scrobbles","item":"https://foxxmd.github.io/multi-scrobbler/configuration/transforms/"},{"@type":"ListItem","position":3,"name":"User Stage","item":"https://foxxmd.github.io/multi-scrobbler/configuration/transforms/user"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
development/dev-client/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Client Development/Tutorial | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/development/dev-client/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Client Development/Tutorial | Multi-Scrobbler"><meta data-rh="true" name="description" content="To do..."><meta data-rh="true" property="og:description" content="To do..."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/development/dev-client/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/development/dev-client/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/development/dev-client/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Development","item":"https://foxxmd.github.io/multi-scrobbler/category/development"},{"@type":"ListItem","position":2,"name":"Client Development/Tutorial","item":"https://foxxmd.github.io/multi-scrobbler/development/dev-client"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
development/dev-common/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Common Development | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/development/dev-common/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Common Development | Multi-Scrobbler"><meta data-rh="true" name="description" content="Start here for MS development"><meta data-rh="true" property="og:description" content="Start here for MS development"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/development/dev-common/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/development/dev-common/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/development/dev-common/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Development","item":"https://foxxmd.github.io/multi-scrobbler/category/development"},{"@type":"ListItem","position":2,"name":"Common Development","item":"https://foxxmd.github.io/multi-scrobbler/development/dev-common"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
development/dev-source/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Source Development/Tutorial | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/development/dev-source/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Source Development/Tutorial | Multi-Scrobbler"><meta data-rh="true" name="description" content="This document will provide a step-by-step guide for creating a (trivial) new Source in MS alongside describing what aspects of the Source need to be implemented based on the service you use. Before using this document you should review Common Development."><meta data-rh="true" property="og:description" content="This document will provide a step-by-step guide for creating a (trivial) new Source in MS alongside describing what aspects of the Source need to be implemented based on the service you use. Before using this document you should review Common Development."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/development/dev-source/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/development/dev-source/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/development/dev-source/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Development","item":"https://foxxmd.github.io/multi-scrobbler/category/development"},{"@type":"ListItem","position":2,"name":"Source Development/Tutorial","item":"https://foxxmd.github.io/multi-scrobbler/development/dev-source"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
development/flatpak/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Flatpak | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/development/flatpak/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Flatpak | Multi-Scrobbler"><meta data-rh="true" name="description" content="Building Flatpak App locally"><meta data-rh="true" property="og:description" content="Building Flatpak App locally"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/development/flatpak/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/development/flatpak/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/development/flatpak/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Development","item":"https://foxxmd.github.io/multi-scrobbler/category/development"},{"@type":"ListItem","position":2,"name":"Flatpak","item":"https://foxxmd.github.io/multi-scrobbler/development/flatpak"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+5 -3
index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Overview | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Overview | Multi-Scrobbler"><meta data-rh="true" name="description" content="Latest Release"><meta data-rh="true" property="og:description" content="Latest Release"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/" hreflang="x-default"><script data-rh="true">function insertBanner(){var n=document.createElement("div");n.id="__docusaurus-base-url-issue-banner-container";n.innerHTML='\n<div id="__docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">/multi-scrobbler/</span> </p>\n <p>We suggest trying baseUrl = <span id="__docusaurus-base-url-issue-banner-suggestion-container" style="font-weight: bold; color: green;"></span></p>\n</div>\n',document.body.prepend(n);var e=document.getElementById("__docusaurus-base-url-issue-banner-suggestion-container"),s=window.location.pathname,o="/"===s.substr(-1)?s:s+"/";e.innerHTML=o}document.addEventListener("DOMContentLoaded",(function(){void 0===window.docusaurus&&insertBanner()}))</script><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Overview","item":"https://foxxmd.github.io/multi-scrobbler/"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> ··· 29 29 <li><a href="/multi-scrobbler/configuration/sources/kodi/">Kodi</a></li> 30 30 <li><a href="/multi-scrobbler/configuration/sources/koito-source/">Koito</a></li> 31 31 <li><a href="/multi-scrobbler/configuration/sources/lastfm-source/">Last.fm</a></li> 32 + <li><a href="/multi-scrobbler/configuration/sources/librefm-source/">Libre.fm</a></li> 32 33 <li><a href="/multi-scrobbler/configuration/sources/lastfm-endpoint/">Last.fm (Endpoint)</a></li> 33 34 <li><a href="/multi-scrobbler/configuration/sources/listenbrainz-source/">ListenBrainz</a></li> 34 35 <li><a href="/multi-scrobbler/configuration/sources/listenbrainz-endpoint/">ListenBrainz (Endpoint)</a></li> ··· 52 53 <ul> 53 54 <li><a href="/multi-scrobbler/configuration/clients/koito/">Koito</a></li> 54 55 <li><a href="/multi-scrobbler/configuration/clients/lastfm/">Last.fm</a></li> 56 + <li><a href="/multi-scrobbler/configuration/clients/librefm/">Libre.fm</a></li> 55 57 <li><a href="/multi-scrobbler/configuration/clients/listenbrainz/">ListenBrainz</a></li> 56 58 <li><a href="/multi-scrobbler/configuration/clients/maloja/">Maloja</a></li> 57 59 <li><a href="/multi-scrobbler/configuration/clients/rocksky/">Rocksky</a></li>
+6 -3
installation/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Overview | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/installation/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Overview | Multi-Scrobbler"><meta data-rh="true" name="description" content="For the difference between ENV and File examples in this document see Configuration Types."><meta data-rh="true" property="og:description" content="For the difference between ENV and File examples in this document see Configuration Types."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/installation/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/installation/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/installation/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Installation","item":"https://foxxmd.github.io/multi-scrobbler/installation/"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> ··· 47 47 <li><code>id -u</code> -- prints UID</li> 48 48 <li><code>id -g</code> -- prints GID</li> 49 49 </ul></div></div> 50 + <h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="read-only">Read Only<a href="#read-only" class="hash-link" aria-label="Direct link to Read Only" title="Direct link to Read Only">​</a></h4> 51 + <p>MS can be hardended by setting the file system as read only with <a href="https://docs.docker.com/reference/compose-file/services/#read_only" target="_blank" rel="noopener noreferrer"><code>read_only</code></a>, with a few exceptions:</p> 52 + <div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">multi-scrobbler</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> foxxmd/multi</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">scrobbler</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">read_only</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">tmpfs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">exec</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /tmp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">noexec </span><br></span></code></pre></div></div> 50 53 <h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="docker-usage-example">Docker Usage Example<a href="#docker-usage-example" class="hash-link" aria-label="Direct link to Docker Usage Example" title="Direct link to Docker Usage Example">​</a></h3> 51 54 <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>See the <a href="/multi-scrobbler/quickstart/"><strong>Quick Start Guide</strong></a> for another guided docker-compose example</p></div></div> 52 55 <p>The example scenario:</p>
+3 -3
installation/service/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">As a Service | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/installation/service/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="As a Service | Multi-Scrobbler"><meta data-rh="true" name="description" content="If you have multi-scrobbler installed locally you can enable it to run as a background service when you login."><meta data-rh="true" property="og:description" content="If you have multi-scrobbler installed locally you can enable it to run as a background service when you login."><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/installation/service/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/installation/service/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/installation/service/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Installation","item":"https://foxxmd.github.io/multi-scrobbler/installation/"},{"@type":"ListItem","position":2,"name":"As a Service","item":"https://foxxmd.github.io/multi-scrobbler/installation/service"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
playground/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Playground | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/playground/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Playground | Multi-Scrobbler"><meta data-rh="true" name="description" content="Playground of docusaurus-json-schema-plugin"><meta data-rh="true" property="og:description" content="Playground of docusaurus-json-schema-plugin"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/playground/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/playground/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/playground/" hreflang="x-default"><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+3 -3
quickstart/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Quickstart | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/quickstart/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Quickstart | Multi-Scrobbler"><meta data-rh="true" name="description" content="This guide will get you up and running with multi-scrobbler using Docker and docker compose. At the end of the guide you will have:"><meta data-rh="true" property="og:description" content="This guide will get you up and running with multi-scrobbler using Docker and docker compose. At the end of the guide you will have:"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/quickstart/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/quickstart/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/quickstart/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Quickstart","item":"https://foxxmd.github.io/multi-scrobbler/quickstart"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+1 -1
search-index.json
··· 1 - [{"documents":[{"i":1,"t":"Overview","u":"/multi-scrobbler/configuration/","b":["Docs","Configuration"]},{"i":25,"t":"Overview","u":"/multi-scrobbler/configuration/clients/","b":["Docs","Configuration","Scrobble Clients"]},{"i":34,"t":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","b":["Docs","Configuration","Scrobble Clients"]},{"i":38,"t":"Last.fm","u":"/multi-scrobbler/configuration/clients/lastfm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":42,"t":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","b":["Docs","Configuration","Scrobble Clients"]},{"i":46,"t":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","b":["Docs","Configuration","Scrobble Clients"]},{"i":50,"t":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","b":["Docs","Configuration","Scrobble Clients"]},{"i":57,"t":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":64,"t":"Example Complex Scenario","u":"/multi-scrobbler/configuration/kitchensink/","b":["Docs","Configuration"]},{"i":70,"t":"Overview","u":"/multi-scrobbler/configuration/sources/","b":["Docs","Configuration","Scrobble Sources"]},{"i":85,"t":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":89,"t":"Deezer","u":"/multi-scrobbler/configuration/sources/deezer/","b":["Docs","Configuration","Scrobble Sources"]},{"i":97,"t":"Google Cast (Chromecast)","u":"/multi-scrobbler/configuration/sources/google-cast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":101,"t":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":105,"t":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","b":["Docs","Configuration","Scrobble Sources"]},{"i":111,"t":"Kodi","u":"/multi-scrobbler/configuration/sources/kodi/","b":["Docs","Configuration","Scrobble Sources"]},{"i":117,"t":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":119,"t":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","b":["Docs","Configuration","Scrobble Sources"]},{"i":125,"t":"Lastfm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":129,"t":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","b":["Docs","Configuration","Scrobble Sources"]},{"i":131,"t":"Listenbrainz (Endpoint)","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","b":["Docs","Configuration","Scrobble Sources"]},{"i":139,"t":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":143,"t":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","b":["Docs","Configuration","Scrobble Sources"]},{"i":147,"t":"Mopidy","u":"/multi-scrobbler/configuration/sources/mopidy/","b":["Docs","Configuration","Scrobble Sources"]},{"i":155,"t":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","b":["Docs","Configuration","Scrobble Sources"]},{"i":159,"t":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","b":["Docs","Configuration","Scrobble Sources"]},{"i":163,"t":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","b":["Docs","Configuration","Scrobble Sources"]},{"i":167,"t":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","b":["Docs","Configuration","Scrobble Sources"]},{"i":169,"t":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":175,"t":"Spotify","u":"/multi-scrobbler/configuration/sources/spotify/","b":["Docs","Configuration","Scrobble Sources"]},{"i":179,"t":"Subsonic","u":"/multi-scrobbler/configuration/sources/subsonic/","b":["Docs","Configuration","Scrobble Sources"]},{"i":183,"t":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":191,"t":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","b":["Docs","Configuration","Scrobble Sources"]},{"i":195,"t":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","b":["Docs","Configuration","Scrobble Sources"]},{"i":203,"t":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":207,"t":"Youtube Music","u":"/multi-scrobbler/configuration/sources/youtube-music/","b":["Docs","Configuration","Scrobble Sources"]},{"i":211,"t":"Enhancing Scrobbles","u":"/multi-scrobbler/configuration/transforms/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":233,"t":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":277,"t":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":298,"t":"Client Development/Tutorial","u":"/multi-scrobbler/development/dev-client/","b":["Docs","Development"]},{"i":300,"t":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":317,"t":"Development","u":"/multi-scrobbler/development/dev-common/","b":["Docs","Development"]},{"i":334,"t":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","b":["Docs","Development"]},{"i":356,"t":"Flatpak","u":"/multi-scrobbler/development/flatpak/","b":["Docs","Development"]},{"i":369,"t":"FAQ","u":"/multi-scrobbler/FAQ/","b":["Docs"]},{"i":391,"t":"Overview","u":"/multi-scrobbler/installation/","b":["Docs","Installation"]},{"i":403,"t":"Systemd","u":"/multi-scrobbler/installation/service/","b":["Docs","Installation"]},{"i":411,"t":"Quickstart","u":"/multi-scrobbler/quickstart/","b":["Docs"]},{"i":429,"t":"Overview","u":"/multi-scrobbler/","b":["Docs"]},{"i":451,"t":"Overview","u":"/multi-scrobbler/updating/","b":["Docs","Updating"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,2.299]],["t/25",[0,2.299]],["t/34",[1,3.365]],["t/38",[2,3.935]],["t/42",[3,2.989]],["t/46",[4,3.365]],["t/50",[5,3.365]],["t/57",[6,3.365]],["t/64",[7,2.34,8,2.34,9,2.34]],["t/70",[0,2.299]],["t/85",[10,3.935]],["t/89",[11,3.935]],["t/97",[12,2.34,13,2.34,14,2.34]],["t/101",[15,3.935]],["t/105",[16,3.935]],["t/111",[17,3.935]],["t/117",[1,3.365]],["t/119",[18,2.51,19,2.51]],["t/125",[18,3.365]],["t/129",[20,3.935]],["t/131",[3,2.23,19,2.51]],["t/139",[3,2.989]],["t/143",[4,3.365]],["t/147",[21,3.935]],["t/155",[22,1.946,23,1.664,24,1.946,25,1.946]],["t/159",[26,3.935]],["t/163",[27,3.935]],["t/167",[28,3.935]],["t/169",[5,3.365]],["t/175",[29,3.935]],["t/179",[30,3.935]],["t/183",[6,3.365]],["t/191",[31,3.935]],["t/195",[32,3.935]],["t/203",[33,2.935,34,2.935]],["t/207",[23,2.51,35,2.935]],["t/211",[36,2.935,37,2.935]],["t/233",[38,2.935,39,2.23]],["t/277",[39,2.23,40,2.935]],["t/298",[41,2.935,42,2.51]],["t/300",[39,2.23,43,2.935]],["t/317",[44,3.935]],["t/334",[42,2.51,45,2.935]],["t/356",[46,3.935]],["t/369",[47,3.935]],["t/391",[0,2.299]],["t/403",[48,3.935]],["t/411",[49,3.935]],["t/429",[0,2.299]],["t/451",[0,2.299]]],"invertedIndex":[["azuracast",{"_index":10,"t":{"85":{"position":[[0,9]]}}}],["cast",{"_index":13,"t":{"97":{"position":[[7,4]]}}}],["chromecast",{"_index":14,"t":{"97":{"position":[[12,12]]}}}],["client",{"_index":41,"t":{"298":{"position":[[0,6]]}}}],["complex",{"_index":8,"t":{"64":{"position":[[8,7]]}}}],["daemon",{"_index":25,"t":{"155":{"position":[[18,7]]}}}],["deezer",{"_index":11,"t":{"89":{"position":[[0,6]]}}}],["develop",{"_index":44,"t":{"317":{"position":[[0,11]]}}}],["development/tutori",{"_index":42,"t":{"298":{"position":[[7,20]]},"334":{"position":[[7,20]]}}}],["endpoint",{"_index":19,"t":{"119":{"position":[[7,10]]},"131":{"position":[[13,10]]}}}],["enhanc",{"_index":36,"t":{"211":{"position":[[0,9]]}}}],["exampl",{"_index":7,"t":{"64":{"position":[[0,7]]}}}],["faq",{"_index":47,"t":{"369":{"position":[[0,3]]}}}],["flatpak",{"_index":46,"t":{"356":{"position":[[0,7]]}}}],["googl",{"_index":12,"t":{"97":{"position":[[0,6]]}}}],["icecast",{"_index":15,"t":{"101":{"position":[[0,7]]}}}],["jellyfin",{"_index":20,"t":{"129":{"position":[[0,8]]}}}],["jriver",{"_index":16,"t":{"105":{"position":[[0,6]]}}}],["kodi",{"_index":17,"t":{"111":{"position":[[0,4]]}}}],["koito",{"_index":1,"t":{"34":{"position":[[0,5]]},"117":{"position":[[0,5]]}}}],["last.fm",{"_index":2,"t":{"38":{"position":[[0,7]]}}}],["lastfm",{"_index":18,"t":{"119":{"position":[[0,6]]},"125":{"position":[[0,6]]}}}],["listenbrainz",{"_index":3,"t":{"42":{"position":[[0,12]]},"131":{"position":[[0,12]]},"139":{"position":[[0,12]]}}}],["maloja",{"_index":4,"t":{"46":{"position":[[0,6]]},"143":{"position":[[0,6]]}}}],["mopidi",{"_index":21,"t":{"147":{"position":[[0,6]]}}}],["mpd",{"_index":22,"t":{"155":{"position":[[0,3]]}}}],["mpri",{"_index":26,"t":{"159":{"position":[[0,5]]}}}],["music",{"_index":23,"t":{"155":{"position":[[4,6]]},"207":{"position":[[8,5]]}}}],["musicbrainz",{"_index":38,"t":{"233":{"position":[[0,11]]}}}],["musiccast",{"_index":34,"t":{"203":{"position":[[7,9]]}}}],["musikcub",{"_index":27,"t":{"163":{"position":[[0,9]]}}}],["nativ",{"_index":43,"t":{"300":{"position":[[0,6]]}}}],["overview",{"_index":0,"t":{"1":{"position":[[0,8]]},"25":{"position":[[0,8]]},"70":{"position":[[0,8]]},"391":{"position":[[0,8]]},"429":{"position":[[0,8]]},"451":{"position":[[0,8]]}}}],["player",{"_index":24,"t":{"155":{"position":[[11,6]]}}}],["plex",{"_index":28,"t":{"167":{"position":[[0,4]]}}}],["quickstart",{"_index":49,"t":{"411":{"position":[[0,10]]}}}],["rockski",{"_index":5,"t":{"50":{"position":[[0,7]]},"169":{"position":[[0,7]]}}}],["scenario",{"_index":9,"t":{"64":{"position":[[16,8]]}}}],["scrobbl",{"_index":37,"t":{"211":{"position":[[10,9]]}}}],["sourc",{"_index":45,"t":{"334":{"position":[[0,6]]}}}],["spotifi",{"_index":29,"t":{"175":{"position":[[0,7]]}}}],["stage",{"_index":39,"t":{"233":{"position":[[12,5]]},"277":{"position":[[5,5]]},"300":{"position":[[7,5]]}}}],["subson",{"_index":30,"t":{"179":{"position":[[0,8]]}}}],["systemd",{"_index":48,"t":{"403":{"position":[[0,7]]}}}],["teal.fm",{"_index":6,"t":{"57":{"position":[[0,7]]},"183":{"position":[[0,7]]}}}],["user",{"_index":40,"t":{"277":{"position":[[0,4]]}}}],["vlc",{"_index":31,"t":{"191":{"position":[[0,3]]}}}],["webscrobbl",{"_index":32,"t":{"195":{"position":[[0,12]]}}}],["yamaha",{"_index":33,"t":{"203":{"position":[[0,6]]}}}],["youtub",{"_index":35,"t":{"207":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Configuration Types","u":"/multi-scrobbler/configuration/","h":"#configuration-types","p":1},{"i":5,"t":"Setup Sources and Clients","u":"/multi-scrobbler/configuration/","h":"#setup-sources-and-clients","p":1},{"i":7,"t":"Secrets Interpolation","u":"/multi-scrobbler/configuration/","h":"#secrets-interpolation","p":1},{"i":9,"t":"Application Options","u":"/multi-scrobbler/configuration/","h":"#application-options","p":1},{"i":11,"t":"Base URL","u":"/multi-scrobbler/configuration/","h":"#base-url","p":1},{"i":13,"t":"Caching","u":"/multi-scrobbler/configuration/","h":"#caching","p":1},{"i":15,"t":"Debug Mode","u":"/multi-scrobbler/configuration/","h":"#debug-mode","p":1},{"i":17,"t":"Disable Web","u":"/multi-scrobbler/configuration/","h":"#disable-web","p":1},{"i":19,"t":"Monitoring","u":"/multi-scrobbler/configuration/","h":"#monitoring","p":1},{"i":21,"t":"Webhook Configurations","u":"/multi-scrobbler/configuration/","h":"#webhook-configurations","p":1},{"i":23,"t":"Health Endpoint","u":"/multi-scrobbler/configuration/","h":"#health-endpoint","p":1},{"i":27,"t":"Clients","u":"/multi-scrobbler/configuration/clients/","h":"#clients","p":25},{"i":29,"t":"Features","u":"/multi-scrobbler/configuration/clients/","h":"#features","p":25},{"i":30,"t":"Dead Scrobbles","u":"/multi-scrobbler/configuration/clients/","h":"#dead-scrobbles","p":25},{"i":32,"t":"Now Playing","u":"/multi-scrobbler/configuration/clients/","h":"#now-playing","p":25},{"i":36,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/koito/","h":"#configuration","p":34},{"i":40,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#configuration","p":38},{"i":44,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"#configuration","p":42},{"i":48,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/maloja/","h":"#configuration","p":46},{"i":52,"t":"Setup","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#setup","p":50},{"i":54,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#configuration","p":50},{"i":55,"t":"Handle","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#handle","p":50},{"i":59,"t":"Setup","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#setup","p":57},{"i":61,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#configuration","p":57},{"i":62,"t":"Identifier","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#identifier","p":57},{"i":66,"t":"All-in-one Config","u":"/multi-scrobbler/configuration/kitchensink/","h":"#all-in-one-config","p":64},{"i":68,"t":"Separate JSON files","u":"/multi-scrobbler/configuration/kitchensink/","h":"#separate-json-files","p":64},{"i":72,"t":"Sources","u":"/multi-scrobbler/configuration/sources/","h":"#sources","p":70},{"i":74,"t":"Features","u":"/multi-scrobbler/configuration/sources/","h":"#features","p":70},{"i":75,"t":"Types of Sources","u":"/multi-scrobbler/configuration/sources/","h":"#types-of-sources","p":70},{"i":77,"t":"Multi-Device/User","u":"/multi-scrobbler/configuration/sources/","h":"#multi-deviceuser","p":70},{"i":79,"t":"Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/sources/","h":"#limiting-scrobble-destination","p":70},{"i":81,"t":"Scrobble Thresholds","u":"/multi-scrobbler/configuration/sources/","h":"#scrobble-thresholds","p":70},{"i":83,"t":"Should Scrobble Behavior","u":"/multi-scrobbler/configuration/sources/","h":"#should-scrobble-behavior","p":70},{"i":87,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#configuration","p":85},{"i":91,"t":"Retrieve ARL","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#retrieve-arl","p":89},{"i":93,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#configuration","p":89},{"i":95,"t":"Duplicate detection","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#duplicate-detection","p":89},{"i":99,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"#configuration","p":97},{"i":103,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/icecast/","h":"#configuration","p":101},{"i":107,"t":"URL","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#url","p":105},{"i":109,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#configuration","p":105},{"i":113,"t":"URL","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#url","p":111},{"i":115,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#configuration","p":111},{"i":121,"t":"URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#url","p":119},{"i":123,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#configuration","p":119},{"i":127,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"#configuration","p":125},{"i":133,"t":"URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#url","p":131},{"i":135,"t":"Token","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#token","p":131},{"i":137,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#configuration","p":131},{"i":141,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"#configuration","p":139},{"i":145,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/maloja/","h":"#configuration","p":143},{"i":149,"t":"URI Blacklist/Whitelist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#uri-blacklistwhitelist","p":147},{"i":151,"t":"Album Blacklist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#album-blacklist","p":147},{"i":153,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#configuration","p":147},{"i":157,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mpd/","h":"#configuration","p":155},{"i":161,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mpris/","h":"#configuration","p":159},{"i":165,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"#configuration","p":163},{"i":171,"t":"Setup","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#setup","p":169},{"i":173,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#configuration","p":169},{"i":177,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/spotify/","h":"#configuration","p":175},{"i":181,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#configuration","p":179},{"i":185,"t":"Setup","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#setup","p":183},{"i":187,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#configuration","p":183},{"i":189,"t":"Service Filtering","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#service-filtering","p":183},{"i":193,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/vlc/","h":"#configuration","p":191},{"i":197,"t":"Multiple Users","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#multiple-users","p":195},{"i":199,"t":"Connectors Black/Whitelist","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#connectors-blackwhitelist","p":195},{"i":201,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#configuration","p":195},{"i":205,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"#configuration","p":203},{"i":209,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"#configuration","p":207},{"i":213,"t":"Journey of a Scrobble","u":"/multi-scrobbler/configuration/transforms/","h":"#journey-of-a-scrobble","p":211},{"i":215,"t":"Lifecyle Hooks","u":"/multi-scrobbler/configuration/transforms/","h":"#lifecyle-hooks","p":211},{"i":217,"t":"Hook","u":"/multi-scrobbler/configuration/transforms/","h":"#hook","p":211},{"i":219,"t":"Modification Stage","u":"/multi-scrobbler/configuration/transforms/","h":"#stage","p":211},{"i":221,"t":"Configuring Stages","u":"/multi-scrobbler/configuration/transforms/","h":"#configuring-stages","p":211},{"i":223,"t":"Rules for Play Data","u":"/multi-scrobbler/configuration/transforms/","h":"#stage-rules","p":211},{"i":225,"t":"Stage Flow Control","u":"/multi-scrobbler/configuration/transforms/","h":"#flow-control","p":211},{"i":227,"t":"Conditionally Run","u":"/multi-scrobbler/configuration/transforms/","h":"#conditional-modification","p":211},{"i":229,"t":"Logging","u":"/multi-scrobbler/configuration/transforms/","h":"#logging","p":211},{"i":231,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/","h":"#examples","p":211},{"i":235,"t":"More Than Mainstream Data","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":233},{"i":237,"t":"As The Artist Intended","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":233},{"i":239,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#configuration","p":233},{"i":240,"t":"API Setup","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#api-setup","p":233},{"i":242,"t":"Stage Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#stage-configuration","p":233},{"i":244,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#rules","p":233},{"i":246,"t":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#env-configuration","p":233},{"i":248,"t":"Matching with Musicbrainz","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#matching-with-musicbrainz","p":233},{"i":250,"t":"Searching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#searching","p":233},{"i":252,"t":"Refining","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#refining","p":233},{"i":253,"t":"Score","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#score","p":233},{"i":255,"t":"Filtering","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filtering","p":233},{"i":257,"t":"Sorting","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sorting","p":233},{"i":259,"t":"Best Practices","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#best-practices","p":233},{"i":260,"t":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default","p":233},{"i":262,"t":"Filter Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filter-considerations","p":233},{"i":264,"t":"Using Partial Match","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#using-partial-match","p":233},{"i":266,"t":"Logging","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#logging","p":233},{"i":268,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#examples","p":233},{"i":269,"t":"Minimal","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#minimal","p":233},{"i":271,"t":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default-1","p":233},{"i":273,"t":"Add Metadata Only (No Scrobble Modification)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#add-metadata-only-no-scrobble-modification","p":233},{"i":275,"t":"Use Native Stage if no Musicbrainz Matches","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-native-stage-if-no-musicbrainz-matches","p":233},{"i":279,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/user/","h":"#configuration","p":277},{"i":281,"t":"Search-And-Replace Expression","u":"/multi-scrobbler/configuration/transforms/user/","h":"#search-and-replace-expression","p":277},{"i":283,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rules","p":277},{"i":285,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/user/","h":"#examples","p":277},{"i":286,"t":"Usage with when condition","u":"/multi-scrobbler/configuration/transforms/user/","h":"#usage-with-when-condition","p":277},{"i":288,"t":"Remove phrase from Title in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-phrase-from-title-in-all-new-plays","p":277},{"i":290,"t":"Remove all parenthesized content from the end of a title","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-all-parenthesized-content-from-the-end-of-a-title","p":277},{"i":292,"t":"Rename misspelled artist in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rename-misspelled-artist-in-all-new-plays","p":277},{"i":294,"t":"Remove \"Various Artists\" albums in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-various-artists-albums-in-all-new-plays","p":277},{"i":296,"t":"Extract primary Artist from delimited, multi-Artist string","u":"/multi-scrobbler/configuration/transforms/user/","h":"#extract-primary-artist-from-delimited-multi-artist-string","p":277},{"i":302,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#configuration","p":300},{"i":304,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/native/","h":"#rules","p":300},{"i":306,"t":"Default Stage","u":"/multi-scrobbler/configuration/transforms/native/","h":"#default-stage","p":300},{"i":308,"t":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#env-configuration","p":300},{"i":310,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/native/","h":"#examples","p":300},{"i":311,"t":"Parse only artists string using a custom delimiter","u":"/multi-scrobbler/configuration/transforms/native/","h":"#parse-only-artists-string-using-a-custom-delimiter","p":300},{"i":313,"t":"Don't parse specific artists","u":"/multi-scrobbler/configuration/transforms/native/","h":"#dont-parse-specific-artists","p":300},{"i":315,"t":"Extract Artists from Title but do not modify Title","u":"/multi-scrobbler/configuration/transforms/native/","h":"#extract-artists-from-title-but-do-not-modify-title","p":300},{"i":318,"t":"Architecture","u":"/multi-scrobbler/development/dev-common/","h":"#architecture","p":317},{"i":320,"t":"Project Setup","u":"/multi-scrobbler/development/dev-common/","h":"#project-setup","p":317},{"i":322,"t":"VSCode","u":"/multi-scrobbler/development/dev-common/","h":"#vscode","p":317},{"i":324,"t":"Common Development","u":"/multi-scrobbler/development/dev-common/","h":"#common-development","p":317},{"i":326,"t":"Config","u":"/multi-scrobbler/development/dev-common/","h":"#config","p":317},{"i":328,"t":"Concrete Class","u":"/multi-scrobbler/development/dev-common/","h":"#concrete-class","p":317},{"i":330,"t":"Play Object","u":"/multi-scrobbler/development/dev-common/","h":"#play-object","p":317},{"i":332,"t":"Creating Clients and Sources","u":"/multi-scrobbler/development/dev-common/","h":"#creating-clients-and-sources","p":317},{"i":336,"t":"Scenario","u":"/multi-scrobbler/development/dev-source/","h":"#scenario","p":334},{"i":338,"t":"Minimal Implementation","u":"/multi-scrobbler/development/dev-source/","h":"#minimal-implementation","p":334},{"i":339,"t":"Define and Implement Config","u":"/multi-scrobbler/development/dev-source/","h":"#define-and-implement-config","p":334},{"i":341,"t":"Create CoolPlayer Source","u":"/multi-scrobbler/development/dev-source/","h":"#create-coolplayer-source","p":334},{"i":343,"t":"Initialize Source from Config","u":"/multi-scrobbler/development/dev-source/","h":"#initialize-source-from-config","p":334},{"i":345,"t":"Implement Play Object Transform","u":"/multi-scrobbler/development/dev-source/","h":"#implement-play-object-transform","p":334},{"i":347,"t":"Implement Stages","u":"/multi-scrobbler/development/dev-source/","h":"#implement-stages","p":334},{"i":349,"t":"Implement Polling","u":"/multi-scrobbler/development/dev-source/","h":"#implement-polling","p":334},{"i":351,"t":"Further Implementation","u":"/multi-scrobbler/development/dev-source/","h":"#further-implementation","p":334},{"i":352,"t":"Backlog","u":"/multi-scrobbler/development/dev-source/","h":"#backlog","p":334},{"i":354,"t":"Other Source Types","u":"/multi-scrobbler/development/dev-source/","h":"#other-source-types","p":334},{"i":357,"t":"Install Requirements","u":"/multi-scrobbler/development/flatpak/","h":"#install-requirements","p":356},{"i":358,"t":"Flatpak and flatpak-builder","u":"/multi-scrobbler/development/flatpak/","h":"#flatpak-and-flatpak-builder","p":356},{"i":360,"t":"Update Project source","u":"/multi-scrobbler/development/flatpak/","h":"#update-project-source","p":356},{"i":362,"t":"Generate Sources and Build","u":"/multi-scrobbler/development/flatpak/","h":"#generate-sources-and-build","p":356},{"i":363,"t":"Use Setup Script","u":"/multi-scrobbler/development/flatpak/","h":"#use-setup-script","p":356},{"i":365,"t":"Manual Setup","u":"/multi-scrobbler/development/flatpak/","h":"#manual-setup","p":356},{"i":367,"t":"Run App","u":"/multi-scrobbler/development/flatpak/","h":"","p":356},{"i":370,"t":"Connection Issues","u":"/multi-scrobbler/FAQ/","h":"#connection-issues","p":369},{"i":371,"t":"Webscrobbler/Listenbrainz Endpoint doesn't connect","u":"/multi-scrobbler/FAQ/","h":"#ingress-connection","p":369},{"i":373,"t":"Spotify/Deezer/LastFM won't authenticate","u":"/multi-scrobbler/FAQ/","h":"#spotifydeezerlastfm-wont-authenticate","p":369},{"i":375,"t":"Youtube Music fails after some time","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-fails-after-some-time","p":369},{"i":377,"t":"Configuration Issues","u":"/multi-scrobbler/FAQ/","h":"#configuration-issues","p":369},{"i":378,"t":"Config could not be parsed","u":"/multi-scrobbler/FAQ/","h":"#config-could-not-be-parsed","p":369},{"i":380,"t":"Scrobbling Issues","u":"/multi-scrobbler/FAQ/","h":"#scrobbling-issues","p":369},{"i":381,"t":"Last.fm does not scrobble tracks with multiple artists correctly","u":"/multi-scrobbler/FAQ/","h":"#lastfm-does-not-scrobble-tracks-with-multiple-artists-correctly","p":369},{"i":383,"t":"Google Cast track information is missing/incorrect or MS player has weird times","u":"/multi-scrobbler/FAQ/","h":"#google-cast-track-information-is-missingincorrect-or-ms-player-has-weird-times","p":369},{"i":385,"t":"Google Cast device does not track media","u":"/multi-scrobbler/FAQ/","h":"#google-cast-device-does-not-track-media","p":369},{"i":387,"t":"VLC is not scrobbling fields correctly","u":"/multi-scrobbler/FAQ/","h":"#vlc-is-not-scrobbling-fields-correctly","p":369},{"i":389,"t":"Youtube Music misses or duplicates scrobbles","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-misses-or-duplicates-scrobbles","p":369},{"i":393,"t":"Docker","u":"/multi-scrobbler/installation/","h":"#docker","p":391},{"i":395,"t":"Docker Usage Example","u":"/multi-scrobbler/installation/","h":"#docker-usage-example","p":391},{"i":397,"t":"Local Installation","u":"/multi-scrobbler/installation/","h":"#local-installation","p":391},{"i":399,"t":"Nodejs","u":"/multi-scrobbler/installation/","h":"#nodejs","p":391},{"i":401,"t":"Flatpak","u":"/multi-scrobbler/installation/","h":"#flatpak","p":391},{"i":405,"t":"Create A Unit File","u":"/multi-scrobbler/installation/service/","h":"#create-a-unit-file","p":403},{"i":407,"t":"Start the Service","u":"/multi-scrobbler/installation/service/","h":"#start-the-service","p":403},{"i":409,"t":"Other Service Methods","u":"/multi-scrobbler/installation/service/","h":"","p":403},{"i":413,"t":"Create Docker Compose File","u":"/multi-scrobbler/quickstart/","h":"#create-docker-compose-file","p":411},{"i":415,"t":"Setup Sources","u":"/multi-scrobbler/quickstart/","h":"#setup-sources","p":411},{"i":417,"t":"(Optional) Correct Scrobbles with Musicbrainz","u":"/multi-scrobbler/quickstart/","h":"#optional-correct-scrobbles-with-musicbrainz","p":411},{"i":419,"t":"Configure Musicbrainz API","u":"/multi-scrobbler/quickstart/","h":"","p":411},{"i":421,"t":"Enable Musicbrainz For A Source","u":"/multi-scrobbler/quickstart/","h":"","p":411},{"i":423,"t":"Setup Clients","u":"/multi-scrobbler/quickstart/","h":"#setup-clients","p":411},{"i":425,"t":"Start Multi-Scrobbler","u":"/multi-scrobbler/quickstart/","h":"#start-multi-scrobbler","p":411},{"i":427,"t":"Next Steps","u":"/multi-scrobbler/quickstart/","h":"#next-steps","p":411},{"i":431,"t":"How Does multi-scrobbler (MS) Work?","u":"/multi-scrobbler/","h":"#how-does-multi-scrobbler-ms-work","p":429},{"i":433,"t":"Source","u":"/multi-scrobbler/","h":"#source","p":429},{"i":435,"t":"Client","u":"/multi-scrobbler/","h":"#client","p":429},{"i":437,"t":"Quick Start","u":"/multi-scrobbler/","h":"#quick-start","p":429},{"i":439,"t":"Installation","u":"/multi-scrobbler/","h":"#installation","p":429},{"i":441,"t":"Configuration","u":"/multi-scrobbler/","h":"#configuration","p":429},{"i":443,"t":"Usage","u":"/multi-scrobbler/","h":"#usage","p":429},{"i":445,"t":"Help/FAQ","u":"/multi-scrobbler/","h":"#helpfaq","p":429},{"i":447,"t":"Development","u":"/multi-scrobbler/","h":"#development","p":429},{"i":449,"t":"License","u":"/multi-scrobbler/","h":"#license","p":429},{"i":452,"t":"Updating","u":"/multi-scrobbler/updating/","h":"#updating","p":451},{"i":454,"t":"Docker","u":"/multi-scrobbler/updating/","h":"#docker","p":451},{"i":456,"t":"Nodejs","u":"/multi-scrobbler/updating/","h":"#nodejs","p":451}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,1.523,1,3.999]],["t/5",[2,2.332,3,2.262,4,2.945]],["t/7",[5,4.847,6,4.847]],["t/9",[7,4.847,8,4.335]],["t/11",[9,4.847,10,3.546]],["t/13",[11,6.091]],["t/15",[12,4.847,13,4.847]],["t/17",[14,4.847,15,4.847]],["t/19",[16,6.091]],["t/21",[0,1.523,17,4.847]],["t/23",[18,4.847,19,4.335]],["t/27",[4,4.456]],["t/29",[20,5.448]],["t/30",[21,4.847,22,2.808]],["t/32",[23,4.847,24,3.236]],["t/36",[0,1.914]],["t/40",[0,1.914]],["t/44",[0,1.914]],["t/48",[0,1.914]],["t/52",[2,3.528]],["t/54",[0,1.914]],["t/55",[25,6.091]],["t/59",[2,3.528]],["t/61",[0,1.914]],["t/62",[26,6.091]],["t/66",[27,4.847,28,3.546]],["t/68",[29,4.025,30,4.025,31,3.32]],["t/72",[3,3.423]],["t/74",[20,5.448]],["t/75",[1,3.999,3,2.724]],["t/77",[32,3.747,33,4.847]],["t/79",[22,2.332,34,4.025,35,4.025]],["t/81",[22,2.808,36,4.847]],["t/83",[22,2.808,37,4.847]],["t/87",[0,1.914]],["t/91",[38,4.847,39,4.847]],["t/93",[0,1.914]],["t/95",[40,4.335,41,4.847]],["t/99",[0,1.914]],["t/103",[0,1.914]],["t/107",[10,4.456]],["t/109",[0,1.914]],["t/113",[10,4.456]],["t/115",[0,1.914]],["t/121",[10,4.456]],["t/123",[0,1.914]],["t/127",[0,1.914]],["t/133",[10,4.456]],["t/135",[42,6.091]],["t/137",[0,1.914]],["t/141",[0,1.914]],["t/145",[0,1.914]],["t/149",[43,4.847,44,4.847]],["t/151",[45,4.335,46,4.847]],["t/153",[0,1.914]],["t/157",[0,1.914]],["t/161",[0,1.914]],["t/165",[0,1.914]],["t/171",[2,3.528]],["t/173",[0,1.914]],["t/177",[0,1.914]],["t/181",[0,1.914]],["t/185",[2,3.528]],["t/187",[0,1.914]],["t/189",[47,3.999,48,3.999]],["t/193",[0,1.914]],["t/197",[49,4.335,50,4.847]],["t/199",[51,4.847,52,4.847]],["t/201",[0,1.914]],["t/205",[0,1.914]],["t/209",[0,1.914]],["t/213",[22,2.808,53,4.847]],["t/215",[54,4.847,55,4.335]],["t/217",[55,5.448]],["t/219",[56,4.335,57,3.236]],["t/221",[0,1.523,57,3.236]],["t/223",[24,2.687,58,3.112,59,3.6]],["t/225",[57,2.687,60,4.025,61,4.025]],["t/227",[62,4.847,63,4.335]],["t/229",[64,5.448]],["t/231",[65,4.456]],["t/235",[59,3.6,66,4.025,67,4.025]],["t/237",[68,3.11,69,4.847]],["t/239",[0,1.914]],["t/240",[2,2.808,70,4.335]],["t/242",[0,1.523,57,3.236]],["t/244",[58,4.709]],["t/246",[0,1.523,71,4.335]],["t/248",[72,3.999,73,3.546]],["t/250",[74,5.448]],["t/252",[75,6.091]],["t/253",[76,6.091]],["t/255",[48,5.025]],["t/257",[77,6.091]],["t/259",[78,4.847,79,4.847]],["t/260",[80,4.335,81,3.999]],["t/262",[48,3.999,82,4.847]],["t/264",[72,3.32,83,3.112,84,4.025]],["t/266",[64,5.448]],["t/268",[65,4.456]],["t/269",[85,5.448]],["t/271",[80,4.335,81,3.999]],["t/273",[22,1.993,56,3.078,86,3.441,87,3.441]],["t/275",[57,2.006,72,2.479,73,2.199,83,2.323,88,3.005]],["t/279",[0,1.914]],["t/281",[74,3.6,89,4.025,90,4.025]],["t/283",[58,4.709]],["t/285",[65,4.456]],["t/286",[91,3.999,92,4.847]],["t/288",[24,2.006,93,2.479,94,3.005,95,2.479,96,2.479]],["t/290",[93,2.479,95,2.479,97,3.005,98,3.005,99,3.005]],["t/292",[24,2.006,68,1.929,96,2.479,100,3.005,101,3.005]],["t/294",[24,1.781,45,2.386,68,1.712,93,2.201,96,2.201,102,2.668]],["t/296",[32,1.854,68,2.512,103,2.145,104,2.398,105,2.145,106,2.145]],["t/302",[0,1.914]],["t/304",[58,4.709]],["t/306",[57,3.236,81,3.999]],["t/308",[0,1.523,71,4.335]],["t/310",[65,4.456]],["t/311",[68,1.712,83,2.062,105,2.386,106,2.386,107,2.201,108,2.668]],["t/313",[68,2.208,107,2.839,109,3.441,110,3.441]],["t/315",[68,1.929,95,3.868,103,2.688,111,3.005]],["t/318",[112,6.091]],["t/320",[2,2.808,113,4.335]],["t/322",[114,6.091]],["t/324",[115,4.847,116,4.335]],["t/326",[28,4.456]],["t/328",[117,4.847,118,4.847]],["t/330",[24,3.236,119,4.335]],["t/332",[3,2.262,4,2.945,120,3.112]],["t/336",[121,6.091]],["t/338",[85,4.335,122,3.379]],["t/339",[28,2.945,122,2.806,123,4.025]],["t/341",[3,2.262,120,3.112,124,4.025]],["t/343",[3,2.262,28,2.945,125,4.025]],["t/345",[24,2.297,119,3.078,122,2.399,126,3.441]],["t/347",[57,3.236,122,3.379]],["t/349",[122,3.379,127,4.847]],["t/351",[122,3.379,128,4.847]],["t/352",[129,6.091]],["t/354",[1,3.999,3,2.724]],["t/357",[130,3.999,131,4.847]],["t/358",[132,5.226,133,4.025]],["t/360",[3,2.262,113,3.6,134,3.6]],["t/362",[3,2.262,135,4.025,136,4.025]],["t/363",[2,2.332,83,3.112,137,4.025]],["t/365",[2,2.808,138,4.847]],["t/367",[63,4.335,139,4.847]],["t/370",[140,4.335,141,3.999]],["t/371",[19,3.078,140,3.078,142,3.441,143,3.441]],["t/373",[144,4.025,145,4.025,146,4.025]],["t/375",[147,3.078,148,3.078,149,3.441,150,3.078]],["t/377",[0,1.523,141,3.999]],["t/378",[28,3.546,107,3.999]],["t/380",[22,2.808,141,3.999]],["t/381",[22,1.545,49,2.386,68,1.712,151,2.668,152,2.201,153,2.386]],["t/383",[150,1.784,152,1.646,154,1.784,155,1.784,156,1.995,157,1.995,158,1.784,159,1.995,160,1.995]],["t/385",[152,2.479,154,2.688,155,2.688,161,3.005,162,3.005]],["t/387",[22,1.993,153,3.078,163,3.441,164,3.441]],["t/389",[22,1.741,40,2.688,147,2.688,148,2.688,165,3.005]],["t/393",[166,4.709]],["t/395",[65,2.945,91,3.32,166,3.112]],["t/397",[130,3.999,167,4.847]],["t/399",[168,5.448]],["t/401",[132,5.448]],["t/405",[31,3.32,120,3.112,169,4.025]],["t/407",[47,3.999,170,3.999]],["t/409",[47,3.999,171,4.847]],["t/413",[31,2.839,120,2.66,166,2.66,172,3.441]],["t/415",[2,2.808,3,2.724]],["t/417",[8,3.078,22,1.993,73,2.518,173,3.441]],["t/419",[0,1.265,70,3.6,73,2.945]],["t/421",[3,2.262,73,2.945,174,4.025]],["t/423",[2,2.808,4,3.546]],["t/425",[32,3.112,170,3.32,175,3.6]],["t/427",[176,4.847,177,4.847]],["t/431",[32,2.66,158,3.078,175,3.078,178,3.441]],["t/433",[3,3.423]],["t/435",[4,4.456]],["t/437",[170,3.999,179,4.847]],["t/439",[130,5.025]],["t/441",[0,1.914]],["t/443",[91,5.025]],["t/445",[180,6.091]],["t/447",[116,5.448]],["t/449",[181,6.091]],["t/452",[134,5.448]],["t/454",[166,4.709]],["t/456",[168,5.448]]],"invertedIndex":[["add",{"_index":86,"t":{"273":{"position":[[0,3]]}}}],["album",{"_index":45,"t":{"151":{"position":[[0,5]]},"294":{"position":[[25,6]]}}}],["api",{"_index":70,"t":{"240":{"position":[[0,3]]},"419":{"position":[[22,3]]}}}],["app",{"_index":139,"t":{"367":{"position":[[4,3]]}}}],["applic",{"_index":7,"t":{"9":{"position":[[0,11]]}}}],["architectur",{"_index":112,"t":{"318":{"position":[[0,12]]}}}],["arl",{"_index":39,"t":{"91":{"position":[[9,3]]}}}],["artist",{"_index":68,"t":{"237":{"position":[[7,6]]},"292":{"position":[[18,6]]},"294":{"position":[[16,8]]},"296":{"position":[[16,6],[45,6]]},"311":{"position":[[11,7]]},"313":{"position":[[21,7]]},"315":{"position":[[8,7]]},"381":{"position":[[47,7]]}}}],["authent",{"_index":146,"t":{"373":{"position":[[28,12]]}}}],["backlog",{"_index":129,"t":{"352":{"position":[[0,7]]}}}],["base",{"_index":9,"t":{"11":{"position":[[0,4]]}}}],["behavior",{"_index":37,"t":{"83":{"position":[[16,8]]}}}],["best",{"_index":78,"t":{"259":{"position":[[0,4]]}}}],["black/whitelist",{"_index":52,"t":{"199":{"position":[[11,15]]}}}],["blacklist",{"_index":46,"t":{"151":{"position":[[6,9]]}}}],["blacklist/whitelist",{"_index":44,"t":{"149":{"position":[[4,19]]}}}],["build",{"_index":136,"t":{"362":{"position":[[21,5]]}}}],["builder",{"_index":133,"t":{"358":{"position":[[20,7]]}}}],["cach",{"_index":11,"t":{"13":{"position":[[0,7]]}}}],["cast",{"_index":155,"t":{"383":{"position":[[7,4]]},"385":{"position":[[7,4]]}}}],["class",{"_index":118,"t":{"328":{"position":[[9,5]]}}}],["client",{"_index":4,"t":{"5":{"position":[[18,7]]},"27":{"position":[[0,7]]},"332":{"position":[[9,7]]},"423":{"position":[[6,7]]},"435":{"position":[[0,6]]}}}],["common",{"_index":115,"t":{"324":{"position":[[0,6]]}}}],["compos",{"_index":172,"t":{"413":{"position":[[14,7]]}}}],["concret",{"_index":117,"t":{"328":{"position":[[0,8]]}}}],["condit",{"_index":92,"t":{"286":{"position":[[16,9]]}}}],["condition",{"_index":62,"t":{"227":{"position":[[0,13]]}}}],["config",{"_index":28,"t":{"66":{"position":[[11,6]]},"326":{"position":[[0,6]]},"339":{"position":[[21,6]]},"343":{"position":[[23,6]]},"378":{"position":[[0,6]]}}}],["configur",{"_index":0,"t":{"3":{"position":[[0,13]]},"21":{"position":[[8,14]]},"36":{"position":[[0,13]]},"40":{"position":[[0,13]]},"44":{"position":[[0,13]]},"48":{"position":[[0,13]]},"54":{"position":[[0,13]]},"61":{"position":[[0,13]]},"87":{"position":[[0,13]]},"93":{"position":[[0,13]]},"99":{"position":[[0,13]]},"103":{"position":[[0,13]]},"109":{"position":[[0,13]]},"115":{"position":[[0,13]]},"123":{"position":[[0,13]]},"127":{"position":[[0,13]]},"137":{"position":[[0,13]]},"141":{"position":[[0,13]]},"145":{"position":[[0,13]]},"153":{"position":[[0,13]]},"157":{"position":[[0,13]]},"161":{"position":[[0,13]]},"165":{"position":[[0,13]]},"173":{"position":[[0,13]]},"177":{"position":[[0,13]]},"181":{"position":[[0,13]]},"187":{"position":[[0,13]]},"193":{"position":[[0,13]]},"201":{"position":[[0,13]]},"205":{"position":[[0,13]]},"209":{"position":[[0,13]]},"221":{"position":[[0,11]]},"239":{"position":[[0,13]]},"242":{"position":[[6,13]]},"246":{"position":[[4,13]]},"279":{"position":[[0,13]]},"302":{"position":[[0,13]]},"308":{"position":[[4,13]]},"377":{"position":[[0,13]]},"419":{"position":[[0,9]]},"441":{"position":[[0,13]]}}}],["connect",{"_index":140,"t":{"370":{"position":[[0,10]]},"371":{"position":[[43,7]]}}}],["connector",{"_index":51,"t":{"199":{"position":[[0,10]]}}}],["consider",{"_index":82,"t":{"262":{"position":[[7,14]]}}}],["content",{"_index":98,"t":{"290":{"position":[[25,7]]}}}],["control",{"_index":61,"t":{"225":{"position":[[11,7]]}}}],["coolplay",{"_index":124,"t":{"341":{"position":[[7,10]]}}}],["correct",{"_index":173,"t":{"417":{"position":[[11,7]]}}}],["correctli",{"_index":153,"t":{"381":{"position":[[55,9]]},"387":{"position":[[29,9]]}}}],["creat",{"_index":120,"t":{"332":{"position":[[0,8]]},"341":{"position":[[0,6]]},"405":{"position":[[0,6]]},"413":{"position":[[0,6]]}}}],["custom",{"_index":108,"t":{"311":{"position":[[34,6]]}}}],["data",{"_index":59,"t":{"223":{"position":[[15,4]]},"235":{"position":[[21,4]]}}}],["dead",{"_index":21,"t":{"30":{"position":[[0,4]]}}}],["debug",{"_index":12,"t":{"15":{"position":[[0,5]]}}}],["default",{"_index":81,"t":{"260":{"position":[[9,7]]},"271":{"position":[[9,7]]},"306":{"position":[[0,7]]}}}],["defin",{"_index":123,"t":{"339":{"position":[[0,6]]}}}],["delimit",{"_index":105,"t":{"296":{"position":[[28,10]]},"311":{"position":[[41,9]]}}}],["destin",{"_index":35,"t":{"79":{"position":[[18,11]]}}}],["detect",{"_index":41,"t":{"95":{"position":[[10,9]]}}}],["develop",{"_index":116,"t":{"324":{"position":[[7,11]]},"447":{"position":[[0,11]]}}}],["devic",{"_index":161,"t":{"385":{"position":[[12,6]]}}}],["device/us",{"_index":33,"t":{"77":{"position":[[6,11]]}}}],["disabl",{"_index":14,"t":{"17":{"position":[[0,7]]}}}],["docker",{"_index":166,"t":{"393":{"position":[[0,6]]},"395":{"position":[[0,6]]},"413":{"position":[[7,6]]},"454":{"position":[[0,6]]}}}],["doesn't",{"_index":143,"t":{"371":{"position":[[35,7]]}}}],["don't",{"_index":109,"t":{"313":{"position":[[0,5]]}}}],["duplic",{"_index":40,"t":{"95":{"position":[[0,9]]},"389":{"position":[[24,10]]}}}],["enabl",{"_index":174,"t":{"421":{"position":[[0,6]]}}}],["end",{"_index":99,"t":{"290":{"position":[[42,3]]}}}],["endpoint",{"_index":19,"t":{"23":{"position":[[7,8]]},"371":{"position":[[26,8]]}}}],["env",{"_index":71,"t":{"246":{"position":[[0,3]]},"308":{"position":[[0,3]]}}}],["exampl",{"_index":65,"t":{"231":{"position":[[0,8]]},"268":{"position":[[0,8]]},"285":{"position":[[0,8]]},"310":{"position":[[0,8]]},"395":{"position":[[13,7]]}}}],["express",{"_index":90,"t":{"281":{"position":[[19,10]]}}}],["extract",{"_index":103,"t":{"296":{"position":[[0,7]]},"315":{"position":[[0,7]]}}}],["fail",{"_index":149,"t":{"375":{"position":[[14,5]]}}}],["featur",{"_index":20,"t":{"29":{"position":[[0,8]]},"74":{"position":[[0,8]]}}}],["field",{"_index":164,"t":{"387":{"position":[[22,6]]}}}],["file",{"_index":31,"t":{"68":{"position":[[14,5]]},"405":{"position":[[14,4]]},"413":{"position":[[22,4]]}}}],["filter",{"_index":48,"t":{"189":{"position":[[8,9]]},"255":{"position":[[0,9]]},"262":{"position":[[0,6]]}}}],["flatpak",{"_index":132,"t":{"358":{"position":[[0,7],[12,7]]},"401":{"position":[[0,7]]}}}],["flow",{"_index":60,"t":{"225":{"position":[[6,4]]}}}],["further",{"_index":128,"t":{"351":{"position":[[0,7]]}}}],["gener",{"_index":135,"t":{"362":{"position":[[0,8]]}}}],["googl",{"_index":154,"t":{"383":{"position":[[0,6]]},"385":{"position":[[0,6]]}}}],["handl",{"_index":25,"t":{"55":{"position":[[0,6]]}}}],["health",{"_index":18,"t":{"23":{"position":[[0,6]]}}}],["help/faq",{"_index":180,"t":{"445":{"position":[[0,8]]}}}],["hook",{"_index":55,"t":{"215":{"position":[[9,5]]},"217":{"position":[[0,4]]}}}],["identifi",{"_index":26,"t":{"62":{"position":[[0,10]]}}}],["implement",{"_index":122,"t":{"338":{"position":[[8,14]]},"339":{"position":[[11,9]]},"345":{"position":[[0,9]]},"347":{"position":[[0,9]]},"349":{"position":[[0,9]]},"351":{"position":[[8,14]]}}}],["inform",{"_index":156,"t":{"383":{"position":[[18,11]]}}}],["initi",{"_index":125,"t":{"343":{"position":[[0,10]]}}}],["instal",{"_index":130,"t":{"357":{"position":[[0,7]]},"397":{"position":[[6,12]]},"439":{"position":[[0,12]]}}}],["intend",{"_index":69,"t":{"237":{"position":[[14,8]]}}}],["interpol",{"_index":6,"t":{"7":{"position":[[8,13]]}}}],["issu",{"_index":141,"t":{"370":{"position":[[11,6]]},"377":{"position":[[14,6]]},"380":{"position":[[11,6]]}}}],["journey",{"_index":53,"t":{"213":{"position":[[0,7]]}}}],["json",{"_index":30,"t":{"68":{"position":[[9,4]]}}}],["last.fm",{"_index":151,"t":{"381":{"position":[[0,7]]}}}],["licens",{"_index":181,"t":{"449":{"position":[[0,7]]}}}],["lifecyl",{"_index":54,"t":{"215":{"position":[[0,8]]}}}],["limit",{"_index":34,"t":{"79":{"position":[[0,8]]}}}],["local",{"_index":167,"t":{"397":{"position":[[0,5]]}}}],["log",{"_index":64,"t":{"229":{"position":[[0,7]]},"266":{"position":[[0,7]]}}}],["mainstream",{"_index":67,"t":{"235":{"position":[[10,10]]}}}],["manual",{"_index":138,"t":{"365":{"position":[[0,6]]}}}],["match",{"_index":72,"t":{"248":{"position":[[0,8]]},"264":{"position":[[14,5]]},"275":{"position":[[35,7]]}}}],["media",{"_index":162,"t":{"385":{"position":[[34,5]]}}}],["metadata",{"_index":87,"t":{"273":{"position":[[4,8]]}}}],["method",{"_index":171,"t":{"409":{"position":[[14,7]]}}}],["minim",{"_index":85,"t":{"269":{"position":[[0,7]]},"338":{"position":[[0,7]]}}}],["miss",{"_index":165,"t":{"389":{"position":[[14,6]]}}}],["missing/incorrect",{"_index":157,"t":{"383":{"position":[[33,17]]}}}],["misspel",{"_index":101,"t":{"292":{"position":[[7,10]]}}}],["mode",{"_index":13,"t":{"15":{"position":[[6,4]]}}}],["modif",{"_index":56,"t":{"219":{"position":[[0,12]]},"273":{"position":[[31,13]]}}}],["modifi",{"_index":111,"t":{"315":{"position":[[38,6]]}}}],["monitor",{"_index":16,"t":{"19":{"position":[[0,10]]}}}],["more",{"_index":66,"t":{"235":{"position":[[0,4]]}}}],["ms",{"_index":158,"t":{"383":{"position":[[54,2]]},"431":{"position":[[25,4]]}}}],["multi",{"_index":32,"t":{"77":{"position":[[0,5]]},"296":{"position":[[39,5]]},"425":{"position":[[6,5]]},"431":{"position":[[9,5]]}}}],["multipl",{"_index":49,"t":{"197":{"position":[[0,8]]},"381":{"position":[[38,8]]}}}],["music",{"_index":148,"t":{"375":{"position":[[8,5]]},"389":{"position":[[8,5]]}}}],["musicbrainz",{"_index":73,"t":{"248":{"position":[[14,11]]},"275":{"position":[[23,11]]},"417":{"position":[[34,11]]},"419":{"position":[[10,11]]},"421":{"position":[[7,11]]}}}],["nativ",{"_index":88,"t":{"275":{"position":[[4,6]]}}}],["new",{"_index":96,"t":{"288":{"position":[[32,3]]},"292":{"position":[[32,3]]},"294":{"position":[[39,3]]}}}],["next",{"_index":176,"t":{"427":{"position":[[0,4]]}}}],["nodej",{"_index":168,"t":{"399":{"position":[[0,6]]},"456":{"position":[[0,6]]}}}],["now",{"_index":23,"t":{"32":{"position":[[0,3]]}}}],["object",{"_index":119,"t":{"330":{"position":[[5,6]]},"345":{"position":[[15,6]]}}}],["on",{"_index":27,"t":{"66":{"position":[[7,3]]}}}],["option",{"_index":8,"t":{"9":{"position":[[12,7]]},"417":{"position":[[0,10]]}}}],["parenthes",{"_index":97,"t":{"290":{"position":[[11,13]]}}}],["pars",{"_index":107,"t":{"311":{"position":[[0,5]]},"313":{"position":[[6,5]]},"378":{"position":[[20,6]]}}}],["partial",{"_index":84,"t":{"264":{"position":[[6,7]]}}}],["phrase",{"_index":94,"t":{"288":{"position":[[7,6]]}}}],["play",{"_index":24,"t":{"32":{"position":[[4,7]]},"223":{"position":[[10,4]]},"288":{"position":[[36,5]]},"292":{"position":[[36,5]]},"294":{"position":[[43,5]]},"330":{"position":[[0,4]]},"345":{"position":[[10,4]]}}}],["player",{"_index":159,"t":{"383":{"position":[[57,6]]}}}],["poll",{"_index":127,"t":{"349":{"position":[[10,7]]}}}],["practic",{"_index":79,"t":{"259":{"position":[[5,9]]}}}],["primari",{"_index":104,"t":{"296":{"position":[[8,7]]}}}],["project",{"_index":113,"t":{"320":{"position":[[0,7]]},"360":{"position":[[7,7]]}}}],["quick",{"_index":179,"t":{"437":{"position":[[0,5]]}}}],["refin",{"_index":75,"t":{"252":{"position":[[0,8]]}}}],["remov",{"_index":93,"t":{"288":{"position":[[0,6]]},"290":{"position":[[0,6]]},"294":{"position":[[0,6]]}}}],["renam",{"_index":100,"t":{"292":{"position":[[0,6]]}}}],["replac",{"_index":89,"t":{"281":{"position":[[11,7]]}}}],["requir",{"_index":131,"t":{"357":{"position":[[8,12]]}}}],["retriev",{"_index":38,"t":{"91":{"position":[[0,8]]}}}],["rule",{"_index":58,"t":{"223":{"position":[[0,5]]},"244":{"position":[[0,5]]},"283":{"position":[[0,5]]},"304":{"position":[[0,5]]}}}],["run",{"_index":63,"t":{"227":{"position":[[14,3]]},"367":{"position":[[0,3]]}}}],["scenario",{"_index":121,"t":{"336":{"position":[[0,8]]}}}],["score",{"_index":76,"t":{"253":{"position":[[0,5]]}}}],["script",{"_index":137,"t":{"363":{"position":[[10,6]]}}}],["scrobbl",{"_index":22,"t":{"30":{"position":[[5,9]]},"79":{"position":[[9,8]]},"81":{"position":[[0,8]]},"83":{"position":[[7,8]]},"213":{"position":[[13,8]]},"273":{"position":[[22,8]]},"380":{"position":[[0,10]]},"381":{"position":[[17,8]]},"387":{"position":[[11,10]]},"389":{"position":[[35,9]]},"417":{"position":[[19,9]]}}}],["scrobbler",{"_index":175,"t":{"425":{"position":[[12,9]]},"431":{"position":[[15,9]]}}}],["search",{"_index":74,"t":{"250":{"position":[[0,9]]},"281":{"position":[[0,6]]}}}],["secret",{"_index":5,"t":{"7":{"position":[[0,7]]}}}],["sensibl",{"_index":80,"t":{"260":{"position":[[0,8]]},"271":{"position":[[0,8]]}}}],["separ",{"_index":29,"t":{"68":{"position":[[0,8]]}}}],["servic",{"_index":47,"t":{"189":{"position":[[0,7]]},"407":{"position":[[10,7]]},"409":{"position":[[6,7]]}}}],["setup",{"_index":2,"t":{"5":{"position":[[0,5]]},"52":{"position":[[0,5]]},"59":{"position":[[0,5]]},"171":{"position":[[0,5]]},"185":{"position":[[0,5]]},"240":{"position":[[4,5]]},"320":{"position":[[8,5]]},"363":{"position":[[4,5]]},"365":{"position":[[7,5]]},"415":{"position":[[0,5]]},"423":{"position":[[0,5]]}}}],["sort",{"_index":77,"t":{"257":{"position":[[0,7]]}}}],["sourc",{"_index":3,"t":{"5":{"position":[[6,7]]},"72":{"position":[[0,7]]},"75":{"position":[[9,7]]},"332":{"position":[[21,7]]},"341":{"position":[[18,6]]},"343":{"position":[[11,6]]},"354":{"position":[[6,6]]},"360":{"position":[[15,6]]},"362":{"position":[[9,7]]},"415":{"position":[[6,7]]},"421":{"position":[[25,6]]},"433":{"position":[[0,6]]}}}],["specif",{"_index":110,"t":{"313":{"position":[[12,8]]}}}],["spotify/deezer/lastfm",{"_index":144,"t":{"373":{"position":[[0,21]]}}}],["stage",{"_index":57,"t":{"219":{"position":[[13,5]]},"221":{"position":[[12,6]]},"225":{"position":[[0,5]]},"242":{"position":[[0,5]]},"275":{"position":[[11,5]]},"306":{"position":[[8,5]]},"347":{"position":[[10,6]]}}}],["start",{"_index":170,"t":{"407":{"position":[[0,5]]},"425":{"position":[[0,5]]},"437":{"position":[[6,5]]}}}],["step",{"_index":177,"t":{"427":{"position":[[5,5]]}}}],["string",{"_index":106,"t":{"296":{"position":[[52,6]]},"311":{"position":[[19,6]]}}}],["threshold",{"_index":36,"t":{"81":{"position":[[9,10]]}}}],["time",{"_index":150,"t":{"375":{"position":[[31,4]]},"383":{"position":[[74,5]]}}}],["titl",{"_index":95,"t":{"288":{"position":[[19,5]]},"290":{"position":[[51,5]]},"315":{"position":[[21,5],[45,5]]}}}],["token",{"_index":42,"t":{"135":{"position":[[0,5]]}}}],["track",{"_index":152,"t":{"381":{"position":[[26,6]]},"383":{"position":[[12,5]]},"385":{"position":[[28,5]]}}}],["transform",{"_index":126,"t":{"345":{"position":[[22,9]]}}}],["type",{"_index":1,"t":{"3":{"position":[[14,5]]},"75":{"position":[[0,5]]},"354":{"position":[[13,5]]}}}],["unit",{"_index":169,"t":{"405":{"position":[[9,4]]}}}],["updat",{"_index":134,"t":{"360":{"position":[[0,6]]},"452":{"position":[[0,8]]}}}],["uri",{"_index":43,"t":{"149":{"position":[[0,3]]}}}],["url",{"_index":10,"t":{"11":{"position":[[5,3]]},"107":{"position":[[0,3]]},"113":{"position":[[0,3]]},"121":{"position":[[0,3]]},"133":{"position":[[0,3]]}}}],["us",{"_index":83,"t":{"264":{"position":[[0,5]]},"275":{"position":[[0,3]]},"311":{"position":[[26,5]]},"363":{"position":[[0,3]]}}}],["usag",{"_index":91,"t":{"286":{"position":[[0,5]]},"395":{"position":[[7,5]]},"443":{"position":[[0,5]]}}}],["user",{"_index":50,"t":{"197":{"position":[[9,5]]}}}],["variou",{"_index":102,"t":{"294":{"position":[[7,8]]}}}],["vlc",{"_index":163,"t":{"387":{"position":[[0,3]]}}}],["vscode",{"_index":114,"t":{"322":{"position":[[0,6]]}}}],["web",{"_index":15,"t":{"17":{"position":[[8,3]]}}}],["webhook",{"_index":17,"t":{"21":{"position":[[0,7]]}}}],["webscrobbler/listenbrainz",{"_index":142,"t":{"371":{"position":[[0,25]]}}}],["weird",{"_index":160,"t":{"383":{"position":[[68,5]]}}}],["won't",{"_index":145,"t":{"373":{"position":[[22,5]]}}}],["work",{"_index":178,"t":{"431":{"position":[[30,5]]}}}],["youtub",{"_index":147,"t":{"375":{"position":[[0,7]]},"389":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":1,"t":"Check the FAQ if you have any issues after configuration!","s":"Overview","u":"/multi-scrobbler/configuration/","p":1},{"i":25,"t":"A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz...","s":"Overview","u":"/multi-scrobbler/configuration/clients/","p":25},{"i":34,"t":"To monitor and re-scrobble activity from a Koito account create a Koito (Source)","s":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","p":34},{"i":38,"t":"* To monitor and re-scrobble activity from your Last.fm account create a Last.fm (Source)","s":"Last.fm","u":"/multi-scrobbler/configuration/clients/lastfm/","p":38},{"i":42,"t":"* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)","s":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","p":42},{"i":46,"t":"Setup a Maloja server if you have not already done this.","s":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","p":46},{"i":50,"t":"To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)","s":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","p":50},{"i":57,"t":"To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source)","s":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","p":57},{"i":64,"t":"Scenario:","s":"Example Complex Scenario","u":"/multi-scrobbler/configuration/kitchensink/","p":64},{"i":70,"t":"A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc...","s":"Overview","u":"/multi-scrobbler/configuration/sources/","p":70},{"i":85,"t":"Azuracast may not correctly report track length or position. If this is the case you should reduce the \"listened to\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly.","s":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","p":85},{"i":89,"t":"This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer's TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk.","s":"Deezer","u":"/multi-scrobbler/configuration/sources/deezer/","p":89},{"i":97,"t":"If your media device can be Cast to using this button Chromecast Icon on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play.","s":"Google Cast (Chromecast)","u":"/multi-scrobbler/configuration/sources/google-cast/","p":97},{"i":101,"t":"Parse metadata from any Icecast Station (streams) to use for scrobbling.","s":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","p":101},{"i":105,"t":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can can be in the JRiver GUI:","s":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","p":105},{"i":111,"t":"In order for multi-scrobbler to communicate with Kodi you must have the Web Interface enabled. This can be done in the Kodi GUI:","s":"Kodi","u":"/multi-scrobbler/configuration/sources/kodi/","p":111},{"i":117,"t":"This Source monitors a Koito account's scrobble history and then re-scrobbles discovered tracks to configured Clients.","s":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","p":117},{"i":119,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server.","s":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","p":119},{"i":125,"t":"This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients.","s":"Lastfm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","p":125},{"i":129,"t":"Must be using Jellyfin 10.7 or greater","s":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","p":129},{"i":131,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server.","s":"Listenbrainz (Endpoint)","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","p":131},{"i":139,"t":"This Source monitors a Listenbrainz account's scrobble history and then re-scrobbles discovered tracks to configured clients.","s":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","p":139},{"i":143,"t":"To scrobble to a Maloja server, create a Maloja (Client)","s":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","p":143},{"i":147,"t":"Mopidy is a headless music server that supports playing music from many standard and non-standard sources such as Pandora, Bandcamp, and Tunein.","s":"Mopidy","u":"/multi-scrobbler/configuration/sources/mopidy/","p":147},{"i":155,"t":"MS communicates with MPD using the TCP client connection.","s":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","p":155},{"i":159,"t":"MPRIS is a standard interface for communicating with Music Players on linux operating systems.","s":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","p":159},{"i":163,"t":"In order to use Musikcube configure it to accept websocket connections in server setup:","s":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","p":163},{"i":167,"t":"Find your Plex Token and make note of the URL and Port used to connect to your Plex instance.","s":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","p":167},{"i":169,"t":"To scrobble to* Rocksky, create a Rocksky (Client)","s":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","p":169},{"i":175,"t":"Spotify and Automix","s":"Spotify","u":"/multi-scrobbler/configuration/sources/spotify/","p":175},{"i":179,"t":"This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome)","s":"Subsonic","u":"/multi-scrobbler/configuration/sources/subsonic/","p":179},{"i":183,"t":"To scrobble to* an ATProto PDS, create a teal.fm (Client)","s":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","p":183},{"i":191,"t":"MS communicates with VLC using the Web (http) interface module","s":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","p":191},{"i":195,"t":"After installing the Webscrobbler extension open the preferences/settings for it:","s":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","p":195},{"i":203,"t":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs.","s":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","p":203},{"i":207,"t":"Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser.","s":"Youtube Music","u":"/multi-scrobbler/configuration/sources/youtube-music/","p":207},{"i":211,"t":"Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler's lifecycle.","s":"Enhancing Scrobbles","u":"/multi-scrobbler/configuration/transforms/","p":211},{"i":233,"t":"The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data.","s":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","p":233},{"i":277,"t":"The User Stage uses search-and-replace expressions, provided by you, to modify/replace parts of Play data.","s":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","p":277},{"i":298,"t":"To do...","s":"Client Development/Tutorial","u":"/multi-scrobbler/development/dev-client/","p":298},{"i":300,"t":"The Native Stage uses built-in heuristics to try to extract Artists from Play artist/track data.","s":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","p":300},{"i":317,"t":"Start here for MS development","s":"Development","u":"/multi-scrobbler/development/dev-common/","p":317},{"i":334,"t":"This document will provide a step-by-step guide for creating a (trivial) new Source in MS alongside describing what aspects of the Source need to be implemented based on the service you use. Before using this document you should review Common Development.","s":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","p":334},{"i":356,"t":"Building Flatpak App locally","s":"Flatpak","u":"/multi-scrobbler/development/flatpak/","p":356},{"i":369,"t":"Connection Issues","s":"FAQ","u":"/multi-scrobbler/FAQ/","p":369},{"i":391,"t":"For the difference between ENV and File examples in this document see Configuration Types.","s":"Overview","u":"/multi-scrobbler/installation/","p":391},{"i":403,"t":"If you have multi-scrobbler installed locally you can enable it to run as a background service when you login.","s":"Systemd","u":"/multi-scrobbler/installation/service/","p":403},{"i":411,"t":"This guide will get you up and running with multi-scrobbler using Docker and docker compose. At the end of the guide you will have:","s":"Quickstart","u":"/multi-scrobbler/quickstart/","p":411},{"i":429,"t":"Latest Release","s":"Overview","u":"/multi-scrobbler/","p":429},{"i":451,"t":"Updating","s":"Overview","u":"/multi-scrobbler/updating/","p":451}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,4.632,1,4.632,2,3.961,3,2.706]],["t/25",[4,1.626,5,2.202,6,3.199,7,3.199,8,2.43,9,3.199,10,1.626,11,0.92,12,2.43,13,2.43,14,2.202,15,2.202]],["t/34",[11,1.041,16,1.622,17,1.839,18,2.114,19,4.221,20,2.749,21,1.725,22,1.222]],["t/38",[11,0.997,14,3.299,16,1.554,17,1.762,18,2.025,20,2.634,21,1.652,22,1.171,23,2.965]],["t/42",[11,0.997,15,3.299,16,1.554,17,1.762,18,2.025,20,2.634,21,1.652,22,1.171,23,2.965]],["t/46",[13,3.332,24,3.751,25,2.384,26,4.386,27,3.751]],["t/50",[11,1.088,16,1.696,17,1.923,18,2.211,21,1.803,22,1.278,28,4.35]],["t/57",[11,1.041,16,1.622,17,1.839,18,2.114,21,1.725,22,1.222,29,3.095,30,3.619,31,3.095]],["t/64",[32,5.566]],["t/70",[8,1.973,10,1.319,12,1.973,22,1.314,33,1.517,34,2.597,35,1.788,36,2.273,37,2.221,38,2.597,39,2.221,40,2.221,41,2.221,42,2.597,43,2.221,44,2.597]],["t/85",[11,1.146,35,1.846,45,2.681,46,3.985,47,2.681,48,2.681,49,2.681,50,2.681,51,2.681,52,2.681,53,2.681,54,0.905,55,2.681,56,1.202,57,1.202]],["t/89",[22,1.255,33,1.427,54,1.255,58,2.09,59,3.716,60,2.443,61,3.716,62,2.443,63,2.443,64,2.443,65,2.09,66,2.443,67,1.856,68,2.443,69,2.443,70,2.443]],["t/97",[10,1.457,11,0.824,16,1.285,36,1.675,54,0.968,56,1.285,57,1.285,71,2.867,72,2.867,73,2.867,74,2.867,75,2.867,76,2.867,77,2.867,78,1.974]],["t/101",[11,1.14,54,1.339,79,3.966,80,3.966,81,3.966,82,3.966,83,3.966]],["t/105",[25,1.809,56,1.491,57,1.491,78,2.291,84,1.944,85,4.658,86,2.528,87,2.291,88,2.102,89,2.846]],["t/111",[27,2.846,56,1.491,57,1.491,78,2.291,84,1.944,86,2.528,87,2.291,88,2.102,89,2.846,90,4.658]],["t/117",[3,1.869,4,1.626,11,1.303,16,1.434,17,1.626,19,2.736,22,1.08,35,2.202,91,2.736,92,2.43,93,2.736]],["t/119",[5,2.387,11,0.997,14,2.387,22,1.171,25,1.885,56,1.554,57,1.554,88,2.19,94,2.634,95,2.965]],["t/125",[3,1.944,4,1.691,11,1.339,14,2.291,16,1.491,17,1.691,18,1.944,22,1.124,92,2.528,96,2.846]],["t/129",[40,3.961,54,1.564,97,4.632,98,4.632]],["t/131",[5,2.387,11,0.997,15,2.387,22,1.171,25,1.885,56,1.554,57,1.554,88,2.19,94,2.634,95,2.965]],["t/139",[3,1.869,4,1.626,11,1.303,15,2.202,16,1.434,17,1.626,22,1.08,35,2.202,91,2.736,92,2.43,93,2.736]],["t/143",[4,2.116,11,1.198,13,4.118,21,1.985,25,2.264]],["t/147",[10,1.408,22,0.936,25,1.506,36,2.385,99,2.771,100,2.771,101,1.908,102,2.369,103,3.492,104,2.771,105,2.369,106,2.771,107,2.771,108,2.771]],["t/155",[4,2.015,54,1.339,84,2.317,109,2.73,110,3.966,111,3.966,112,2.73]],["t/159",[36,2.114,37,3.095,84,2.114,87,2.491,103,3.095,113,3.619,114,3.619,115,3.619,116,3.619]],["t/163",[3,2.114,24,3.095,25,1.967,54,1.222,78,2.491,94,2.749,112,2.491,117,3.619,118,3.619]],["t/167",[41,3.983,54,1.124,112,2.291,119,3.328,120,3.328,121,3.328,122,3.328,123,3.328,124,3.328,125,3.328]],["t/169",[4,2.229,11,1.261,21,2.09,28,4.792]],["t/175",[39,4.46,126,5.215]],["t/179",[5,2.202,22,1.08,43,2.736,54,1.08,101,2.202,105,2.736,127,2.736,128,3.199,129,3.199,130,3.199,131,3.199,132,3.199]],["t/183",[4,2.116,11,1.198,21,1.985,29,3.562,31,3.562,133,4.165]],["t/191",[54,1.278,84,2.211,86,2.875,87,2.605,109,2.605,134,3.784,135,3.784,136,3.784]],["t/195",[137,3.751,138,4.386,139,4.386,140,4.386,141,4.386]],["t/203",[10,2.015,16,1.777,36,2.317,142,3.966,143,3.966,144,3.966,145,3.966]],["t/207",[36,2.221,58,2.153,65,2.153,67,1.913,84,1.471,101,1.733,146,3.802,147,2.518,148,3.802,149,2.518,150,2.518,151,2.518,152,3.802,153,2.518,154,2.518]],["t/211",[11,0.663,33,1.348,56,1.594,57,1.034,67,1.753,101,1.588,102,1.973,155,2.307,156,2.307,157,2.307,158,2.307,159,2.307,160,1.973,161,1.973,162,2.307,163,2.307,164,1.973,165,2.307,166,1.973,167,2.307,168,2.307]],["t/233",[8,1.803,10,1.847,33,2.123,54,0.802,56,1.064,57,1.064,160,3.777,169,3.635,170,1.803,171,2.373,172,2.373,173,2.373,174,2.373,175,2.373,176,2.373,177,2.373]],["t/277",[10,1.691,33,1.944,54,1.124,161,2.846,170,2.528,178,3.328,179,3.328,180,3.328,181,2.846,182,3.328,183,3.328]],["t/298",[]],["t/300",[10,1.691,33,1.944,54,1.124,164,2.846,170,2.528,184,3.328,185,3.328,186,3.328,187,3.328,188,3.328,189,3.328]],["t/317",[109,3.189,190,4.632,191,4.632,192,3.961]],["t/334",[21,1.015,22,1.128,54,1.128,96,1.821,109,1.466,127,1.821,181,1.821,192,1.821,193,2.857,194,3.341,195,1.821,196,2.129,197,2.129,198,2.129,199,2.129,200,2.129,201,2.129,202,1.821,203,2.129,204,2.129,205,2.129]],["t/356",[206,4.632,207,4.632,208,4.632,209,3.961]],["t/369",[2,4.46,112,3.591]],["t/391",[3,2.114,12,2.749,166,3.095,193,3.095,210,3.619,211,3.619,212,3.619,213,3.619,214,3.619]],["t/403",[56,1.622,57,1.622,88,2.286,137,3.095,202,3.095,209,3.095,215,3.095,216,3.619,217,3.619]],["t/411",[54,1.124,56,1.491,57,1.491,195,3.983,215,2.846,218,3.328,219,4.658,220,3.328,221,3.328]],["t/429",[222,5.215,223,5.215]],["t/451",[224,5.566]]],"invertedIndex":[["",{"_index":23,"t":{"38":{"position":[[0,1]]},"42":{"position":[[0,1]]}}}],["10.7",{"_index":97,"t":{"129":{"position":[[23,4]]}}}],["abil",{"_index":156,"t":{"211":{"position":[[36,7]]}}}],["accept",{"_index":94,"t":{"119":{"position":[[39,6]]},"131":{"position":[[39,6]]},"163":{"position":[[42,6]]}}}],["access",{"_index":60,"t":{"89":{"position":[[39,6]]}}}],["account",{"_index":20,"t":{"34":{"position":[[49,7]]},"38":{"position":[[56,7]]},"42":{"position":[[58,7]]}}}],["account'",{"_index":91,"t":{"117":{"position":[[29,9]]},"139":{"position":[[36,9]]}}}],["activ",{"_index":18,"t":{"34":{"position":[[27,8]]},"38":{"position":[[29,8]]},"42":{"position":[[29,8]]},"50":{"position":[[27,8]]},"57":{"position":[[27,8]]},"125":{"position":[[72,8]]}}}],["airson",{"_index":43,"t":{"70":{"position":[[167,9]]},"179":{"position":[[126,8]]}}}],["album",{"_index":165,"t":{"211":{"position":[[150,5]]}}}],["alongsid",{"_index":197,"t":{"334":{"position":[[90,9]]}}}],["alreadi",{"_index":26,"t":{"46":{"position":[[38,7]]}}}],["api",{"_index":129,"t":{"179":{"position":[[73,3]]}}}],["app",{"_index":208,"t":{"356":{"position":[[17,3]]}}}],["applic",{"_index":5,"t":{"25":{"position":[[15,11]]},"119":{"position":[[69,12]]},"131":{"position":[[69,12]]},"179":{"position":[[32,11]]}}}],["artist",{"_index":164,"t":{"211":{"position":[[137,8]]},"300":{"position":[[60,7]]}}}],["artist/track",{"_index":189,"t":{"300":{"position":[[78,12]]}}}],["aspect",{"_index":199,"t":{"334":{"position":[[116,7]]}}}],["atproto",{"_index":29,"t":{"57":{"position":[[43,7]]},"183":{"position":[[19,7]]}}}],["autom",{"_index":158,"t":{"211":{"position":[[75,9]]}}}],["automix",{"_index":126,"t":{"175":{"position":[[12,7]]}}}],["azuracast",{"_index":45,"t":{"85":{"position":[[0,9]]}}}],["background",{"_index":216,"t":{"403":{"position":[[76,10]]}}}],["bandcamp",{"_index":107,"t":{"147":{"position":[[123,9]]}}}],["base",{"_index":201,"t":{"334":{"position":[[161,5]]}}}],["befor",{"_index":203,"t":{"334":{"position":[[191,6]]}}}],["between",{"_index":210,"t":{"391":{"position":[[19,7]]}}}],["break",{"_index":68,"t":{"89":{"position":[[159,8]]}}}],["browser",{"_index":154,"t":{"207":{"position":[[199,8]]}}}],["build",{"_index":206,"t":{"356":{"position":[[0,8]]}}}],["built",{"_index":185,"t":{"300":{"position":[[22,5]]}}}],["button",{"_index":74,"t":{"97":{"position":[[47,6]]}}}],["case",{"_index":50,"t":{"85":{"position":[[76,4]]}}}],["cast",{"_index":73,"t":{"97":{"position":[[28,4]]}}}],["chang",{"_index":65,"t":{"89":{"position":[[115,6]]},"207":{"position":[[166,6]]}}}],["check",{"_index":0,"t":{"1":{"position":[[0,5]]}}}],["chromecast",{"_index":75,"t":{"97":{"position":[[54,10]]}}}],["client",{"_index":4,"t":{"25":{"position":[[2,6]]},"117":{"position":[[110,8]]},"125":{"position":[[95,8]]},"139":{"position":[[117,8]]},"143":{"position":[[49,8]]},"155":{"position":[[39,6]]},"169":{"position":[[42,8]]},"183":{"position":[[49,8]]}}}],["common",{"_index":205,"t":{"334":{"position":[[236,6]]}}}],["commun",{"_index":84,"t":{"105":{"position":[[32,11]]},"111":{"position":[[32,11]]},"155":{"position":[[3,12]]},"159":{"position":[[34,13]]},"191":{"position":[[3,12]]},"207":{"position":[[0,13]]}}}],["compos",{"_index":220,"t":{"411":{"position":[[84,8]]}}}],["config",{"_index":155,"t":{"211":{"position":[[16,7]]}}}],["configur",{"_index":3,"t":{"1":{"position":[[43,14]]},"117":{"position":[[99,10]]},"125":{"position":[[84,10]]},"139":{"position":[[106,10]]},"163":{"position":[[26,9]]},"391":{"position":[[70,13]]}}}],["connect",{"_index":112,"t":{"155":{"position":[[46,11]]},"163":{"position":[[59,11]]},"167":{"position":[[63,7]]},"369":{"position":[[0,10]]}}}],["contain",{"_index":34,"t":{"70":{"position":[[31,8]]}}}],["correct",{"_index":175,"t":{"233":{"position":[[149,7]]}}}],["correctli",{"_index":46,"t":{"85":{"position":[[18,9],[186,10]]}}}],["creat",{"_index":21,"t":{"34":{"position":[[57,6]]},"38":{"position":[[64,6]]},"42":{"position":[[66,6]]},"50":{"position":[[49,6]]},"57":{"position":[[59,6]]},"143":{"position":[[33,6]]},"169":{"position":[[25,6]]},"183":{"position":[[32,6]]},"334":{"position":[[52,8]]}}}],["data",{"_index":33,"t":{"70":{"position":[[14,4]]},"89":{"position":[[53,4]]},"211":{"position":[[64,4]]},"233":{"position":[[40,4],[202,5]]},"277":{"position":[[101,5]]},"300":{"position":[[91,5]]}}}],["databas",{"_index":171,"t":{"233":{"position":[[66,9]]}}}],["decid",{"_index":153,"t":{"207":{"position":[[155,7]]}}}],["deezer",{"_index":61,"t":{"89":{"position":[[46,6],[104,6]]}}}],["deezer'",{"_index":63,"t":{"89":{"position":[[90,8]]}}}],["describ",{"_index":198,"t":{"334":{"position":[[100,10]]}}}],["develop",{"_index":192,"t":{"317":{"position":[[18,11]]},"334":{"position":[[243,12]]}}}],["devic",{"_index":72,"t":{"97":{"position":[[14,6]]}}}],["device/receiv",{"_index":143,"t":{"203":{"position":[[18,16]]}}}],["differ",{"_index":166,"t":{"211":{"position":[[164,9]]},"391":{"position":[[8,10]]}}}],["discov",{"_index":93,"t":{"117":{"position":[[78,10]]},"139":{"position":[[85,10]]}}}],["docker",{"_index":219,"t":{"411":{"position":[[66,6],[77,6]]}}}],["document",{"_index":193,"t":{"334":{"position":[[5,8],[209,8]]},"391":{"position":[[57,8]]}}}],["done",{"_index":27,"t":{"46":{"position":[[46,4]]},"111":{"position":[[107,4]]}}}],["durat",{"_index":53,"t":{"85":{"position":[[117,8]]}}}],["enabl",{"_index":88,"t":{"105":{"position":[[91,8]]},"111":{"position":[[86,8]]},"119":{"position":[[12,7]]},"131":{"position":[[12,7]]},"403":{"position":[[54,6]]}}}],["end",{"_index":221,"t":{"411":{"position":[[100,3]]}}}],["endors",{"_index":147,"t":{"207":{"position":[[63,8]]}}}],["endpoint",{"_index":131,"t":{"179":{"position":[[108,8]]}}}],["enhanc",{"_index":157,"t":{"211":{"position":[[47,7]]}}}],["enough",{"_index":174,"t":{"233":{"position":[[103,6]]}}}],["env",{"_index":211,"t":{"391":{"position":[[27,3]]}}}],["etc",{"_index":44,"t":{"70":{"position":[[177,6]]}}}],["exampl",{"_index":12,"t":{"25":{"position":[[112,8]]},"70":{"position":[[114,8]]},"391":{"position":[[40,8]]}}}],["express",{"_index":180,"t":{"277":{"position":[[39,12]]}}}],["extens",{"_index":139,"t":{"195":{"position":[[34,9]]}}}],["extract",{"_index":188,"t":{"300":{"position":[[52,7]]}}}],["faq",{"_index":1,"t":{"1":{"position":[[10,3]]}}}],["fashion",{"_index":159,"t":{"211":{"position":[[85,7]]}}}],["file",{"_index":212,"t":{"391":{"position":[[35,4]]}}}],["fill",{"_index":176,"t":{"233":{"position":[[161,4]]}}}],["find",{"_index":119,"t":{"167":{"position":[[0,4]]}}}],["flatpak",{"_index":207,"t":{"356":{"position":[[9,7]]}}}],["function",{"_index":69,"t":{"89":{"position":[[168,14]]}}}],["getnowplay",{"_index":130,"t":{"179":{"position":[[94,13]]}}}],["googl",{"_index":148,"t":{"207":{"position":[[75,7],[148,6]]}}}],["greater",{"_index":98,"t":{"129":{"position":[[31,7]]}}}],["gui",{"_index":89,"t":{"105":{"position":[[130,4]]},"111":{"position":[[124,4]]}}}],["guid",{"_index":195,"t":{"334":{"position":[[42,5]]},"411":{"position":[[5,5],[111,5]]}}}],["headless",{"_index":100,"t":{"147":{"position":[[12,8]]}}}],["here",{"_index":191,"t":{"317":{"position":[[6,4]]}}}],["heurist",{"_index":186,"t":{"300":{"position":[[31,10]]}}}],["high",{"_index":173,"t":{"233":{"position":[[98,4]]}}}],["histor",{"_index":7,"t":{"25":{"position":[[43,10]]}}}],["histori",{"_index":92,"t":{"117":{"position":[[48,7]]},"125":{"position":[[43,7]]},"139":{"position":[[55,7]]}}}],["http",{"_index":135,"t":{"191":{"position":[[39,6]]}}}],["icecast",{"_index":81,"t":{"101":{"position":[[24,7]]}}}],["icon",{"_index":76,"t":{"97":{"position":[[65,4]]}}}],["implement",{"_index":127,"t":{"179":{"position":[[49,10]]},"334":{"position":[[149,11]]}}}],["inform",{"_index":8,"t":{"25":{"position":[[54,11]]},"70":{"position":[[40,11]]},"233":{"position":[[177,11]]}}}],["input",{"_index":145,"t":{"203":{"position":[[70,7]]}}}],["instal",{"_index":137,"t":{"195":{"position":[[6,10]]},"403":{"position":[[28,9]]}}}],["instanc",{"_index":125,"t":{"167":{"position":[[84,9]]}}}],["integr",{"_index":150,"t":{"207":{"position":[[104,11]]}}}],["interfac",{"_index":87,"t":{"105":{"position":[[81,9]]},"111":{"position":[[76,9]]},"159":{"position":[[20,9]]},"191":{"position":[[46,9]]}}}],["issu",{"_index":2,"t":{"1":{"position":[[30,6]]},"369":{"position":[[11,6]]}}}],["jellyfin",{"_index":40,"t":{"70":{"position":[[136,9]]},"129":{"position":[[14,8]]}}}],["jriver",{"_index":85,"t":{"105":{"position":[[49,6],[123,6]]}}}],["kodi",{"_index":90,"t":{"111":{"position":[[49,4],[119,4]]}}}],["koito",{"_index":19,"t":{"34":{"position":[[43,5],[66,5]]},"117":{"position":[[23,5]]}}}],["last.fm",{"_index":14,"t":{"25":{"position":[[133,8]]},"38":{"position":[[48,7],[73,7]]},"119":{"position":[[97,7]]},"125":{"position":[[26,7]]}}}],["latest",{"_index":222,"t":{"429":{"position":[[0,6]]}}}],["length",{"_index":48,"t":{"85":{"position":[[41,6]]}}}],["lifecycl",{"_index":168,"t":{"211":{"position":[[201,10]]}}}],["linux",{"_index":114,"t":{"159":{"position":[[70,5]]}}}],["listen",{"_index":52,"t":{"85":{"position":[[103,9]]}}}],["listenbrainz",{"_index":15,"t":{"25":{"position":[[142,15]]},"42":{"position":[[45,12],[75,12]]},"131":{"position":[[97,12]]},"139":{"position":[[23,12]]}}}],["local",{"_index":209,"t":{"356":{"position":[[21,7]]},"403":{"position":[[38,7]]}}}],["login",{"_index":217,"t":{"403":{"position":[[104,6]]}}}],["make",{"_index":121,"t":{"167":{"position":[[25,4]]}}}],["maloja",{"_index":13,"t":{"25":{"position":[[125,7]]},"46":{"position":[[8,6]]},"143":{"position":[[18,6],[42,6]]}}}],["mani",{"_index":102,"t":{"147":{"position":[[67,4]]},"211":{"position":[[159,4]]}}}],["match",{"_index":160,"t":{"211":{"position":[[96,8]]},"233":{"position":[[22,7],[83,5],[140,5]]}}}],["mean",{"_index":149,"t":{"207":{"position":[[88,5]]}}}],["media",{"_index":71,"t":{"97":{"position":[[8,5]]}}}],["metadata",{"_index":80,"t":{"101":{"position":[[6,8]]}}}],["method",{"_index":59,"t":{"89":{"position":[[28,7],[138,7]]}}}],["miss",{"_index":177,"t":{"233":{"position":[[169,7]]}}}],["modify/replac",{"_index":182,"t":{"277":{"position":[[72,14]]}}}],["modul",{"_index":136,"t":{"191":{"position":[[56,6]]}}}],["monitor",{"_index":16,"t":{"34":{"position":[[3,7]]},"38":{"position":[[5,7]]},"42":{"position":[[5,7]]},"50":{"position":[[3,7]]},"57":{"position":[[3,7]]},"97":{"position":[[118,7]]},"117":{"position":[[12,8]]},"125":{"position":[[12,8]]},"139":{"position":[[12,8]]},"203":{"position":[[0,7]]}}}],["mopidi",{"_index":99,"t":{"147":{"position":[[0,6]]}}}],["mpd",{"_index":110,"t":{"155":{"position":[[21,3]]}}}],["mpri",{"_index":113,"t":{"159":{"position":[[0,5]]}}}],["ms",{"_index":109,"t":{"155":{"position":[[0,2]]},"191":{"position":[[0,2]]},"317":{"position":[[15,2]]},"334":{"position":[[87,2]]}}}],["multi",{"_index":56,"t":{"85":{"position":[[160,5]]},"97":{"position":[[98,5]]},"105":{"position":[[13,5]]},"111":{"position":[[13,5]]},"119":{"position":[[20,5]]},"131":{"position":[[20,5]]},"211":{"position":[[0,5],[183,5]]},"233":{"position":[[115,5]]},"403":{"position":[[12,5]]},"411":{"position":[[44,5]]}}}],["music",{"_index":36,"t":{"70":{"position":[[88,5],[160,6]]},"97":{"position":[[150,5]]},"147":{"position":[[21,5],[56,5]]},"159":{"position":[[53,5]]},"203":{"position":[[39,5]]},"207":{"position":[[22,5],[180,5]]}}}],["musicbrainz",{"_index":169,"t":{"233":{"position":[[4,11],[54,11]]}}}],["musiccast",{"_index":142,"t":{"203":{"position":[[8,9]]}}}],["musikcub",{"_index":117,"t":{"163":{"position":[[16,9]]}}}],["nativ",{"_index":184,"t":{"300":{"position":[[4,6]]}}}],["navidrom",{"_index":132,"t":{"179":{"position":[[139,10]]}}}],["need",{"_index":200,"t":{"334":{"position":[[138,4]]}}}],["network/usb/cd",{"_index":144,"t":{"203":{"position":[[55,14]]}}}],["new",{"_index":96,"t":{"125":{"position":[[68,3]]},"334":{"position":[[73,3]]}}}],["non",{"_index":104,"t":{"147":{"position":[[85,3]]}}}],["note",{"_index":122,"t":{"167":{"position":[[30,4]]}}}],["open",{"_index":140,"t":{"195":{"position":[[44,4]]}}}],["oper",{"_index":115,"t":{"159":{"position":[[76,9]]}}}],["order",{"_index":78,"t":{"97":{"position":[[132,5]]},"105":{"position":[[3,5]]},"111":{"position":[[3,5]]},"163":{"position":[[3,5]]}}}],["outsid",{"_index":95,"t":{"119":{"position":[[61,7]]},"131":{"position":[[61,7]]}}}],["pandora",{"_index":106,"t":{"147":{"position":[[114,8]]}}}],["pars",{"_index":79,"t":{"101":{"position":[[0,5]]}}}],["part",{"_index":183,"t":{"277":{"position":[[87,5]]}}}],["pd",{"_index":133,"t":{"183":{"position":[[27,4]]}}}],["phone/comput",{"_index":77,"t":{"97":{"position":[[78,14]]}}}],["platform",{"_index":38,"t":{"70":{"position":[[104,9]]}}}],["play",{"_index":10,"t":{"25":{"position":[[92,6]]},"70":{"position":[[73,7]]},"97":{"position":[[160,5]]},"147":{"position":[[48,7]]},"203":{"position":[[45,6]]},"233":{"position":[[35,4],[197,4]]},"277":{"position":[[96,4]]},"300":{"position":[[73,4]]}}}],["player",{"_index":37,"t":{"70":{"position":[[94,6]]},"159":{"position":[[59,7]]}}}],["plex",{"_index":41,"t":{"70":{"position":[[146,5]]},"167":{"position":[[10,4],[79,4]]}}}],["port",{"_index":124,"t":{"167":{"position":[[50,4]]}}}],["posit",{"_index":49,"t":{"85":{"position":[[51,9]]}}}],["preferences/set",{"_index":141,"t":{"195":{"position":[[53,20]]}}}],["profil",{"_index":30,"t":{"57":{"position":[[51,7]]}}}],["provid",{"_index":181,"t":{"277":{"position":[[52,8]]},"334":{"position":[[19,7]]}}}],["re",{"_index":17,"t":{"34":{"position":[[15,2]]},"38":{"position":[[17,2]]},"42":{"position":[[17,2]]},"50":{"position":[[15,2]]},"57":{"position":[[15,2]]},"117":{"position":[[65,2]]},"125":{"position":[[55,2]]},"139":{"position":[[72,2]]}}}],["reduc",{"_index":51,"t":{"85":{"position":[[92,6]]}}}],["releas",{"_index":223,"t":{"429":{"position":[[7,7]]}}}],["remov",{"_index":66,"t":{"89":{"position":[[125,6]]}}}],["replac",{"_index":161,"t":{"211":{"position":[[109,9]]},"277":{"position":[[31,7]]}}}],["report",{"_index":47,"t":{"85":{"position":[[28,6]]}}}],["review",{"_index":204,"t":{"334":{"position":[[229,6]]}}}],["risk",{"_index":70,"t":{"89":{"position":[[211,5]]}}}],["rockski",{"_index":28,"t":{"50":{"position":[[41,7],[58,7]]},"169":{"position":[[16,8],[34,7]]}}}],["run",{"_index":215,"t":{"403":{"position":[[67,3]]},"411":{"position":[[31,7]]}}}],["scenario",{"_index":32,"t":{"64":{"position":[[0,9]]}}}],["score",{"_index":172,"t":{"233":{"position":[[89,5]]}}}],["scrobbl",{"_index":11,"t":{"25":{"position":[[99,12]]},"34":{"position":[[18,8]]},"38":{"position":[[20,8]]},"42":{"position":[[20,8]]},"50":{"position":[[18,8]]},"57":{"position":[[18,8]]},"85":{"position":[[132,8],[176,9]]},"97":{"position":[[141,8]]},"101":{"position":[[61,11]]},"117":{"position":[[39,8],[68,9]]},"119":{"position":[[46,9]]},"125":{"position":[[34,8],[58,9]]},"131":{"position":[[46,9]]},"139":{"position":[[46,8],[75,9]]},"143":{"position":[[4,8]]},"169":{"position":[[3,8]]},"183":{"position":[[3,8]]},"211":{"position":[[55,8]]}}}],["scrobbler",{"_index":57,"t":{"85":{"position":[[166,9]]},"97":{"position":[[104,9]]},"105":{"position":[[19,9]]},"111":{"position":[[19,9]]},"119":{"position":[[26,9]]},"131":{"position":[[26,9]]},"211":{"position":[[6,9]]},"233":{"position":[[121,9]]},"403":{"position":[[18,9]]},"411":{"position":[[50,9]]}}}],["scrobbler'",{"_index":167,"t":{"211":{"position":[[189,11]]}}}],["search",{"_index":179,"t":{"277":{"position":[[20,6]]}}}],["see",{"_index":213,"t":{"391":{"position":[[66,3]]}}}],["server",{"_index":25,"t":{"46":{"position":[[15,6]]},"105":{"position":[[74,6]]},"119":{"position":[[105,7]]},"131":{"position":[[110,7]]},"143":{"position":[[25,7]]},"147":{"position":[[27,6]]},"163":{"position":[[74,6]]}}}],["servic",{"_index":202,"t":{"334":{"position":[[174,7]]},"403":{"position":[[87,7]]}}}],["setup",{"_index":24,"t":{"46":{"position":[[0,5]]},"163":{"position":[[81,6]]}}}],["song",{"_index":9,"t":{"25":{"position":[[77,5]]}}}],["sourc",{"_index":22,"t":{"34":{"position":[[72,8]]},"38":{"position":[[81,8]]},"42":{"position":[[88,8]]},"50":{"position":[[66,8]]},"57":{"position":[[76,8]]},"70":{"position":[[2,6],[19,6]]},"89":{"position":[[5,6],[192,6]]},"117":{"position":[[5,6]]},"119":{"position":[[5,6]]},"125":{"position":[[5,6]]},"131":{"position":[[5,6]]},"139":{"position":[[5,6]]},"147":{"position":[[98,7]]},"179":{"position":[[5,6]]},"334":{"position":[[77,6],[131,6]]}}}],["spotifi",{"_index":39,"t":{"70":{"position":[[127,8]]},"175":{"position":[[0,7]]}}}],["stage",{"_index":170,"t":{"233":{"position":[[16,5]]},"277":{"position":[[9,5]]},"300":{"position":[[11,5]]}}}],["standard",{"_index":103,"t":{"147":{"position":[[72,8],[89,8]]},"159":{"position":[[11,8]]}}}],["start",{"_index":190,"t":{"317":{"position":[[0,5]]}}}],["station",{"_index":82,"t":{"101":{"position":[[32,7]]}}}],["step",{"_index":194,"t":{"334":{"position":[[29,4],[37,4]]}}}],["stop",{"_index":151,"t":{"207":{"position":[[120,4]]}}}],["store",{"_index":6,"t":{"25":{"position":[[32,6]]}}}],["stream",{"_index":83,"t":{"101":{"position":[[40,9]]}}}],["string",{"_index":162,"t":{"211":{"position":[[119,7]]}}}],["subson",{"_index":128,"t":{"179":{"position":[[64,8]]}}}],["such",{"_index":105,"t":{"147":{"position":[[106,4]]},"179":{"position":[[117,5]]}}}],["support",{"_index":101,"t":{"147":{"position":[[39,8]]},"179":{"position":[[81,8]]},"207":{"position":[[50,9]]},"211":{"position":[[24,7]]}}}],["system",{"_index":116,"t":{"159":{"position":[[86,8]]}}}],["tcp",{"_index":111,"t":{"155":{"position":[[35,3]]}}}],["teal.fm",{"_index":31,"t":{"57":{"position":[[68,7]]},"183":{"position":[[41,7]]}}}],["threshold",{"_index":55,"t":{"85":{"position":[[141,10]]}}}],["time",{"_index":67,"t":{"89":{"position":[[153,5]]},"207":{"position":[[140,4]]},"211":{"position":[[174,5]]}}}],["titl",{"_index":163,"t":{"211":{"position":[[130,6]]}}}],["to",{"_index":64,"t":{"89":{"position":[[99,4]]}}}],["token",{"_index":120,"t":{"167":{"position":[[15,5]]}}}],["track",{"_index":35,"t":{"70":{"position":[[58,6]]},"85":{"position":[[35,5]]},"117":{"position":[[89,6]]},"139":{"position":[[96,6]]}}}],["tri",{"_index":187,"t":{"300":{"position":[[45,3]]}}}],["trivial",{"_index":196,"t":{"334":{"position":[[63,9]]}}}],["tunein",{"_index":108,"t":{"147":{"position":[[137,7]]}}}],["type",{"_index":214,"t":{"391":{"position":[[84,6]]}}}],["unoffici",{"_index":58,"t":{"89":{"position":[[17,10]]},"207":{"position":[[31,10]]}}}],["up",{"_index":218,"t":{"411":{"position":[[24,2]]}}}],["updat",{"_index":224,"t":{"451":{"position":[[0,8]]}}}],["url",{"_index":123,"t":{"167":{"position":[[42,3]]}}}],["us",{"_index":54,"t":{"85":{"position":[[126,5]]},"89":{"position":[[12,4],[183,3]]},"97":{"position":[[36,5]]},"101":{"position":[[53,3]]},"129":{"position":[[8,5]]},"155":{"position":[[25,5]]},"163":{"position":[[12,3]]},"167":{"position":[[55,4]]},"179":{"position":[[19,4]]},"191":{"position":[[25,5]]},"233":{"position":[[131,4]]},"277":{"position":[[15,4]]},"300":{"position":[[17,4]]},"334":{"position":[[186,4],[198,5]]},"411":{"position":[[60,5]]}}}],["user",{"_index":178,"t":{"277":{"position":[[4,4]]}}}],["violat",{"_index":62,"t":{"89":{"position":[[77,9]]}}}],["vlc",{"_index":134,"t":{"191":{"position":[[21,3]]}}}],["web",{"_index":86,"t":{"105":{"position":[[70,3]]},"111":{"position":[[72,3]]},"191":{"position":[[35,3]]}}}],["webscrobbl",{"_index":138,"t":{"195":{"position":[[21,12]]}}}],["websocket",{"_index":118,"t":{"163":{"position":[[49,9]]}}}],["work",{"_index":152,"t":{"207":{"position":[[125,7],[186,5]]}}}],["youtub",{"_index":42,"t":{"70":{"position":[[152,7]]}}}],["yt",{"_index":146,"t":{"207":{"position":[[19,2],[177,2]]}}}]],"pipeline":["stemmer"]}},{"documents":[],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[],"invertedIndex":[],"pipeline":["stemmer"]}},{"documents":[{"i":2,"t":"tip Check the FAQ if you have any issues after configuration!","s":"Overview","u":"/multi-scrobbler/configuration/","h":"","p":1},{"i":4,"t":"Sources and Clients are configured using: environmental (ENV) variables client/source specific json config files an all-in-one json config file MS will parse configuration from all configuration types. You can mix and match configurations but it is generally better to stick to one or the other. ENV File File AIO MS will parse environmental variables present in the OS/container when it is run. This method means MS does not require files to run. Use ENV-based configuration if... You are the only person for whom MS is scrobbling for You have a very simple setup for MS such as one scrobble Client and one Source IE Plex -> Maloja Config Example For Docker container... docker run -e \"SPOTIFY_CLIENT_ID=yourId\" -e \"SPOTIFY_CLIENT_SECRET=yourSecret\" ... For Docker Compose docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler environment: - SPOTIFY_CLIENT_ID=yourId - SPOTIFY_CLIENT_SECRET=yourSecret - MALOJA_URL=http://domain.tld:42010 - MALOJA_API_KEY=1234 # ... # ... For a local/node installation export variables before running... SPOTIFY_CLIENT_ID=yourId SPOTIFY_CLIENT_SECRET=yourSecret npm run start MS will parse configuration files located in the directory specified by the CONFIG_DIR environmental variable. This variable defaults to: Local installation -> PROJECT_DIR/config Docker -> /config (in the container) -- see the install docs for how to configure this correctly Use File-based configuration if... You have many Sources You have many of each type of Source you want to scrobble from IE 2x Plex accounts, 3x Spotify accounts, 1x Funkwhale... You have more than one scrobble Client you want to scrobble to IE multiple Maloja servers You want only to scrobble to specific Clients You need to setup more advanced configuration for a Source/Client Most Source/Clients only support basic configuration through ENV, all configuration is possible using File/AIO tip There are example configurations for all Source/Client types and AIO config located in the /config directory of this project. These can be used as-is by renaming them to .json. For docker installations these examples are copied to your configuration directory on first-time use. There is also a kitchensink example that provides examples of using all sources/clients in a complex configuration. Each file is named by the type of the Client/Source found in below sections. Each file as an array of that type of Client/Source. Example directory structure: /CONFIG_DIR plex.json spotify.json maloja.json Config Example CONFIG_DIR/spotify.json [ { \"name\": \"MySpotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] MS will parse an all-in-one configuration file located in the directory specified by the CONFIG_DIR environmental variable. This variable defaults to: Local installation -> PROJECT_DIR/config/config.json Docker -> /config/config.json (in the container) -- see the install docs for how to configure this correctly Use AIO-based configuration if... You have many Sources You have many of each type of Source you want to scrobble from IE 2x Plex accounts, 3x Spotify accounts, 1x Funkwhale... You have more than one scrobble Client you want to scrobble to IE multiple Maloja servers You want only to scrobble to specific Clients You need to setup monitoring/webhooks You want to setup defaults for all Sources/Clients The AIO config also enables setting default options for sources/clients as well as global options for MS itself. tip An example AIO config files can be found in the project directory at /config/config.json.example For docker installations this example is copied to your configuration directory on first-time use. There is also a kitchensink example that provides examples of using all sources/clients in a complex configuration. Explore the schema for this configuration, along with an example generator and validator, here Config Example CONFIG_DIR/config.json { \"debugMode\": false, \"disableWeb\": false, \"sourceDefaults\": { \"logPayload\": false, \"logFilterFailure\": \"warn\", \"logPlayerState\": false, \"scrobbleThresholds\": { \"duration\": 30, \"percent\": 50 }, \"maxPollRetries\": 1, \"maxRequestRetries\": 1, \"retryMultiplier\": 1.5 }, \"clientDefaults\": { \"maxRequestRetries\": 1, \"retryMultiplier\": 1.5 }, \"sources\": [ { \"type\": \"spotify\", \"enable\": true, \"clients\": [\"myConfig\"], \"name\": \"mySpotifySource\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\" } } ], \"clients\": [ { \"type\": \"maloja\", \"enable\": true, \"name\": \"myConfig\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ], \"webhooks\": [ { \"name\": \"FirstGotifyServer\", \"type\": \"gotify\", \"url\": \"http://localhost:8070\", \"token\": \"MyGotifyToken\", \"priorities\": { \"info\": 5, \"warn\": 7, \"error\": 10 } }, { \"type\": \"ntfy\", \"name\": \"MyNtfyFriendlyNameForLogs\", \"url\": \"http://localhost:9991\", \"topic\": \"MyMultiScrobblerTopic\", \"username\": \"Optional\", \"password\": \"Optional\", \"priorities\": { \"info\": 3, \"warn\": 4, \"error\": 5 } } ] }","s":"Configuration Types","u":"/multi-scrobbler/configuration/","h":"#configuration-types","p":1},{"i":6,"t":"See the Configuration Types above for your options for creating Source and Client configurations. Reference Scrobble Sources for what Sources are available Reference Scrobble Clients for what Clients are available Each entry for a Source/Client includes a Configuration section that describes how to configure it using a configuration type.","s":"Setup Sources and Clients","u":"/multi-scrobbler/configuration/","h":"#setup-sources-and-clients","p":1},{"i":8,"t":"When using File or AIO Configuration, Multi-Scrobbler can interpolate Environmental Variables into your json files. This can be used, for example, to keep sensitive data (like Last.fm Client/Secret) out of your configuration files so that they can be committed to git. Multi-scrobbler will look for patterns in text fields within all of your json files: Some part of the text field matches: [[MY_ENV]] Is replaced by the value of the Environmental Variable named MY_ENV Example Given this Last.fm File config: lastfm.json [ { \"name\": \"myLastFmClient\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"[[MY_APIKEY]]\", \"secret\": \"[[MY_SECRET]]\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] And these environmental variables, in this scenario set through environment in the docker compose installation: MY_APIKEY=a89cba1569901a0671d5a9875fed4be1 MY_SECRET=ec42e09d5ae0ee0f0816ca151008412a The resulting json multi-scrobbler would use: lastfm.json [ { \"name\": \"myLastFmClient\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] Caveats ENV variable names/interpolation keys are case-insensitive Interpolation only works for string values within json. This cannot be used for numbers, booleans, objects, etc... Missing ENVS Multi-scrobbler will not throw an error if the environmental value is not found. Instead, it will leave the string as-is and log a warning (WARN level) with the names of the missing environmental variable names like so: WARN : [App] [Sources] [spotify Secrets] Matched: None | Unmatched: SPOTIFY_SECRET ENV Name Collisions Verify that interpolation keys/environmental variable names you will use do not collide with existing ENV names used by multi-scrobbler. Use the docs search to verify the name you want to use is not already used elsewhere by multi-scrobbler.","s":"Secrets Interpolation","u":"/multi-scrobbler/configuration/","h":"#secrets-interpolation","p":1},{"i":10,"t":"These options affect multi-scrobbler's behavior and are not specific to any source/client.","s":"Application Options","u":"/multi-scrobbler/configuration/","h":"#application-options","p":1},{"i":12,"t":"Defines the URL that is used to generate default redirect URLs for authentication on spotify and lastfm -- as well as some logging hints. Default => http://localhost:9078 Set with ENV BASE_URL or baseUrl all-in-one configuration If protocol is http or no protocol is specified MS will try to use port 9078 -- to override this explicitly set the port or use https Useful when running with docker so that you do not need to specify redirect URLs for each configuration. Example EX Lastfm Redirect Url is BASE_URL:PORT/lastfm/callback (when no other redirectUri is specified for lastfm configuration) BASE_URL Redirect URL 192.168.0.101 http://192.168.0.101:9078/lastfm/callback http://my.domain.local http://my.domain.local:9078/lastfm/callback http://192.168.0.101/my/subfolder http://192.168.0.101:9078/my/subfolder/lastfm/callback BASE_URL Redirect URL my.domain.local:80 http://192.168.0.101:80/lastfm/callback my.domain.local:9000 http://my.domain.local:9000/lastfm/callback 192.168.0.101:4000/my/subfolder http://192.168.0.101:4000/my/subfolder/lastfm/callback https://192.168.0.101 https://192.168.0.101:443/lastfm/callback","s":"Base URL","u":"/multi-scrobbler/configuration/","h":"#base-url","p":1},{"i":14,"t":"Multi-scrobbler caches some activities to persist important data across restarts, reduce external API calls, and make some actions faster. All of the activities below are always cached in-memory with an optional, configurable secondary store for persistence. Scrobbles Auth Data Transform API Calls Queued and Failed Scrobbles are cached so that any un-scrobbled data you have is persisted across restarts of multi-scrobbler. tip By default, this data use a Secondary File store, configured for you automatically. If you have configured a persisted volume/bind mount for configuration (/config is mounted in docker compose) then you are already done. If you are not persisting this directory then you should consider setting up Valkey Cache for this. Configuration​ Use any Secondary Cache, the config examples below show the default values: ENV AIO Environmental Variable Required? Default Description CACHE_SCROBBLE No file The cache type to use CACHE_SCROBBLE_CONN No /config config.json { \"cache\": { \"scrobble\": { \"provider\": \"file\", \"connection\": \"/config\" } }, // ... } Authentication sessions/tokens/etc... are cached for quicker requests and for persistence across restarts. tip By default, this data use a Secondary File store, configured for you automatically. If you have configured a persisted volume/bind mount for configuration (/config is mounted in docker compose) then you are already done. If you are not persisting this directory then you should consider setting up Valkey Cache for this. Configuration​ Use any Secondary Cache, the config examples below show the default values: ENV AIO Environmental Variable Required? Default Description CACHE_AUTH No file The cache type to use CACHE_AUTH_CONN No /config config.json { \"cache\": { \"auth\": { \"provider\": \"file\", \"connection\": \"/config\" } }, // ... } API Calls to external (metadata) services used to Enhance Scrobbles, like calls to Musicbrainz, can be cached to avoid duplicate calls and speed up scrobble transformations. By default, these calls are only cached in memory. If you wish for cached calls to be persisted across restarts then setup Valkey Cache. Configuration​ Use any Secondary Cache, the config examples below show the default values: ENV AIO Environmental Variable Required? Default Description CACHE_METADATA No The cache type to use CACHE_METADATA_CONN No config.json { \"cache\": { \"metadata\": { \"provider\": \"valkey\", \"connection\": \"yourConnectionStringHere\" } }, // ... } Secondary Caching Configuration​ The type of cache used, and its connection properties, can be configured through ENV or AIO config. File Valkey File cache is stored in the CONFIG_DIR directory using the pre-defined file name ms-[cacheName].cache. ENV AIO Example Environmental Variable Required? Default Description CACHE_SCROBBLE No file The cache type to use CACHE_SCROBBLE_CONN No /config The directory, within the container, to store the cache file Example config.json { \"cache\": { \"scrobble\": { \"provider\": \"file\", \"connection\": \"/config\" } }, // ... } Valkey is an open-source fork of Redis. Adding Valkey container to multi-scrobbler A valkey container can be added to the multi-scrobbler docker compose stack: docker-compose.yml services: multi-scrobbler: # ... # adding everything below valkey: image: valkey/valkey volumes: - valkeydata:/data volumes: valkeydata: driver: local Use redis://valkey:6379 as the connection string in the configurations below. The connection string used by multi-scrobbler to connect to your Valkey instance must be in the form: redis://HOST_IP:HOST_PORT ENV AIO Example Environmental Variable Required? Default Description CACHE_METADATA Yes valkey The cache type to use CACHE_METADATA_CONN Yes The host/IP and port to connect to EX: redis://192.168.0.120:6379 Example config.json { \"cache\": { \"metadata\": { \"provider\": \"valkey\", \"connection\": \"redis://192.168.0.120:6379\" } }, // ... }","s":"Caching","u":"/multi-scrobbler/configuration/","h":"#caching","p":1},{"i":16,"t":"Turning on Debug Mode will override and enable all optional \"debugging\" options found in configuration set log output to DEBUG Use this as a shortcut for enabling output that can be used for troubleshooting and issue reporting. Be aware that logs will likely be VERY noisy while Debug Mode is on. You should only have this mode on while gathering logs for troubleshooting and then turn it off afterwards. To set debug mode either add it to AIO config.json config.json { \"debugMode\": true, \"sources\": [...], // ... } or set the ENV DEBUG_MODE=true","s":"Debug Mode","u":"/multi-scrobbler/configuration/","h":"#debug-mode","p":1},{"i":18,"t":"If you do not need the dashboard and/or ingress sources, or have security concerns about ingress and cannot control your hosting environment, the web server and API can be disabled. warning Any ingress-based sources will be unusable (Webscrobbler, etc...) if this is disabled. Disable using either: ENV DISABLE_WEB=true In All-in-One File use the top-level property \"disableWeb\": true","s":"Disable Web","u":"/multi-scrobbler/configuration/","h":"#disable-web","p":1},{"i":20,"t":"Multi-scrobbler supports some common webhooks and a healthcheck endpoint in order to monitor Sources and Clients for errors.","s":"Monitoring","u":"/multi-scrobbler/configuration/","h":"#monitoring","p":1},{"i":22,"t":"Webhooks will push a notification to your configured servers on these events: Source polling started Source polling retry Source polling stopped on error Scrobble client scrobble failure Webhooks are configured in the AIO config.json file under the webhook top-level property. Multiple webhooks may be configured for each webhook type. Example config.json { \"sources\": [ //... ], \"clients\": [ //... ], \"webhooks\": [ { \"name\": \"FirstGotifyServer\", \"type\": \"gotify\", \"url\": \"http://192.168.0.100:8070\", \"token\": \"abcd\" }, { \"name\": \"SecondGotifyServer\", \"type\": \"gotify\", //... }, { \"name\": \"NtfyServerOne\", \"type\": \"ntfy\", //... }, //... ] } Gotify​ Refer to the config schema for GotifyConfig multi-scrobbler optionally supports setting message notification priority via info warn and error mappings. Example config.json { \"type\": \"gotify\", \"name\": \"MyGotifyFriendlyNameForLogs\", \"url\": \"http://192.168.0.100:8070\", \"token\": \"AQZI58fA.rfSZbm\", \"priorities\": { \"info\": 5, \"warn\": 7, \"error\": 10 } } Ntfy​ Refer to the config schema for NtfyConfig multi-scrobbler optionally supports setting message notification priority via info warn and error mappings. Example config.json { \"type\": \"ntfy\", \"name\": \"MyNtfyFriendlyNameForLogs\", \"url\": \"http://192.168.0.100:9991\", \"topic\": \"RvOwKJ1XtIVMXGLR\", \"username\": \"Optional\", \"password\": \"Optional\", \"priorities\": { \"info\": 3, \"warn\": 4, \"error\": 5 } } Apprise​ Refer to the config schema for AppriseConfig multi-scrobbler supports stateless and persistent storage endpoints as well as tags/ Example config.json { \"type\": \"apprise\", \"name\": \"MyAppriseFriendlyNameForLogs\", \"host\": \"http://192.168.0.100:8080\", \"urls\": [\"gotify://192.168.0.101:8070/MyToken\"], // stateless endpoints \"keys\": [\"e90b20526808373353afad7fb98a201198c0c3e0555bea19f182df3388af7b17\"], //persistent storage endpoints \"tags\": [\"my\",\"optional\",\"tags\"] }","s":"Webhook Configurations","u":"/multi-scrobbler/configuration/","h":"#webhook-configurations","p":1},{"i":24,"t":"An endpoint for monitoring the health of sources/clients is available at GET http://YourMultiScrobblerDomain/health Returns 200 OK when everything is working or 500 Internal Server Error if anything is not The plain url (/health) aggregates status of all clients/sources -- so any failing client/source will make status return 500 Use query params type or name to restrict client/sources aggregated IE /health?type=spotify or /health?name=MyMaloja On 500 the response returns a JSON payload with messages array that describes any issues For any clients/sources that require authentication /health will return 500 if they are not authenticated For sources that poll (spotify, yt music, subsonic) /health will 500 if they are not polling","s":"Health Endpoint","u":"/multi-scrobbler/configuration/","h":"#health-endpoint","p":1},{"i":26,"t":"A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz...","s":"Overview","u":"/multi-scrobbler/configuration/clients/","h":"","p":25},{"i":28,"t":"Name Now Playing Last.fm ✅ Listenbrainz ✅ Koito ❌ Maloja ❌ Rocksky ❌ Teal.fm ❌","s":"Clients","u":"/multi-scrobbler/configuration/clients/","h":"#clients","p":25},{"i":31,"t":"If multi-scrobbler is unable to submit a scrobble to a Client then it places the scrobble into a queue which is retried every 5 minutes for a number of times before it gives up. After it stops automatically retrying the scrobble still exists and can be retried from the dashboard. Dead scrobbles persist between restart so you will never lose a scrobble that hasn't been successfully submitted yet.","s":"Dead Scrobbles","u":"/multi-scrobbler/configuration/clients/","h":"#dead-scrobbles","p":25},{"i":33,"t":"Multi-scrobbler can report the currently playing tracks it is monitoring to some Scrobble Clients via their individual Now Playing functionality. Now Playing is default enabled for all Clients that support it. The behavior multi-scrobbler uses for determining Now Playing reporting: Now Playing can be explicitly enabled or disabled globally using ENV NOW_PLAYING=true or NOW_PLAYING=false This only affects Clients that don't have behavior set via File/AIO (below) Now Playing will be only be reported to the same Clients a Source is configured to scrobble to A Source's Player status must be Playing, IE active, for reporting to occur This status can be verified via Player UI on the Dashboard If multiple Sources having active Players then the scrobble Client will default to reporting the track based on Source configuration name, alphabetically This is the name property set in File or AIO source configs Clients can customize the Now Playing behavior individually using File or AIO source configs: CONFIG_DIR/lastfm.json [ { \"name\": \"myLastFmClient\", \"configureAs\": \"client\", \"data\": { // ... }, \"options\": { // disable or enable //\"nowPlaying\": true // // OR define a list of Source *config* names that should be allowed to report Now Playing // order of the list determines priority for reporting Now Playing //\"nowPlaying\": [\"mySpotify1\",\"myJellyfin2\"] } }, ]","s":"Now Playing","u":"/multi-scrobbler/configuration/clients/","h":"#now-playing","p":25},{"i":35,"t":"Other Uses To monitor and re-scrobble activity from a Koito account create a Koito (Source) Setup a Koito server if you have not already done this. Create (or get) an API Key From your Koito server dashboard navigate to Settings (bottom-left icon) => API Keys Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key EX pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL Take note of your Koito username (used below as KOITO_USER) Determine your Koito URL This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance. EX dashboard at http://192.168.0.100:4110 => KOITO_URL is set to http://192.168.0.100:4110 Koito Base URL Using the URL path /apis/listenbrainz Koito docs describe is not required. The Koito URL used for multi-scrobbler should only be the base URL. Only include a URL path if your Koito base url is not at host:port. See the table below for examples. Base URL Examples KOITO_URL MS Detected Base URL Example Scrobble Api URL http://192.168.0.100:4110 http://192.168.0.100:4110 http://192.168.0.100:4110/apis/listenbrainz/1 https://koito.mydomain.com https://koito.mydomain.com https://koito.mydomain.com/apis/listenbrainz/1 http://192.168.0.100:4110/apis/listenbrainz http://192.168.0.100:4110 http://192.168.0.100:4110/apis/listenbrainz/1 http://192.168.0.100:80/koito http://192.168.0.100:80/koito http://192.168.0.100:80/koito/apis/listenbrainz/1 tip Ensure that Koito is configured to allow requests from multi-scrobbler! In Koito config set KOITO_ALLOWED_HOSTS to the IP the multi-scrobbler dashboard is accessible from.","s":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","h":"","p":34},{"i":37,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description KOITO_TOKEN Yes API Key from your Koito Account KOITO_USER Yes Your Koito username KOITO_URL No The base URL for the Koito server File Config Type CONFIG/koito.json [ { \"name\": \"koito-client\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"koito-client\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" }, \"type\": \"koito\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/koito/","h":"#configuration","p":34},{"i":39,"t":"Other Users To monitor and re-scrobble activity from your Last.fm account create a Last.fm (Source) To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a Last.fm (Endpoint) Register for an API account here. The Callback URL is actually specified by multi-scrobbler but to keep things consistent you should use http://localhost:9078/lastfm/callback or replace localhost:9078 with your own base URL.","s":"Last.fm","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"","p":38},{"i":41,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LASTFM_API_KEY Yes Api Key from your API Account LASTFM_SECRET Yes Shared secret from your API Account LASTFM_REDIRECT_URI No http://localhost:9078/lastfm/callback Url to use for authentication. Must include lastfm/callback somewhere in it LASTFM_SESSION No Session id. Will be generated by authentication flow if not provided. File Config Type CONFIG/lastfm.json [ { \"name\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"type\": \"lastfm\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#configuration","p":38},{"i":43,"t":"Other Users To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source) To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a Listenbrainz (Endpoint) You will need to run your own Listenbrainz server or have an account on the official instance On your profile page find your User Token to use in the configuration.","s":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"","p":42},{"i":45,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LZ_TOKEN Yes User token from your LZ profile LZ_USER Yes Your LZ username LZ_URL No https://api.listenbrainz.org/ The base URL for the LZ server File Config Type CONFIG/listenbrainz.json [ { \"name\": \"brainzClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"brainzClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" }, \"type\": \"listenbrainz\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"#configuration","p":42},{"i":47,"t":"Setup a Maloja server if you have not already done this. Maloja Setup Intructions Using Maloja's example docker-compose.yml: ~/malojaData/docker-compose.yml loading... View on GitHub Uncomment environment and add MALOJA_FORCE_PASSWORD=CHANGE_ME to set an admin password Start the container: ~/malojaData docker compose up -d Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at http://myMalojaServerIP/admin_apikeys) Create a New Key and then copy the generated key value Finally, add the Maloja server URL and API Key to the configuration type you choose to use, below.","s":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","h":"","p":46},{"i":49,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MALOJA_URL Yes Base URL of your installation MALOJA_API_KEY Yes Api Key File Config Type CONFIG/maloja.json [ { \"name\": \"myMaloja-client\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myMaloja-client\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" }, \"type\": \"maloja\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/maloja/","h":"#configuration","p":46},{"i":51,"t":"Other Uses To monitor and re-scrobble activity from Rocksky create a Rocksky (Source) Rocksky is music tracking and discovery platform built on the AT Protocol (Bluesky). How does that work? The AT Protocol is a standard to allow different applications to share and interpret your social data. Your data is stored in a personal repository in a PDS (Personal Data Server), which is data-type agnostic (it's just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc... Even though the application and the PDS/repository are independent, all of this is done for you automatically when you create a Bluesky account. So... multi-scrobbler \"scrobbles\" your plays to your repository in a JSON data structure which includes Rocksky's data type and structure at a known location for Rocksky's data (app.rocksky), in a list that is appended to as you continue to scrobble when accessing Rocksky, or another application that knows how to read it, your data is pulled from the repository to render the app Public Data The default Bluesky PDS is public, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy. No Scrobbling Guarantee Rocksky does not guarantee that every scrobble you send will be persisted. Rocksky's design goal is to store scrobbles with metdata-complete, 3rd party verifiable track information so that it can be a metadata-rich discovery platform, rather than an exhaustive scrobble data source-of-truth. To do this it asynchronously matches your scrobble data against Musicbrainz's and/or Spotify's catalogs, after the scrobble has been submitted. If the scrobble does not end up matching then it is not persisted. If you need your scrobbles to be 100% captured then you should scrobble to an additional Scrobble Client.","s":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"","p":50},{"i":53,"t":"You will need a Bluesky account to use Rocksky. note Usage is adapted from Rocksky docs on docs.rocksky.app Navigate to rocksky.app and sign up/logn using your Bluesky account Then, navigate to the RockSky developer dashboard and obtain an API Key","s":"Setup","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#setup","p":50},{"i":56,"t":"The handle used with multi-scrobbler should be your full ATProto handle, including TLD. For regular Bluesky account this will be like: alice.bsky.social For Bluesky accounts that use their website as their account this is your domain: mydomain.com For non-Bluesky users, you probably already know your handle If you do not include a TLD then multi-scrobbler will automatically append .bsky.social to your handle value. ENV File AIO ENV Config Type Environmental Variable Required? Default Description ROCKSKY_HANDLE Yes Your full ATProto handle. For Bluesky account this is like myUser.bsky.social ROCKSKY_KEY Yes API Key obtained from Rocksky developer dashboard File Config Type CONFIG/rocksky.json [ { \"name\": \"myRockskyClient\", \"configureAs\": \"client\", \"data\": { \"key\": \"7cdr86vis3mpq5b1pi01md0hkm7ykzzxjy81r\", \"handle\": \"alice.bsky.social\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myRockskyClient\", \"configureAs\": \"client\", \"data\": { \"key\": \"7cdr86vis3mpq5b1pi01md0hkm7ykzzxjy81r\", \"handle\": \"alice.bsky.social\" }, \"type\": \"rocksky\" } ] } or explore the schema with an example and live editor/validator","s":"Handle","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#handle","p":50},{"i":58,"t":"Other Uses To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source) teal.fm is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a PDS (Personal Data Server). How does that work? The AT Protocol is a standard to allow different applications to share and interpret your social data. Your data is stored in a personal repository in a PDS (Personal Data Server), which is data-type agnostic (it's just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc... Even though the application and the PDS/repository are independent, all of this is done for you automatically when you create a Bluesky account. So... multi-scrobbler \"scrobbles\" your plays to your repository in a JSON data structure which includes teal.fm's data type and structure at a known location for teal.fm's data (fm.teal), in a list that is appended to as you continue to scrobble when accessing teal.fm, or another application that knows how to read it, your data is pulled from the repository to render the app warning The default Bluesky PDS is public, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy. note teal.fm is still in developement and does not have a public website, yet. To view your teal.fm scrobbles you can: use wrapped.baileytownsend.dev which gives a simple stats overview of your scrobbles use teal-slice.wisp.place for a preview of teal.fm use atproto.at to view the raw data (convenience URLs are generated in multi-scrobbler for you to do this)","s":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"","p":57},{"i":60,"t":"Bluesky​ Create a Bluesky account, if you don't already have one Navigate to https://bsky.app/settings/app-passwords Settings -> Privacy and Security -> App passwords Create a new App Password and save it somewhere, it will not be shown again","s":"Setup","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#setup","p":57},{"i":63,"t":"The ATPRoto identifier used with multi-scrobbler should be either: A valid DID, starting with did:plc:... or did:web:... Your full ATProto handle, including TLD If using a handle: For regular Bluesky account this will be like: alice.bsky.social For Bluesky accounts that use their domain as their account this is your domain: mydomain.com For non-Bluesky-PDS users, you probably already know your handle If your identifier does not look like a DID and does not include a TLD then multi-scrobbler will automatically append .bsky.social to your handle value. ENV File AIO ENV Config Type Environmental Variable Required? Default Description TEALFM_IDENTIFIER Yes Your full ATProto handle or DID. For Bluesky account this is like myUser.bsky.social TEALFM_APP_PW Yes Bluesky/ATProto network App Password File Config Type CONFIG/tealfm.json [ { \"name\": \"myTeal\", \"configureAs\": \"client\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myTeal\", \"configureAs\": \"client\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\" }, \"type\": \"tealfm\" } ] } or explore the schema with an example and live editor/validator","s":"Identifier","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#identifier","p":57},{"i":65,"t":"Scenario: You want to scrobble plays for yourself (Foxx), Fred, and Mary Each person has their own Maloja server Each person has their own Spotify account You have your own Airsonic (subsonic) server you to scrobble from You have your own Youtube Music account you want to scrobble from Mary has her own Last.fm account she also wants to scrobble to Fred has his own Spotify application and provides you with just his access and refresh token because he doesn't trust you (wtf Fred) Fred has a Plex server and wants to scrobble everything he plays Mary uses Fred's Plex server but only wants to scrobble her plays from the podcast library The three of you have a shared library on Plex called party that you only play when you are hanging out. You want plays from that library to be scrobbled to everyone's servers. Fred also has his own Jellyfin server and wants to scrobble everything he plays You have an android music app that can scrobble to a custom listenbrainz server","s":"Example Complex Scenario","u":"/multi-scrobbler/configuration/kitchensink/","h":"","p":64},{"i":67,"t":"CONFIG_DIR/config.json { \"sourceDefaults\": { \"maxPollRetries\": 0, // optional, default # of automatic polling restarts on error. can be overridden by property in individual config \"maxRequestRetries\": 1, // optional, default # of http request retries a source can make before error is thrown. can be overridden by property in individual config \"retryMultiplier\": 1.5, // optional, default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying). can be overridden by property in individual config }, \"clientDefaults\": { \"maxRequestRetries\": 1, // optional, default # of http request retries a client can make before error is thrown. can be overridden by property in individual config \"retryMultiplier\": 1.5, // optional, default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying). can be overridden by property in individual config }, \"sources\": [ { \"type\": \"spotify\", \"name\": \"foxxSpot\", \"clients\": [\"foxxMaloja\"], \"data\": { \"clientId\": \"foxxSpotifyAppId\", \"clientSecret\": \"foxxSpotifyAppSecret\", }, \"options\": { \"maxRequestRetries\": 2, // override default max retries because spotify can...spotty } }, { \"type\": \"spotify\", \"name\": \"marySpot\", \"clients\": [\"maryMaloja\"], \"data\": { \"clientId\": \"foxxSpotifyAppId\", // only need one application, it can be used by all users of this multi-scrobbler instance \"clientSecret\": \"foxxSpotifyAppSecret\", } }, { \"type\": \"spotify\", \"name\": \"fredSpot\", \"clients\": [\"fredMaloja\"], \"data\": { \"accessToken\": \"fredsToken\", \"refreshToken\": \"fredsRefreshToken\", \"interval\": 120, // he also wants a slower check interval because his application already has heavy api usage } }, { \"type\": \"plex\", \"name\": \"fredPlex\", \"clients\": [\"fredMaloja\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"fredUser\"] } }, { \"type\": \"plex\", \"name\": \"maryPlex\", \"clients\": [\"maryMaloja\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"maryUser\"], // still need to specify mary as user so not all users who play from 'podcasts' get scrobbled \"librariesAllow\": [\"podcasts\"] } }, { \"type\": \"plex\", \"name\": \"partyPlex\", // omitting clients (or making it empty) will make this Source scrobble to all Clients \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"librariesAllow\": [\"party\"] } }, { \"type\": \"jellyfin\", \"name\": \"FredJelly\", // omitting clients (or making it empty) will make this Source scrobble to all Clients \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\", \"usersAllow\": [\"fredUser\"] } }, { \"type\": \"subsonic\", \"name\": \"foxxAirsonic\", \"clients\": [\"foxxMaloja\"], \"data\": { \"user\": \"foxx\", \"password\": \"foxxPassword\", \"url\": \"https://airsonic.foxx.example\" } }, { \"type\": \"ytmusic\", \"name\": \"foxxYoutube\", \"clients\": [\"foxxMaloja\"], \"data\": { \"cookie\": \"__Secure-3PAPISID=3AxsXpy0MKGu75Qb/AkISXGqOnSDn1jEKn; DEVICE_INFO=ChxOekU0Tmpjek5EWTBPRGd3TlRBMk16QXpNdz09EJbS8Z0GGJbS8Z0G; ...\", } }, { \"type\": \"endpointlz\", \"name\": \"listenbrainzfoxx\", \"clients\": [\"foxxMaloja\"], \"data\": { \"token\": \"myToken\" } } ], \"clients\": [ { \"type\": \"maloja\", \"name\": \"foxxMaloja\", \"data\": { \"url\": \"https://maloja.foxx.example\", \"apiKey\": \"foxxApiKey\" } }, { \"type\": \"maloja\", \"name\": \"fredMaloja\", \"data\": { \"url\": \"https://maloja.fred.example\", \"apiKey\": \"fredApiKey\" } }, { \"type\": \"maloja\", \"name\": \"maryMaloja\", \"data\": { \"url\": \"https://maloja.mary.example\", \"apiKey\": \"maryApiKey\" } }, { \"type\": \"lastfm\", \"name\": \"maryLFM\", \"data\": { \"apiKey\": \"maryApiKey\", \"secret\": \"marySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] }","s":"All-in-one Config","u":"/multi-scrobbler/configuration/kitchensink/","h":"#all-in-one-config","p":64},{"i":69,"t":"CONFIG_DIR/spotify.json [ { // may omit 'type' property since app knows this is file is for spotify configs \"name\": \"foxxSpot\", \"clients\": [\"foxxMaloja\"], \"data\": { \"clientId\": \"foxxSpotifyAppId\", \"clientSecret\": \"foxxSpotifyAppSecret\" } }, { \"name\": \"marySpot\", \"clients\": [\"maryMaloja\"], \"data\": { \"clientId\": \"foxxSpotifyAppId\", \"clientSecret\": \"foxxSpotifyAppSecret\" } }, { \"name\": \"fredSpot\", \"clients\": [\"fredMaloja\"], \"data\": { \"accessToken\": \"fredsToken\", \"refreshToken\": \"fredsRefreshToken\", \"interval\": 120 } }, ] CONFIG_DIR/plex.json [ { \"name\": \"fredPlex\", \"clients\": [\"fredMaloja\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"fredUser\"] } }, { \"name\": \"maryPlex\", \"clients\": [\"maryMaloja\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"maryUser\"], \"librariesAllow\": [\"podcasts\"] } }, { \"name\": \"partyPlex\", \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"librariesAllow\": [\"party\"] } } ] CONFIG_DIR/jellyfin.json [ { \"name\": \"FredJelly\", \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\", \"usersAllow\": [\"fredUser\"] } } ] CONFIG_DIR/ytmusic.json [ { \"name\": \"foxxYoutube\", \"clients\": [\"foxxMaloja\"], \"data\": { \"cookie\": \"__Secure-3PAPISID=3AxsXpy0MKGu75Qb/AkISXGqOnSDn1jEKn; DEVICE_INFO=ChxOekU0Tmpjek5EWTBPRGd3TlRBMk16QXpNdz09EJbS8Z0GGJbS8Z0G; ...\", } } ] CONFIG_DIR/endpointlz.json [ { \"name\": \"listenbrainzfoxx\", \"clients\": [\"foxxMaloja\"], \"data\": { \"token\": \"myToken\", } } ] CONFIG_DIR/maloja.json [ { \"name\": \"foxxMaloja\", \"data\": { \"url\": \"https://maloja.foxx.example\", \"apiKey\": \"foxxApiKey\" } }, { \"name\": \"fredMaloja\", \"data\": { \"url\": \"https://maloja.fred.example\", \"apiKey\": \"fredApiKey\" } }, { \"name\": \"maryMaloja\", \"data\": { \"url\": \"https://maloja.mary.example\", \"apiKey\": \"maryApiKey\" } } ] CONFIG_DIR/lastfm.json [ { \"name\": \"maryLFM\", \"data\": { \"apiKey\": \"maryApiKey\", \"secret\": \"marySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ]","s":"Separate JSON files","u":"/multi-scrobbler/configuration/kitchensink/","h":"#separate-json-files","p":64},{"i":71,"t":"A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc...","s":"Overview","u":"/multi-scrobbler/configuration/sources/","h":"","p":70},{"i":73,"t":"Name Networking Scrobble SOT Multi Device/User Scrobble Destination Thresholds Should Scrobble Azuracast Active Activity ❌ ✅ ✅ ✅ Deezer Active History ✅ ✅ ❌ ❌ Google Cast (Chromecast) Active Activity ✅ ✅ ✅ ❌ Icecast Active Activity ❌ ✅ ✅ ✅ Jellyfin Active Activity ✅ ✅ ✅ ❌ JRiver Active Activity ❌ ✅ ✅ ❌ Kodi Active Activity ❌ ✅ ✅ ❌ Koito Active History ❌ ✅ ❌ ❌ Last.fm Active History ❌ ✅ ❌ ❌ Last.fm (Endpoint) Ingress History ❌ ✅ ❌ ❌ ListenBrainz Active History ❌ ✅ ❌ ❌ ListenBrainz (Endpoint) Ingress History ❌ ✅ ❌ ❌ Maloja Active History ❌ ✅ ❌ ❌ Mopidy Active Activity ❌ ✅ ✅ ❌ MPD (Music Player Daemon) Active Activity ❌ ✅ ✅ ❌ Musikcube Active Activity ❌ ✅ ✅ ❌ Plex Active Activity ✅ ✅ ✅ ❌ Rocksky Active History ❌ ✅ ❌ ❌ Spotify Active Activity ✅ ✅ ✅ ❌ Subsonic-compatible APIs Active Activity ✅ ✅ ✅ ❌ teal.fm Active History ❌ ✅ ❌ ❌ WebScrobbler Ingress History ❌ ✅ ❌ ❌ VLC Active Activity ❌ ✅ ✅ ❌ Yamaha MusicCast Active Activity ❌ ✅ ✅ ❌ Youtube Music Active History ❌ ✅ ❌ ❌","s":"Sources","u":"/multi-scrobbler/configuration/sources/","h":"#sources","p":70},{"i":76,"t":"The Sources implemented in multi-scrobbler can be broken down into two categories. By Communication Method​ How does this Source get data from the service/application? Active Ingress The MS Source makes network requests to the service which returns a response with data MS can use to monitor listening activity or scrobbles. The MS Source waits for the service/application to send data to multi-scrobbler. These types of Sources require that multi-scrobbler is accessible to the service, generally through an open port or reverse proxy. By Data Source of Truth​ How does MS determine if/when a song has been played and is scrobbable? Listening Activity Listening History These Sources expose some kind of real-time listening data for users, like: player state (paused, stopped, playing) player position (1:50/2:40) current listened duration (Track A playing for 1m:20s) For theses Sources multi-scrobbler keeps track of the real-time state of your activity and scrobbles a track after it meets certain scrobble thresholds. Some Sources expose their own version of \"this track has been scrobbled.\" Listenbrainz, Koito, and Last.fm are all scrobble services that have \"definitive\" histories of scrobbled tracks. For these Sources multi-scrobbler monitors the listening history data and scrobbles when it sees a new entry in the list.","s":"Types of Sources","u":"/multi-scrobbler/configuration/sources/","h":"#types-of-sources","p":70},{"i":78,"t":"Some Sources report which User is playing a track and/or on what device the track is being played. These Sources can be filtered with configuration to only monitor activity for specific devices or users.","s":"Multi-Device/User","u":"/multi-scrobbler/configuration/sources/","h":"#multi-deviceuser","p":70},{"i":80,"t":"To limit which Clients a Source will scrobble to use the clients property in a Source's File/AIO configuration to specify the name property of the Clients that it should scrobble to: jellyfin.json { \"name\": \"MyJellyfin\", \"clients\": [\"myMaloja\",\"koitoA\",\"listenbrainzFoo\"] \"data\": { // ... }, } note If clients is empty (\"clients\": []) or is omitted then the default is for the Source to scrobble to all configured Clients. note If a Client is configured using ENV then it is given a generated name. Check the multi-scrobbler Dashboard to find their name in a subheader under the Client type. Example: Otherwise, use the name property you gave the client in it's File/AIO config.","s":"Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/sources/","h":"#limiting-scrobble-destination","p":70},{"i":82,"t":"A Source that monitors active listening uses one of two metrics to determine if a Song is scrobbable based on your listening: percent of track listened to (50% or more) or amount of time (duration) track was listened to (4 minutes or more) These default values are based on last.fm's scrobble guidance. These values can be customized in the options of Source's file or aio config: spotify.json { \"data\": { // ... }, \"options\": { \"scrobbleThresholds\": { \"duration\": 40, // scrobbable if listened to for 40 seconds or more \"percent\": 20 // scrobbable if listened to for 20% or more of the track's length } } } These can also be configured globally for all Sources using ENVs: SOURCE_SCROBBLE_DURATION=40 SOURCE_SCROBBLE_PERCENT=20","s":"Scrobble Thresholds","u":"/multi-scrobbler/configuration/sources/","h":"#scrobble-thresholds","p":70},{"i":84,"t":"note This feature is currently available only for some Sources. Check each Source's documentation to see if it supported. For most Sources multi-scrobbler can determine if a user is listening and scrobble automatically. For Sources which multi-scrobbler cannot do this or require additional configuration, a user can indicate to MS that it should or should not scrobble. This action can be taken on the Web Dashboard by clicking the link next to Should Scrobble found in each Source's status card. Additionally, for these Sources, the default behavior for Scrobbling can be explicitly set by adding the following value to a Source's options in file or aio config: azuracast.json { \"data\": { // ... }, \"options\": { // set to true to always scrobble automatically // set to false to never scrobble automatically \"systemScrobble\": true } }","s":"Should Scrobble Behavior","u":"/multi-scrobbler/configuration/sources/","h":"#should-scrobble-behavior","p":70},{"i":86,"t":"Scrobbling Threshold Azuracast may not correctly report track length or position. If this is the case you should reduce the \"listened to\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly. The Azuracast server should have Use High-Performance Now Playing Updates enabled in Administration -> System Settings URL​ The URL used by MS to connect to Azuracast has the syntax: [ws|wss]://HOST:[PORT] MS will automatically add the path required for websockets, /api/live/nowplaying/websocket, to your URL if none is provided. If you use a reverse proxy with a path-based URL or otherwise need a custom path to access the websockets path correctly then explicitly provide it. Examples: URL From Config => MS Uses 'ws://192.168.0.101' => ws://192.168.0.101/api/live/nowplaying/websocket 'ws://azura.mydomain.com' => ws://azura.mydomain.com.com/api/live/nowplaying/websocket 'wss://mydomain.com/custom/azura/ws' => wss://mydomain.com/custom/azura/ws Scrobble Behavior​ info This Source supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to Should Scrobble found in each Source's status card. Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source's options in file or aio config: azuracast.json { \"data\": { // ... }, \"options\": { // set to true to always scrobble automatically // set to false to never scrobble automatically \"systemScrobble\": true } }} Multi-scrobbler will set the default scrobbling behavior based on if either of these settings is configured: live status (AZURA_LIVE or monitorWhenLive) or listener count (AZURA_LISTENERS_NUM or monitorWhenListeners) If either is configured then MS will automatically scrobble based on when these conditions are met. If neither is configured automatic scrobble defaults to off and you should either manually initiate it or explicitly set the default behavior.","s":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"","p":85},{"i":88,"t":"ENV File AIO Environmental Variable Required? Default Description AZ_URL Yes Azuracast URL without station name AZ_STATION Yes The station name shown on the public page AZURA_LIVE No Yes Only scrobble when station status is ONLINE AZURA_LISTENERS_NUM No true Only scrobble if station has any listeners (true) or listeners are equal-to/greater-than X CONFIG_DIR/azuracast.json [ { \"type\": \"azuracast\", \"enable\": true, \"name\": \"azura\", \"data\": { \"url\": \"ws://192.168.0.101\", \"station\": \"my-station-name\", \"monitorWhenLive\": true, \"monitorWhenListeners\": 1 } } ] or explore the schema with an example and live editor/validator CONFIG_DIR/config.json { \"sources\": [ { \"type\": \"azuracast\", \"enable\": true, \"name\": \"azura\", \"data\": { \"url\": \"ws://192.168.0.101\", \"station\": \"my-station-name\", \"monitorWhenLive\": true, \"monitorWhenListeners\": 1 } } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#configuration","p":85},{"i":90,"t":"warning This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer's TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk. info This Source will work only if you have a Premium Deezer account.","s":"Deezer","u":"/multi-scrobbler/configuration/sources/deezer/","h":"","p":89},{"i":92,"t":"The arl is a browser cookie that Deezer uses to store your login information. Multi-scrobbler uses the arl value to make authorized requests to Deezer's API where it can retrieve listening history. After logging into Deezer, use one of the methods below to retrieve the arl cookie value: Chrome Firefox On deezer.com, press F12 to open the Developer Tools window. Go to the Applications tab. Press the '>>' More tabs icon if it's hidden. Under the Cookies Filter, click deezer.com, then the text bar name arl. Copy all the contents shown in the Cookie Value pane. On deezer.com, hit Ctrl+Shift+I to open Developer Tools Go to the Storage Tab, then expand Cookies in the sidebar and select deezer.com Find the row with arl as the name, then double click the Value column and right click -> copy the value","s":"Retrieve ARL","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#retrieve-arl","p":89},{"i":94,"t":"ENV File AIO Environmental Variable Required? Default Description DEEZER_ARL Yes The ARL cookie value retrieved from your browser CONFIG_DIR/deezer.json [ { \"name\": \"DeezerARL\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig\", } } ] or explore the schema with an example and live editor/validator CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"DeezerARL\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig\" }, \"type\": \"deezer\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#configuration","p":89},{"i":96,"t":"Third party integrations with Deezer (Sonos) may cause Deezer to report the same track many times in listening history. If you experience this issue modify your Deezer Source config (file-based only) to include the option \"fuzzyDiscoveryIgnore\": \"aggressive\" deezer.json example deezer.json [ { \"name\": \"MyDeezer\", \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3x...\", }, \"options\": { \"fuzzyDiscoveryIgnore\": \"aggressive\" } } ] This option comes with some trade-offs: MS will aggressively detect repeated tracks within a window of time that should eliminate all duplicates. However, this will also prevent intentionally repeated tracks from being scrobbled. See this thread for more information on how this works.","s":"Duplicate detection","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#duplicate-detection","p":89},{"i":98,"t":"If your media device can be Cast to using this button on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play. note Google Cast support is experimental. You may experience crashes and errors while using this Source. Please open an issue if you experience problems and include all information detailed in the issue template to help debug your issue. note This source relies on common, basic music data provided by the cast device which will always be less exhaustive than data parsed from full source integrations. If there is an existing Source it is recommended to configure for it and blacklist the app on Google Cast, rather than relying solely on Google Cast for scrobbling. Connecting Devices​ Cast devices can be manually configured using file-based configuration OR automatically discovered using mDNS. mDNS Discovery​ The host machine running multi-scrobbler must be configured to allow mDNS traffic on port 5353/UDP. OS Specific Instructions Linux Windows Docker The host machine must have avahi-daemon running to circumvent limitations with DNS resolution due to musl in Alpine. Most major linux distributions package avahi and many have it built-in. Once avahi is running you must pass D-Bus and the avahi daemon socket to your container like so: docker run ... -v /var/run/dbus:/var/run/dbus -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket ... foxxmd/multi-scrobbler Flatpak/Nodejs No additional steps are required. Docker Unsupported at this time. Nodejs No additional steps are required. What Media Does MS Scrobble?​ Cast devices report what type of media the current activity is (see metadata property here). The reported type is dependent on the application playing the media to correctly report it, the cast device does not magically know what the media is. If an application does not report a type it is always classified as unknown. By default, MS will only track media that is reported as MusicTrack. Allow Unknown Media Type​ Media with an Unknown (Generic) media type can be explicitly allowed by setting \"allowUnknownMedia\": true in the file-based configuration. This can also be configured to only allow unknown media types for specific applications by using a list of application names. Example chromecast.json [ { \"name\": \"MyCast\", \"type\": \"chromecast\", \"data\": { // only allow unknown if app name contains any of these phrases \"allowUnknownMedia\": [\"smarttube\", \"default media receiver\"] }, } ] Forcing Media Tracking​ MS can be forced to track media from an application regardless of media type. This is useful if an application incorrectly reports a media type you are sure should be music. Set \"forceMediaRecognitionOn\" in the file-based configuration to a list of application names that should always be tracked. Example chromecast.json [ { \"name\": \"MyCast\", \"type\": \"chromecast\", \"data\": { // media from applications that contains these phrases will always be tracked, regardless of media type reported \"forceMediaRecognitionOn\": [\"smarttube\", \"default media receiver\"] }, } ] Cast Troubleshooting​ Please include any/all logs with raw output if there are any errors encountered as this is critical to diagnosing issues. To diagnose bad/incomplete track information or strange MS player behavior please turn on payload logging and include log output of the source running to help diagnose this issue. Either enable in config using the below example OR enable Debug Mode. Example chromecast.json [ { \"name\": \"MyCast\", \"type\": \"chromecast\", \"data\": { //... }, \"options\": { \"logPayload\": true } } ]","s":"Google Cast (Chromecast)","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"","p":97},{"i":100,"t":"ENV File AIO note Manually configuring cast device connections is only available through file-based config. Environmental Variable Required? Default Description CC_ENABLE No Set to 'true' to enable Cast monitoring without needing to define other ENVs CC_WHITELIST_DEVICES No Only scrobble from these Cast devices. Comma-delimited list. EX mini-home, family-tv CC_BLACKLIST_DEVICES No Do not scrobble from these Cast devices. Comma-delimited list CC_WHITELIST_APPS No Only scrobble from these casted Apps. Comma-delimited list. EX spotify, pandora CC_BLACKLIST_APPS No Do not scrobble from these casted Apps. Comma-delimited list Example CONFIG_DIR/chromecast.json [ { \"name\": \"MyCast\", \"data\": { \"blacklistedDevices\": [], \"whitelistedDevices\": [], \"blacklistedApps\": [], \"whitelistedApps\": [] } } ] or explore the schema with an example and live editor/validator Example CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyCast\", \"data\": { \"blacklistedDevices\": [], \"whitelistedDevices\": [], \"blacklistedApps\": [], \"whitelistedApps\": [] }, \"type\": \"chromecast\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"#configuration","p":97},{"i":102,"t":"Parse metadata from any Icecast Station (streams) to use for scrobbling. note There is no standard format for presenting track information in an Icecast stream and the majority of streams that do include metadata only use a single string (StreamTitle) from which metadata can be parsed. Multi-scrobbler will do its best to parse Artist/Album/Track information from this data but the quality and consistency for this is solely based on how the Icecast broadcaster chooses to format their tracks. Scrobbling Behavior Multi-scrobbler cannot automatically determine if you are listening to a Station. Therefore, automatic scrobbling for Icecast Sources is off by default. Use Should Scrobble Behavior to initiate scrobbling or configure automatic scrobble. Scrobbling Threshold Icecast does not report track lengths so multi-scrobbler cannot determine if it should scrobble based on percent played. You should instead set a shorter \"listened to\" duration using Scrobble Thresholds. URL and Sources​ The URL should be the URL you would use to stream audio. Additional sources are supported based on those found in icecast-metadata-stats. To use these with automatic parsing based on the regular URL include a sources array in your config the same way as shown in icecast-metadata-stats: Example config.json [ { \"name\": \"myIcy\", \"enable\": true, \"data\": { \"url\": \"http://myIcecast.com/radio\", \"sources\": [\"icy\", \"ogg\", \"sevenhtml\"] } } ] To manually set these sources include the same *Endpoint options found in icecast-metadata-stats. If no sources are configured for multi-scrobbler it will automatically try to use icy and ogg.","s":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","h":"","p":101},{"i":104,"t":"ENV File AIO Environmental Variable Required? Default Description ICECAST_URL Yes Icecast URL Example CONFIG_DIR/icecast.json [ { \"name\": \"myIcy\", \"enable\": true, \"data\": { \"url\": \"http://myIcecast.com/radio\" } } ] or explore the schema with an example and live editor/validator Example CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myIcy\", \"enable\": true, \"data\": { \"url\": \"http://myIcecast.com/radio\" }, \"type\": \"icecast\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/icecast/","h":"#configuration","p":101},{"i":106,"t":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can can be in the JRiver GUI: Tools -> Options -> Media Network Check Use Media Network to share this library... If you have Authentication checked you will need to provide the Username and Password in the ENV/File configuration below.","s":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","h":"","p":105},{"i":108,"t":"The URL used to connect to JRiver, set in your file config as url. The URL used to connect ultimately must be formed like this: Syntax => [protocol]://[hostname]:[port]/[path] Default => http://localhost:52199/MCWS/v1/ If any part of this URL is missing multi-scrobbler will use a default value. This also means that if any part of your URL is not standard you must explicitly define it. Jriver Settings Make sure the port number matches what is found in Advanced section in the Media Network options. If your installation is on the same machine but you cannot connect using localhost try 0.0.0.0 instead. URL Transform Examples Examples of a given url in your file config and the final URL multi-scrobbler will use to connect to JRiver: url Transformed URL (none set) http://localhost:52199/MCWS/v1/ jriver.mydomain.com http://jriver.mydomain.com:52199/MCWS/v1/ 192.168.0.101:3456 http://192.168.0.101:3456/MCWS/v1/ mydomain.com:80/jriverReverse/MCWS/v1/ mydomain.com:80/jriverReverse/MCWS/v1/","s":"URL","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#url","p":105},{"i":110,"t":"ENV File AIO ENV Config Type Environmental Variable Required Default Description JRIVER_URL Yes http://localhost:52199/MCWS/v1/ The URL of the JRiver server JRIVER_USERNAME No If authentication is enabled, the username set JRIVER_PASSWORD No If authenticated is enabled, the password set File Config Type CONFIG_DIR/jriver.json [ { \"name\": \"MyJriver\", \"enable\": true, \"data\": { \"url\": \"0.0.0.0\", \"username\": \"auser\", \"password\": \"apassword\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyJriver\", \"enable\": true, \"data\": { \"url\": \"0.0.0.0\", \"username\": \"auser\", \"password\": \"apassword\" }, \"type\": \"jriver\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#configuration","p":105},{"i":112,"t":"In order for multi-scrobbler to communicate with Kodi you must have the Web Interface enabled. This can be done in the Kodi GUI: Settings -> Services -> Control Check Allow remote control via HTTP Ensure you have a Username and Password set, you will need to provide them in the ENV/File configuration below.","s":"Kodi","u":"/multi-scrobbler/configuration/sources/kodi/","h":"","p":111},{"i":114,"t":"The URL used to connect to Kodi, set in your file config as url. The URL used to connect ultimately must be formed like this: Syntax => [protocol]://[hostname]:[port]/[path] Default => http://localhost:8080/jsonrpc If any part of this URL is missing multi-scrobbler will use a default value. This also means that if any part of your URL is not standard you must explicitly define it. Kodi Settings Make sure the port number matches what is found in Port in the Control section mentioned above. If your installation is on the same machine but you cannot connect using localhost try 0.0.0.0 instead. URL Transform Examples Examples of a given url in your file config and the final URL multi-scrobbler will use to connect to Kodi: url Transformed URL (none set) http://localhost:8080/jsonrpc kodi.mydomain.com http://kodi.mydomain.com:8080/jsonrpc 192.168.0.101:3456 http://192.168.0.101:3456/jsonprc mydomain.com:80/kodiReverse/jsonrpc http://mydomain.com:80/kodiReverse/jsonrpc","s":"URL","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#url","p":111},{"i":116,"t":"ENV File AIO ENV Config Type Environmental Variable Required Default Description KODI_URL Yes http://localhost:8080/jsonrpc The URL of the Kodi server KODI_USERNAME No The username set KODI_PASSWORD No The password set File Config Type CONFIG/kodi.json [ { \"name\": \"MyKodi\", \"enable\": true, \"data\": { \"url\": \"http://localhost:8080/jsonrpc\", \"username\": \"myUser\", \"password\": \"myPassword\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyKodi\", \"enable\": true, \"data\": { \"url\": \"http://localhost:8080/jsonrpc\", \"username\": \"myUser\", \"password\": \"myPassword\" }, \"type\": \"kodi\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#configuration","p":111},{"i":118,"t":"This Source monitors a Koito account's scrobble history and then re-scrobbles discovered tracks to configured Clients. Other Uses To scrobble to a Koito server, create a Koito (Client) See the Koito (Client) configuration for general setup. The only difference for Source configuration: Cannot be setup with ENV config File/AIO config must include \"configureAs\": \"source\" Configuration​ ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Koito Client config -- multi-scrobbler assumes Koito ENVs are always used for the client configuration. You must use the File or AIO config to setup Koito as a Source. File Config Type CONFIG/koito.json [ { \"name\": \"koito-source\", \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"koito-source\", \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" }, \"type\": \"koito\" } ] } or explore the schema with an example and live editor/validator","s":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","h":"","p":117},{"i":120,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server. Other Uses To scrobble to Last.fm, create a Last.fm (Client) To monitor and re-scrobble activity from your Last.fm account, create a Last.fm (Source)","s":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"","p":119},{"i":122,"t":"If a slug is not provided in configuration then multi-scrobbler will accept Last.fm scrobbles at http://localhost:9078/2.0/ which is the \"standard\" Last.fm server path for scrobbling Use a slug only if you need to setup multiple Last.fm Endpoint sources and cannot use different tokens. If a slug is used then the URL will be: http://localhost:9078/api/lastfm/mySlug","s":"URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#url","p":119},{"i":124,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LFMENDPOINT_ENABLE No Use LFM Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs LFM_SLUG No (Optional) The URL suffix to use for accepting LFM scrobbles File Config Type CONFIG/endpointlfm.json [ { \"name\": \"myLfm\", \"enable\": true, \"data\": { \"slug\": \"mySlug\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myLfm\", \"enable\": true, \"data\": { \"slug\": \"mySlug\" }, \"type\": \"endpointlfm\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#configuration","p":119},{"i":126,"t":"This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients. Other Uses To scrobble to Last.fm, create a Last.fm (Client) To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a Last.fm (Endpoint) To configure this Source use the same registration instructions and configuration data shown in Last.fm (Client) with the difference being \"configureAs\": \"source\" defined in the File/AIO configuration below.","s":"Lastfm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"","p":125},{"i":128,"t":"ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Last.fm Client config -- multi-scrobbler assumes Last.fm ENVs are always used for the client configuration. You must use the File or AIO config to setup Last.fm as a Source. File Config Type CONFIG/lastfm.json [ { \"name\": \"myLastFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myLastFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"type\": \"lastfm\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"#configuration","p":125},{"i":130,"t":"Must be using Jellyfin 10.7 or greater Create an API Key for multi-scrobbler In the Jellyfin desktop web UI Navigate to -> Administration -> Dashboard -> API Keys (http://YOUR_JELLYIN_URL/web/index.html#!/apikeys.html) Click + button and create a new key with App name multi-scrobbler Copy the created API Key value for use in configuration below It is recommended to use API Key + username but if you are not an admin for your Jellyfin instance you can also authenticate with your Jellyfin username and password. Important Defaults By default... multi-scrobbler will only scrobble for the user authenticated with the API. Allowed Users (usersAllow or JELLYFIN_USERS_ALLOW) are only necessary if you want to scrobble for additional users. multi-scrobbler will only scrobble media found in Jellyfin libraries that were labelled as Music. librariesAllow or JELLYFIN_LIBRARIES_ALLOW will override this OR use additionalAllowedLibraryTypes to allow more types (like mixed or book for audiobooks) multi-scrobbler will only scrobble media Jellyfin detects as Audio. To force multi-scrobbler to scrobble when media is detected as Unknown use \"allowUnknown\": true in file/aio configuration. Configuration​ ENV File AIO Environmental Variable Required? Default Description JELLYFIN_URL Yes The URL of the Jellyfin server IE http://localhost:8096 JELLYFIN_USER Yes The user to authenticate with the API JELLYFIN_APIKEY No The API Key to use for authentication (Must provide either apikey or password) JELLYFIN_PASSWORD No The password of the user to authenticate for. (Must provide either apikey or password) JELLYFIN_USERS_ALLOW No Comma-separated list of usernames (from Jellyfin) to scrobble for JELLYFIN_USERS_BLOCK No Comma-separated list of usernames (from Jellyfin) to disallow scrobble for JELLYFIN_DEVICES_ALLOW No Comma-separated list of devices to scrobble from JELLYFIN_DEVICES_BLOCK No Comma-separated list of devices to disallow scrobbles from JELLYFIN_LIBRARIES_ALLOW No Comma-separated list of libraries to allow scrobbles from JELLYFIN_LIBRARIES_BLOCK No Comma-separated list of libraries to disallow scrobbles from CONFIG_DIR/jellyfin.json [ { \"name\": \"MyJellyfin\", \"enable\": true, \"clients\": [], \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\", // everything below is optional \"usersAllow\": [\"FoxxMD\",\"SomeOtherUser\"], \"usersBlock\": [\"AnotherUser\"], \"devicesAllow\": [\"firefox\"], \"devicesBlock\": [\"google-home\"], \"librariesAllow\": [\"GoodMusic\"], \"librariesBlock\": [\"BadMusic\"], \"additionalAllowedLibraryTypes\": [\"musicvideos\"], \"allowUnknown\": false, }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\" } } ] or explore the schema with an example and live editor/validator CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyJellyfin\", \"enable\": true, \"clients\": [], \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\", \"usersAllow\": [ \"FoxxMD\", \"SomeOtherUser\" ], \"usersBlock\": [ \"AnotherUser\" ], \"devicesAllow\": [ \"firefox\" ], \"devicesBlock\": [ \"google-home\" ], \"librariesAllow\": [ \"GoodMusic\" ], \"librariesBlock\": [ \"BadMusic\" ], \"additionalAllowedLibraryTypes\": [ \"musicvideos\" ], \"allowUnknown\": false }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\" }, \"type\": \"jellyfin\" } ] } or explore the schema with an example and live editor/validator","s":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","h":"","p":129},{"i":132,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server. Other Uses To scrobble to Listenbrainz, create a Listenbrainz (Client) To monitor and re-scrobble activity from your Listenbrainz account, create a Listenbrainz (Source)","s":"Listenbrainz (Endpoint)","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"","p":131},{"i":134,"t":"If a slug is not provided in configuration then multi-scrobbler will accept Listenbrainz scrobbles at http://myMultiScrobblerIP:9078/1/submit-listens which is the \"standard\" Listenbrainz server path for scrobbling. In general, you should use http://myMultiScrobblerIP:9078/1/ as the base path when configuring your application to scrobble to multi-scrobbler. URL Setup for Popular Apps Navidrome​ Set the ListenBrainz.BaseURL (env ND_LISTENBRAINZ_BASEURL) to http://myMultiScrobblerIP:9078/1/ Use a slug only if you need to setup multiple Listenbrainz Endpoint sources and cannot use different tokens. If a slug is used then the URL will be: http://myMultiScrobblerIP:9078/api/listenbrainz/mySlug note Some Listenbrainz applications may require custom Listenbrainz URLs to be a real domain (example.com) and/or use SSL (https://). In this case you should setup multi-scrobbler behind a reverse proxy to support this functionality. It is out of the scope of this project to do this solely within multi-scrobbler.","s":"URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#url","p":131},{"i":136,"t":"Most Listenbrainz clients require a token (Authentication Token) to be provided during setup. This value can be anything you want, just make sure to use the same value for token in your multi-scrobbler configuration for the endpoint.","s":"Token","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#token","p":131},{"i":138,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LZENDPOINT_ENABLE No Use LZ Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs LZE_TOKEN No LZ \"Authentication Token\" you provided to the scrobbling application LZE_SLUG No (Optional) The URL suffix to use for accepting LZ scrobbles File Config Type CONFIG/endpointlz.json [ { \"name\": \"myLz\", \"enable\": true, \"data\": { \"token\": \"myToken\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myLz\", \"enable\": true, \"data\": { \"token\": \"myToken\" }, \"type\": \"endpointlz\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#configuration","p":131},{"i":140,"t":"This Source monitors a Listenbrainz account's scrobble history and then re-scrobbles discovered tracks to configured clients. Other Uses To scrobble to a Listenbrainz server, create a Listenbrainz (Client) To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a Listenbrainz (Endpoint) You will need to run your own Listenbrainz server or have an account on the official instance. On your profile page find your User Token to use in the configuration.","s":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"","p":139},{"i":142,"t":"ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Listenbrainz Client config -- multi-scrobbler assumes Listenbrainz ENVs are always used for the client configuration. You must use the File or AIO config to setup Listenbrainz as a Source. File Config Type CONFIG/listenbrainz.json [ { \"name\": \"brainzSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"brainzSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" }, \"type\": \"listenbrainz\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"#configuration","p":139},{"i":144,"t":"Other Uses To scrobble to a Maloja server, create a Maloja (Client) See the Maloja (Client) configuration for general setup. The only difference for Source configuration: Cannot be setup with ENV config File/AIO config must include \"configureAs\": \"source\"","s":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","h":"","p":143},{"i":146,"t":"ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Maloja Client config -- multi-scrobbler assumes Maloja ENVs are always used for the client configuration. You must use the [File or AIO config to setup Maloja as a Source. File Config Type CONFIG/maloja.json [ { \"name\": \"myMaloja-source\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myMaloja-source\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" }, \"type\": \"maloja\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/maloja/","h":"#configuration","p":143},{"i":148,"t":"Mopidy is a headless music server that supports playing music from many standard and non-standard sources such as Pandora, Bandcamp, and Tunein. multi-scrobbler can scrobble tracks played from any Mopidy backend source, regardless of where you listen to them. note You must have Mopidy-HTTP extension enabled for this integration to work. URL​ The URL used to connect to the Mopidy server, set in your file config as url. The URL used to connect ultimately must be formed like this: Syntax => [protocol]://[hostname]:[port]/[path] Default => ws://localhost:6680/mopidy/ws If any part of this URL is missing multi-scrobbler will use a default value. This also means that if any part of your URL is not standard you must explicitly define it. Mopidy Configuration Make sure the hostname and port number match what is found in the Mopidy configuration file mopidy.conf: [http] hostname = localhost port = 6680 URL Transform Examples Examples of a given url in your file config and the final URL multi-scrobbler will use to connect to Mopidy: url Transformed URL (none set) ws://localhost:6680/mopidy/ws mopidy.mydomain.com ws://mopidy.mydomain.com:6680/mopidy/ws/ 192.168.0.101:3456 ws://192.168.0.101:3456/mopidy/ws/ mopidy.mydomain.com:80/MOPWS ws://mopidy.mydomain.com:80/MOPWS","s":"Mopidy","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"","p":147},{"i":150,"t":"If you wish to disallow or only allow scrobbling from some sources played through Mopidy you can specify these using uriBlacklist or uriWhitelist in your config. multi-scrobbler will check the list to see if any string matches the START of the uri on a track. If whitelist is used then blacklist is ignored. All strings are case-insensitive. Example { \"uriBlacklist\": [\"soundcloud\"] } Will prevent multi-scrobbler from scrobbling any Mopidy track that start with a uri like soundcloud:song:MySong-1234","s":"URI Blacklist/Whitelist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#uri-blacklistwhitelist","p":147},{"i":152,"t":"For 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 Album name to this list. Multi-scrobbler will still scrobble the track, just without the bad data. All strings are case-insensitive. Example { \"albumBlacklist\": [\"SoundCloud\", \"Mixcloud\"] } If a track would be scrobbled like Album: Soundcloud, Track: My Cool Track, Artist: A Cool Artist then multi-scrobbler will instead scrobble Track: My Cool Track, Artist: A Cool Artist","s":"Album Blacklist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#album-blacklist","p":147},{"i":154,"t":"ENV File AIO ENV Config Type No ENV support File Config Type CONFIG/mopidy.json [ { \"name\": \"MyMopidy\", \"enable\": true, \"data\": { \"url\": \"localhost\", \"uriBlacklist\": [], \"uriWhitelist\": [], \"albumBlacklist\": [] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyMopidy\", \"enable\": true, \"data\": { \"url\": \"localhost\", \"uriBlacklist\": [], \"uriWhitelist\": [], \"albumBlacklist\": [] }, \"type\": \"mopidy\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#configuration","p":147},{"i":156,"t":"MS communicates with MPD using the TCP client connection. You should uncomment/create the following settings in your mpd config: bind_to_address \"any\" # or a specific ipv4/v6 address port \"6600\"","s":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","h":"","p":155},{"i":158,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MPD_URL No localhost:6600 MPD_PASSWORD No File Config Type CONFIG/mpd.json [ { \"enable\": true, \"name\": \"MyMPD\", \"data\": { \"url\": \"192.168.0.100:6600\", \"password\": \"MY_PASSWORD\" }, \"options\": { \"disableDiscovery\": false } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"enable\": true, \"name\": \"MyMPD\", \"data\": { \"url\": \"192.168.0.100:6600\", \"password\": \"MY_PASSWORD\" }, \"options\": { \"disableDiscovery\": false }, \"type\": \"mpd\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mpd/","h":"#configuration","p":155},{"i":160,"t":"MPRIS is a standard interface for communicating with Music Players on linux operating systems. If you run Linux and have a notification tray that shows what media you are listening to, you likely have access to MPRIS. multi-scrobbler can listen to this interface and scrobble tracks played by any media player that communicates to the operating system with MPRIS. Host Setup​ MPRIS communication requires multi-scrobbler to have access to the host's dbus-daemon. Local Docker If multi-scrobbler is running as a Local Installation, directly with node/npm, on the same host as MPRIS then no setup is required. Remote setup is also possible, see the Remote Unix Socket section in the Docker tab. If multi-scrobbler is running as a Docker Container some modifications are required... Local Unix Socket​ The most secure way is to run a multi-scrobbler container on the same host as MPRIS. In this scenario you can simply mount the user session dbus unix socket into the container. Make sure PUID and PGID ENVs are configured so the container has permissions to access the socket. Then, modify your compose stack with these additional values: docker-compose.yaml environment: - DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/UID/bus volumes: - /run/user/UID/bus:/run/user/UID/bus:ro Remote Unix Socket​ warning This method is insecure. You should not expose dbus over a network unless access to the port is restricted and the network is trusted. Use socat to bidirectionally relay communication from the host's dbus socket to a listening TCP port. To make dbus for user with uid 1000 available on port 6644: socat TCP-LISTEN:6644,reuseaddr,fork UNIX-CONNECT:/run/user/1000/bus Then, add the following value to multi-scrobbler's ENVs: DBUS_SESSION_BUS_ADDRESS=tcp:host=yourHostIP,port=6644","s":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","h":"","p":159},{"i":162,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MPRIS_ENABLE No Use MPRIS as a Source (useful when you don't need any other options) MPRIS_BLACKLIST No Comma-delimited list of player names not to scrobble from MPRIS_WHITELIST No Comma-delimited list of players names to ONLY scrobble from. Overrides blacklist File Config Type CONFIG/mpris.json [ { \"name\": \"ubuntu\", \"enable\": true, \"data\": { \"whitelist\": [ \"vlc\", \"mpd\" ], \"blacklist\": [ \"spotify\" ] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"ubuntu\", \"enable\": true, \"data\": { \"whitelist\": [ \"vlc\", \"mpd\" ], \"blacklist\": [ \"spotify\" ] }, \"type\": \"mpris\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mpris/","h":"#configuration","p":159},{"i":164,"t":"In order to use Musikcube configure it to accept websocket connections in server setup: Enable the Metadata Server Set a Password Both of these settings are found in Musikcube -> (s)ettings -> server setup The URL used by MS has the syntax: [ws|wss]://HOST:[PORT] The port is the same as shown in the server setup screenshot from above, under metadata server enabled. If no port is provided to MS it will default to 7905. If no URL is provided to MS it will try to use ws://localhost:7905","s":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"","p":163},{"i":166,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MC_URL No ws://localhost:7905 Use port set for metadata server MC_PASSWORD Yes File Config Type CONFIG/musikcube.json [ { \"type\": \"musikcube\", \"enable\": true, \"name\": \"musikcube\", \"data\": { \"url\": \"ws://localhost:7905\", \"password\": \"MY_PASSWORD\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"type\": \"musikcube\", \"enable\": true, \"name\": \"musikcube\", \"data\": { \"url\": \"ws://localhost:7905\", \"password\": \"MY_PASSWORD\" } } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"#configuration","p":163},{"i":168,"t":"Find your Plex Token and make note of the URL and Port used to connect to your Plex instance. Allowed Users and Defaults Multi-scrobbler will automatically scrobble for these users by default: The User authenticated with the Plex Token and the Local User The Local User (PLEX_LOCAL_USER) is how Plex identifies anyone directly accessing the Plex UI from a local IP (who does not need to login). To allow MS to scrobble for other users use usersAllow or PLEX_USERS_ALLOW (env) from the below configuration docs. However, because you are overriding the default settings you must also explicitly list the authenticated user and the Local User if you want them to also be able to scrobble. Examples Defaults​ If usersallow and PLEX_USERS_ALLOW are not defined then the Plex Token authenticated User and Local User will be scrobbled for. Only A Specific User​ \"usersallow\": [\"SomeUser\"] or PLEX_USERS_ALLOW: SomeUser Only the Plex user SomeUser will be scrobbled for. The Plex Token authenticated user and the Local User will not be scrobbled for. A Specific User + Defaults​ (Assuming the plex authenticated user is FoxxMD) \"usersallow\": [\"FoxxMD\", \"PLEX_LOCAL_USER\", \"SomeUser\"] or PLEX_USERS_ALLOW: FoxxMD,PLEX_LOCAL_USER,SomeUser The Plex user SomeUser, the Plex Token authenticated user (FoxxMD) and the Local User will be scrobbled for. Allowed Libraries and Defaults By default multi-scrobbler will only scrobble media found in Plex libraries that are labelled as Music. librariesAllow or PLEX_LIBRARIES_ALLOW will override this Configuration​ ENV File AIO ENV Config Type Environmental Variable Required? Default Description PLEX_URL Yes The URL of the Plex server IE http://localhost:32400 PLEX_TOKEN Yes The Plex Token to use with the API PLEX_USERS_ALLOW No Comma-separated list of usernames (from Plex) to scrobble for PLEX_USERS_BLOCK No Comma-separated list of usernames (from Plex) to disallow scrobble for PLEX_DEVICES_ALLOW No Comma-separated list of devices to scrobble from PLEX_DEVICES_BLOCK No Comma-separated list of devices to disallow scrobbles from PLEX_LIBRARIES_ALLOW No Comma-separated list of libraries to allow scrobbles from PLEX_LIBRARIES_BLOCK No Comma-separated list of libraries to disallow scrobbles from File Config Type CONFIG/plex.json [ { \"name\": \"MyPlexApi\", \"enable\": true, \"clients\": [], \"data\": { \"token\": \"1234\", \"url\": \"http://192.168.0.120:32400\", \"usersAllow\": [ \"FoxxMD\", \"SomeOtherUser\" ], \"usersBlock\": [ \"AnotherUser\" ], \"devicesAllow\": [ \"firefox\" ], \"devicesBlock\": [ \"google-home\" ], \"librariesAllow\": [ \"GoodMusic\" ], \"librariesBlock\": [ \"BadMusic\" ] }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\", \"ignoreInvalidCert\": \"false\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyPlexApi\", \"enable\": true, \"clients\": [], \"data\": { \"token\": \"1234\", \"url\": \"http://192.168.0.120:32400\", \"usersAllow\": [ \"FoxxMD\", \"SomeOtherUser\" ], \"usersBlock\": [ \"AnotherUser\" ], \"devicesAllow\": [ \"firefox\" ], \"devicesBlock\": [ \"google-home\" ], \"librariesAllow\": [ \"GoodMusic\" ], \"librariesBlock\": [ \"BadMusic\" ] }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\", \"ignoreInvalidCert\": \"false\" }, \"type\": \"plex\" } ] } or explore the schema with an example and live editor/validator","s":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":167},{"i":170,"t":"Other Uses To scrobble to Rocksky, create a Rocksky (Client) Rocksky is music tracking and discovery platform built on the AT Protocol (Bluesky). This Source monitors the Rocksky scrobbles in your PDS and then re-scrobbles discovered tracks to configured clients. Learn more about how Rocksky scrobbles work in the Rocksky (Client) docs.","s":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"","p":169},{"i":172,"t":"Follow the Setup instructions in the Rocksky (Client) docs to get access to your Bluesky PDS repository and scrobble data.","s":"Setup","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#setup","p":169},{"i":174,"t":"See the Rocksky (Client) configuration for general setup. The only difference for Source configuration: Cannot be setup with ENV config File/AIO config must include \"configureAs\": \"source\" ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Rocksky Client config -- multi-scrobbler assumes Rocksky ENVs are always used for the client configuration. You must use the File or AIO config to setup Rocksky as a Source. File Config Type CONFIG/rocksky.json [ { \"name\": \"myRockskySource\", \"configureAs\": \"source\", \"data\": { \"key\": \"e4xwktm7jxm607x8el1fcda30eu14dzb64h3j\", \"handle\": \"alice.bsky.social\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myRockskySource\", \"configureAs\": \"source\", \"data\": { \"key\": \"e4xwktm7jxm607x8el1fcda30eu14dzb64h3j\", \"handle\": \"alice.bsky.social\" }, \"type\": \"rocksky\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#configuration","p":169},{"i":176,"t":"Spotify and Automix If your Spotify player has Automix enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is \"mixed\" in your queue with a shorter play time than its actual length and Spotify does not report this modified play time in its API. This does not affect MS's ability to scrobble from Spotify but it will affect the accuracy of the duration MS reports was played. Authenticate Spotify with Multi-Scrobbler​ To access your Spotify history you must create a Spotify App to get a Client ID/Secret. Login to https://developer.spotify.com with your existing Spotify account and accept Developer Terms Navigate to your Spotify Developer Dashboard and start the Create App process Determine the correct Redirect URI to use and set it in your App settings Redirect URI Instructions A Redirect URI is the URL that Spotify will navigate your browser to after you complete authorization. The URL will contain the code necessary for multi-scrobbler to get a Spotify access token. Spotify no longer allows insecure URIs (start with http://) unless the address is 127.0.0.1 -- so localhost and internal IPs (192.168.0.xxx) no longer work. Use one of the following methods to specify a valid Redirect URI and complete Spotify authentication with multi-scrobbler: HTTPS Run MS Locally Echo Echo from echo.multi-scrobbler.app Use a domain you control, with SSL certificates/HTTPS enabled, to create a valid redirect URI. For example, if you are already running multi-scrobbler behind a reverse proxy (nginx/traefik/caddy) at https://scrobbler.mydomain.com then set the Spotify Redirect URI for your Spotify App, and multi-scrobbler SPOTIFY_REDIRECT_URI ENV, to https://scrobbler.mydomain.com/callback Alternatively, if multi-scrobbler is not accessible behind your domain, then use the Echo method with your own domain instead of 127.0.0.1. Run multi-scrobbler, configured for a Spotify Source, from the same machine as your browser in order to get credentials. In this scenario you can use http://127.0.0.1:9078/callback as the Spotify Redirect URI and multi-scrobbler SPOTIFY_REDIRECT_URI ENV. After completing authentication, copy the contents of local multi-scrobbler's configuration folder to the final location of where multi-scrobbler will be run. Use a docker container on the same machine your browser is on to \"intercept\" the callback URL from Spotify authentication, then manually finish the process by changing the domain to your multi-scrobbler instance. Create a container on the same machine as your browser using the mendhak/http-https-echo:36 image. This container runs a simple HTTP server that echos back any request it recieves. docker run --rm -p 127.0.0.1:5079:8080 mendhak/http-https-echo:36 Set the Spotify Redirect URI and multi-scrobbler SPOTIFY_REDIRECT_URI ENV as http://127.0.0.1:5079/callback In Authenticate Spotify with Multi-Scrobbler (outside these Redirect Instructions) go to Step 4 and continue the instructions Eventually, Spotify will redirect you to a web page with a URL like http://127.0.0.1:5079/callback?code=xxxxxx... In the URL, replace 127.0.0.1:5079 with the address/IP for your multi-scrobbler instance so the URL is similar to http://192.168.0.101:9078/callback?code=xxxxxx.... Then navigate to this URL to complete authentication. For your convenience, I run the mendhak/http-https-echo:36 container from the Echo approach on a domain I, the multi-scrobbler developer FoxxMD, control and self-host. Please be aware: I do not collect personal data or any querystrings/data sent in requests to this site It's not possible for me to use the code sent by Spotify to this URL without also having your Client ID/Secret However, there is always risk involved with trusting a service you do not control. Evaluate the risk of using this site for yourself. Use the Echo approach, starting from Step 2, with https://echo.multi-scrobbler.app/callback as Spotify Redirect URI and multi-scrobbler SPOTIFY_REDIRECT_URI ENV. Save your new App, then copy the Client ID/Secret from the App's Basic Information page. Add the Client ID, Secret, and Redirect URI to the respective field/ENV in the configuration section below Start multi-scrobbler, then visit the Web Dashboard and click (Re)authenticate on the Spotify card to start the auth process","s":"Spotify","u":"/multi-scrobbler/configuration/sources/spotify/","h":"","p":175},{"i":178,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description SPOTIFY_CLIENT_ID Yes SPOTIFY_CLIENT_SECRET Yes SPOTIFY_REDIRECT_URI No http://localhost:9078/callback URI must end in callback File Config Type CONFIG/spotify.json [ { \"name\": \"MySpotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MySpotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 }, \"type\": \"spotify\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/spotify/","h":"#configuration","p":175},{"i":180,"t":"This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome) Known Issues Multiple artists are reported as one value and cannot be separated If using Airsonic Advanced the password used (under Credentials) must be Decodable tip If your serivce supports scrobbling to Listenbrainz (such as Navidrome), considering using a Listenbrainz (Endpoint) Source instead of this one. Service-specific scrobble implementations tend to be more accurate and provide more information (multiple artists) compared to the Subsonic API. Use the optional usersAllow property with File or AIO configuration to restrict scrobbling to a list of defined users.","s":"Subsonic","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"","p":179},{"i":182,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description SUBSONIC_USER Yes SUBSONIC_PASSWORD Yes SUBSONIC_URL Yes Base url of your subsonic-api server File Config Type CONFIG/subsonic.json [ { \"name\": \"MySubsonic\", \"enable\": true, \"data\": { \"url\": \"http://localhost:4040/airsonic\", \"user\": \"yourUser\", \"password\": \"yourPassword\", \"usersAllow\": [ \"yourUser\" ] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MySubsonic\", \"enable\": true, \"data\": { \"url\": \"http://localhost:4040/airsonic\", \"user\": \"yourUser\", \"password\": \"yourPassword\", \"usersAllow\": [ \"yourUser\" ] }, \"type\": \"subsonic\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#configuration","p":179},{"i":184,"t":"Other Uses To scrobble to an ATProto PDS, create a teal.fm (Client) teal.fm is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a PDS (Personal Data Server). This Source monitors the teal.fm scrobbles in your PDS and then re-scrobbles discovered tracks to configured clients. Learn more about how teal.fm scrobbles work in the teal.fm (Client) docs.","s":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"","p":183},{"i":186,"t":"Follow the Setup instructions in the teal.fm (Client) docs to get access to your Bluesky PDS repository and scrobble data.","s":"Setup","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#setup","p":183},{"i":188,"t":"See the teal.fm (Client) configuration for general setup. The main differences for Source configuration: Cannot be setup with ENV config File/AIO config must include \"configureAs\": \"source\"","s":"Configuration","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#configuration","p":183},{"i":190,"t":"serviceAllow and serviceDeny are lists that can be used to filter what Plays are scrobbles from teal.fm. These correspond to the base domain of the music service where the Play is from, originally. The values in the list can be a subset of the actual service name (they do not need to be exact matches). Only one filter can be used at a time. If serviceAllow is configured then serviceDeny will be ignored. If a Play does not have an associated music service it can be allowed/denied using the special keyword unknown. If you are unsure what services are being used for your scrobbles you can check this by: use atproto.at to lookup your DID/handle View the Raw Data for the PDS Collection fm.teal.alpha.feed.play Check the musicServiceBaseDomain property for each record Examples Allowing only scrobbles from plyr.fm: tealfm.json [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [\"plyr\"], } } ] Deny scrobbles from last.fm: tealfm.json [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceDeny\": [\"last\"], } } ] Allow scrobbles from plyr.fm and unknown services: tealfm.json [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [\"plyr\", \"unknown\"], } } ] ENV File AIO ENV Config Type note You cannot use ENV variables shown in the teal.fm Client config -- multi-scrobbler assumes teal.fm ENVs are always used for the client configuration. You must use the File or AIO config to setup teal.fm as a Source. File Config Type CONFIG/tealfm.json [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [ \"plyr\" ], \"serviceDeny\": [ \"last.fm\" ] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [ \"plyr\" ], \"serviceDeny\": [ \"last.fm\" ] }, \"type\": \"tealfm\" } ] } or explore the schema with an example and live editor/validator","s":"Service Filtering","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#service-filtering","p":183},{"i":192,"t":"MS communicates with VLC using the Web (http) interface module Enable HTTP Interface​ Open VLC: Tools Menu -> Preferences In the bottom left change Show Settings from Simple to All In the updated window select Interface -> Main interfaces In the Extra interface modules section enable Web and verify that http is shown in the textbox Select Interface -> Main interfaces -> Lua In Lua HTTP -> Password -> set a password in this box Click Save at the bottom to persist your changes Restart VLC Verify the HTTP interface is accessible by navigating to http://localhost:8080 in your browser If the interface is accessible, after typing in your password, VLC is now ready to be used by MS. Setting VLC Interface and Port​ These can be set by starting VLC from command line with specific options: vlc --http-host yourHostIp:yourPort or vlc --http-port yourPort or modify the configuration file for VLC by editing keys with the same values as from the command line (http-host and http-port) Filename Parsing​ If the file being played in VLC does not have ID3 tags/metadata information multi-scrobbler can attempt to extract artist, title, and album information from the raw filename using regular expressions. Mutli-scrobbler will only do this if there is no other information reported by VLC about these fields. To extract this information use named capture groups in your expression matching the field that should be extracted: artist title and/or album. MS accepts multiple expressions, the first one that matches a filename will be used. Example usage in a file-based config: config/vlc.json [ { \"name\": \"MyVlc\", \"enable\": true, \"data\": { // ... }, \"options\": { \"filenamePatterns\": [ // Extracts artist and title from filenames that look like: // My Artist - My Cool title.mp4 \"/^\\\\s*(?<artist>.+?) - (?<title>.+?)\\\\.\\\\w+$/i\" ], // logs to DEBUG when MS tries to extract data from a filename \"logFilenamePatterns\": true, } } ] Vlc Information Reporting​ If you find that VLC is incorrectly reporting track information (in its interface) but multi-scrobbler is not parsing it correctly it may be due to the name of the fields VLC is reporting. mutli-scrobbler uses the most common field name but does not cover all use cases. Before reporting an issue please turn on metadata logging and include output from your logs while it is turned on: config/vlc.json [ { \"name\": \"MyVlc\", \"enable\": true, \"data\": { // ... }, \"options\": { \"dumpVlcMetadata\": true } } ]","s":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","h":"","p":191},{"i":194,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description VLC_URL No localhost:8080 VLC_PASSWORD Yes File Config Type CONFIG/vlc.json [ { \"enable\": true, \"name\": \"MyVlc\", \"data\": { \"url\": \"localhost:8080\", \"password\": \"changeme\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"enable\": true, \"name\": \"MyVlc\", \"data\": { \"url\": \"localhost:8080\", \"password\": \"changeme\" }, \"type\": \"vlc\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/vlc/","h":"#configuration","p":191},{"i":196,"t":"After installing the Webscrobbler extension open the preferences/settings for it: Under Accounts Add Webhook API URL: [YourMultiScrobblerInstance]/api/webscrobbler EX http://localhost:9078/api/webscrobbler Application name: (whatever you want) Reload the extension after adding the webhook. note On Firefox - Only FQNs (domain.tld), localhost, and 127.0.0.1 are supported for API URL due to firefox requiring https On Chromium-based Browsers - Any domain will work for API URL All other browsers are untested warning Multi-scrobbler is not designed to be publicly accessible from the internet. To use Webscrobbler outside your local network you should be accessing MS through a VPN or through a reverse proxy with some kind of authentication (though this is still not recommended).","s":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"","p":195},{"i":198,"t":"If you would like use multiple WebScrobbler sources they can be matched using a slug at the end of the API URL. This requires using a file-based config. Example webscrobbler.json [ { \"name\": \"aUserWS\", \"clients\": [ \"client1Maloja\" ], \"data\": { \"slug\": \"usera\" } }, { \"name\": \"bUserWS\", \"clients\": [ \"client2Maloja\" ], \"data\": { \"slug\": \"userb\" } } ] To use aUserWS source set API URL to http://localhost:9078/api/webscrobbler/usera To use bUserWS source set API URL to http://localhost:9078/api/webscrobbler/userb tip http://localhost:9078/api/webscrobbler is matched with the first source that that does not have a slug defined.","s":"Multiple Users","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#multiple-users","p":195},{"i":200,"t":"MS can be configured to only scrobble, or NOT scrobble, from some WS connectors. Use the name of the website from the supported websites or from the Connectors tab in the extension. note This affects only MS's behavior and does not affect the general connector behavior you have configured within the WebScrobbler extension.","s":"Connectors Black/Whitelist","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#connectors-blackwhitelist","p":195},{"i":202,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description WS_ENABLE No Set to 'true' to enable WS without needing to define other ENVs WS_WHITELIST No Only scrobble from these WebScrobbler Connectors. Comma-delimited list WS_BLACKLIST No Do not scrobble from these WebScrobbler Connectors. Comma-delimited list File Config Type CONFIG/webscrobbler.json [ { \"name\": \"MyWebScrobbler\", \"data\": { \"slug\": \"MyOptionalSlug\", \"whitelist\": [], \"blacklist\": [] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyWebScrobbler\", \"data\": { \"slug\": \"MyOptionalSlug\", \"whitelist\": [], \"blacklist\": [] }, \"type\": \"webscrobbler\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#configuration","p":195},{"i":204,"t":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs. Scrobbling Threshold Musiccast may not correctly report track length. If this is the case you should reduce the \"listened to\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly. URL​ If only a domain/IP:PORT is provided to multi-scrobbler it will automatically append the default Musiccast API path. If your Musiccast device is located behind a custom URL (or reverse proxy) you should explicitly provide the base path to use. EX url Transformed URL http://192.168.0.101 http://192.168.0.101/YamahaExtendedControl/v1 http://mydomain.com/reverseProxy/cast http://mydomain.com/reverseProxy/cast","s":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"","p":203},{"i":206,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MCAST_URL Yes The Musiccast device URL File Config Type CONFIG/musiccast.json [ { \"name\": \"myYamaha\", \"enable\": true, \"data\": { \"url\": \"192.168.0.101\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myYamaha\", \"enable\": true, \"data\": { \"url\": \"192.168.0.101\" }, \"type\": \"musiccast\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"#configuration","p":203},{"i":208,"t":"warning Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser. Scrobble Troubleshooting Due to monitoring being unofficial, listening history from YTM can be inconsistent and can cause missed scrobbles. See the FAQ for a detailed explanation, how to see more details about MS's detection of tracks, and how to properly report an issue. Authentication​ Only one of these methods needs to be used. Cookies OAuth Client YoutubeTV Use instructions from https://github.com/patrickkfkan/Volumio-YouTube.js/wiki/How-to-obtain-Cookie or https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers to get the Cookie value from a browser. It is highly recommended to get the cookie from an Incognito/Private Session to limit the chance the session is invalidated from normal browsing. Add the cookie to your ytmusic.json config in data or as an ENV: { \"type\": \"ytmusic\", \"enable\": true, \"name\": \"MyYTM\", \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\" }, \"options\": { \"logAuthUpdateChanges\": true, \"logDiff\": true } } If MS gives you authentication errors (session invalidated) at some point in the future follow the same instructions to get new cookies. warning As of Sept 25' OAuth clients no longer seem to have permission to access the YTM service, as reported by the upstream YTM library developer and several other users. If you have existing, working OAuth credentials keep using them but there is no gaurantee they will continue to work. If you are setting up the YTM Source for the first time you should first try to use Cookies. Based on the instructions from here... Login to Google Cloud console (create an account, if necessary) Create a new project Go to APIs and services. Configure the OAuth consent screen Use the old experience if possible If new is unavoidable then do not fill out any branding and under Authorized Domains you can delete the empty one (in order to save) Add yourself as an authorized user Navigate to Credentials Create Credentials -> choose \"OAuth client ID\" Application Type is Web Application Name is whatever you want, leave Authorization Javascript origins blank Authorized redirect URIs This must be exactly the same as what is displayed in MS! For now leave it blank so we can generate it from MS first Create In the newly created client popup save the Client ID and Client Secret, then copy them into ytmusic.json or appropriate ENVs: { \"type\": \"ytmusic\", \"enable\": true, \"name\": \"MyYTM\", \"data\": { \"clientId\": \"8910....6jqupl.apps.googleusercontent.com\", \"clientSecret\": \"GOCSPX-WGXL6BSuQ343...\" }, \"options\": { \"logAuthUpdateChanges\": true, \"logDiff\": true } } Now, start MS and during the YTMusic startup it will log something like this: Will use custom OAuth Client: Client ID: ... Client Secret: ... Redirect URI: http://localhost:9078/api/ytmusic/callback?name=MyYTM If the beginning of the Redirect URI (before api) is EXACTLY how you would reach the MS dashboard from your browser (EX http://localhost:9078) then edit your google oauth client section for Authorized redirect URIs and add the URL MS has displayed. If it is NOT EXACTLY the same you either need to set MS's base url or you can provide your own (Custom) Redirect URI for MS to use by setting it in ytmusic.json or ENV. Using a Custom Redirect URI The three parts of the URL that must be the same: it must start with api (after domain or subdirectory IE my.domain.tld/api... or whatever.tld/subDir/api... it must end in ytmusic/callback It must include name=[NameOfSource] in the query string Remember to add your custom URL to the Authorized redirect URIs section in the google oauth client! { \"type\": \"ytmusic\", \"enable\": true, \"name\": \"MyYTM\", \"data\": { \"clientId\": \"8910....6jqupl.apps.googleusercontent.com\", \"clientSecret\": \"GOCSPX-WGXL6BSuQ343...\", \"redirectUri\": \"http://my.custom.domain/api/ytmusic/callback?name=MyYTM\" }, \"options\": { \"logAuthUpdateChanges\": true, \"logDiff\": true } } AFTER changing the Authorized redirect URIs on Google Cloud console you may need to wait a few minutes for it to take affect. Then restart MS. From the dashboard click (Re)authenticate on the YTmusic source card and follow the auth flow: On the screen about \"testing\" make sure you hit Continue (not Back To Safety) Make sure to select ALL scopes/permissions/grants it asks you about Select what [YourAppName] can access -> Select all Once the flow is finished MS will get the credentials and start polling automatically. You should not need to re-authenticate again after restarting MS as it saves the credentials to the /config folder. warning Using the built-in YoutubeTV authentication is unlikely to work due to Google restricting what permissions TV clients can have. This authentication method should not be used. To authenticate start multi-scrobbler with an empty YT Music configuration. An authentication URL/code will be logged in additon to being available from the dashboard. ERROR: Sign in with the code 'CLV-KFA-BVKY' using the authentication link on the dashboard or https://www.google.com/device Visit the authentication URL and enter the code that was provided (also available on the dashboard). After completing the setup flow MS will log Auth success and the YT Music dashboard card will display as Idle after refreshing. Click the Start link to begin monitoring.","s":"Youtube Music","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"","p":207},{"i":210,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description YTM_COOKIE No Value for Cookie Authentication YTM_CLIENT_ID No Client ID for OAuth Athentication YTM_CLIENT_SECRET No Client Secret for OAuth Athentication YTM_REDIRECT_URI No A custom redirect URI for OAuth Athentication YTM_LOG_DIFF No false Log YTM history changes File Config Type CONFIG/ytmusic.json [ { \"name\": \"MyYTMusic\", \"enable\": true, \"clients\": [], \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\", \"clientId\": \"891098404....apps.googleusercontent.com\", \"clientSecret\": \"GOCS...\" }, \"options\": { \"logDiff\": true } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyYTMusic\", \"enable\": true, \"clients\": [], \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\", \"clientId\": \"891098404....apps.googleusercontent.com\", \"clientSecret\": \"GOCS...\" }, \"options\": { \"logDiff\": true }, \"type\": \"ytmusic\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"#configuration","p":207},{"i":212,"t":"Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler's lifecycle. Why Would I Do This? You may need to \"clean up\" data from a Source or before sending to a scrobble Client due to any number of reasons: ID3 tags in your music collection are dirty or have repeating garbage IE [YourMusicSource.com] My Artist - My Title A Source's service often incorrectly adds data to some field IE My Artist - My Title (Album Version) when the title should just be My Title An Artist you listen to often is spelled different between a Source and a Client which causes duplicate scrobbles In any scenario where a repeating pattern can be found in the data it would be nice to be able to fix it before the data gets downstream or to help prevent duplicate scrobbling. Multi-scrobbler can help you do this.","s":"Enhancing Scrobbles","u":"/multi-scrobbler/configuration/transforms/","h":"","p":211},{"i":214,"t":"First, let's recap the lifecycle of a scrobble in multi-scrobbler: Sources are the beginning of the journey for a Play (song you've listened to long enough to be scrobblable) A Source finds a new valid Play The Source compares this new Play to all the other Plays it has already seen, if the Play is unique (title/artist/album/listened datetime) then... The Source discovers the Play, adds it to Plays it has seen already, and broadcasts the Play should be scrobbled to all Clients Scrobble Clients listen for discovered Plays from Sources, then... A Client receives a Play from a Source The Client compares this Play to all the other scrobbles it has already seen, if the Play is unique (title/artist/album/listened datetime) then... The Client scrobbles the Play downstream to the scrobble service and adds it as a Scrobble it has seen already","s":"Journey of a Scrobble","u":"/multi-scrobbler/configuration/transforms/","h":"#journey-of-a-scrobble","p":211},{"i":216,"t":"You'll notice there is a pattern above that looks like this: Before data is compared Data is compared After data is compared These points, during both Source and Client processes, are when you can hook into the scrobble lifecycle and modify it. TLDR​ In more concrete terms this is the structure of hooks within a configuration (can be used in any Source or Client): lastfm.json [ { \"name\": \"myLastFm\", \"enable\": true, \"configureAs\": \"source\", \"data\": { // ... }, \"options\": { \"playTransform\": { \"preCompare\": [/* ... */], \"compare\": [/* ... */], \"postCompare\": [/* ... */] } } } ]","s":"Lifecyle Hooks","u":"/multi-scrobbler/configuration/transforms/","h":"#lifecyle-hooks","p":211},{"i":218,"t":"For Sources: preCompare - modify Play data immediately when received compare - temporarily modify Play data when it is being compared to see if Play was already discovered postCompare - modify Play data before sending to scrobble Clients For Clients: preCompare - modify Play data immediately when received compare - temporarily modify Play data when it is being compared to see if it was already scrobbled postCompare - modify Play data before scrobbling it to downstream service and adding to already seen scrobbles tip Keep in mind that modifying Scrobble/Play data earlier in the lifecycle will affect that data at all times later in the lifecycle (except when using the compare hook). For example, to modify the track so it's the same anywhere it is processed in multi-scrobbler you only need to modify it in the Source's preCompare hook because all later processes will receive the data with the modified track. TLDR To modify a scrobble coming from one of your Sources use the preCompare hook. Using compare hook The compare hook is slightly different than preCompare and postCompare. It consists of an object where you define which side(s) of the comparison should be modified. It also does not modify downstream data! Instead, the modifications are made only for use in the comparison. lastfm.json [ { \"name\": \"myLastFm\", // ... \"options\": { \"playTransform\": { \"compare\": [ { \"candidate\": {/* ... */}, // modify the \"new\" Play being compared \"existing\": {/* ... */}, // modify all \"existing\" Play/Scrobbles the new Play is being compared against } ], } } } ]","s":"Hook","u":"/multi-scrobbler/configuration/transforms/","h":"#hook","p":211},{"i":220,"t":"Each hook is made up of one or more Stages. A Stage is a self-contained, unique way of enhancing or modifying the Play data. Some examples of a Stage: The User Stage allows a user to define search-and-replace terms for Artist/Title/Album The Native Stage uses MS's built-in heuristics to extract Artists from a single Artist string The Musicbrainz Stage tries to match Play data with the Musicbrainz database and to standardize the Artist/Title/Album data Each Stage in a Hook receives Play data from the previous Stage. Within a hook, each Stage minimally consists of a type to identify what Stage it is along with any other data specific to that stage: { \"type\": \"native\" // optional, stage specific data here... }","s":"Modification Stage","u":"/multi-scrobbler/configuration/transforms/","h":"#stage","p":211},{"i":222,"t":"Stages may be globally configured using AIO Config config.json file in the top-level transformers block. Each Stage consists of: type the type of Stage name a unique name for the Stage, to be (potentially) used with hooks defaults - An object defining default configuration for this stage, when used in a Hook. data - An object containing any data required to initially configure the stage itself (Example: API URL, username, password, etc...) Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\", \"defaults\": { // default delimiters when this Stage is used in a hook \"delimiters\": [ \"•\" ], // default delimiters when this Stage is used in a hook \"artistsParseFrom\": [\"artists\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\" // when \"name\" is not defined, uses first found \"native\" transformer } ] } } } ] Multiple stages of the same type may be configured, allowing you to define several sets of default behavior. Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"DotTransformer\", \"defaults\": { \"delimiters\": [ \"•\" ], \"artistsParseFrom\": [\"artists\"] } }, { \"type\": \"native\", \"name\": \"TitleOnly\", \"defaults\": { // extracts and uses *only* artists found in title string \"artistsParseFrom\": [\"title\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\" \"name\": \"DotTransformer\" } ] } } } ] In a VLC File Config: vlc.json [ { \"name\": \"MyVLC\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\" \"name\": \"TitleOnly\" } ] } } } ] Overriding Configuration​ The default configuration you set for your Stage may be overridden in any usage of the Stage within a Hook. Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\", \"defaults\": { // default delimiters when this Stage is used in a hook \"delimiters\": [ \"•\" ], // default delimiters when this Stage is used in a hook \"artistsParseFrom\": [\"artists\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\" \"name\": \"MyNativeTransformer\", // overrides property from \"defaults\" \"artistsParseFrom\": [\"artists\", \"title\"] } ] } } } ]","s":"Configuring Stages","u":"/multi-scrobbler/configuration/transforms/","h":"#configuring-stages","p":211},{"i":224,"t":"Each Stage may specify whether it should apply the resulting transformation to different parts of the Play data by specifying title, artists and/or album in the Stage object. { \"type\": \"native\", // ... \"title\": false, // will not apply any changes to Play title \"artists\": { \"when\": {/* ... */}, // will only apply changes to Play artists if \"when\" is satisfied /* ... */ }, \"albumArtists\": true, // will always apply changes to Play album artists \"album\": true, // will always apply changes to Play album \"duration\": true, // will always apply changes to Play duration (length of track) \"meta\": true, // will always apply changes to Play meta (MBIDs, spotify links, etc...) } The actual value of each property may be different for each Stage. Check the docs for the Stage you want to use to see its usage of each. Generically, though, each property may be some value or an object combining a when condition and that value. If none of the properties are specified in the stage then it's assumed all transformed data should be used. note Specifying these Rules is not the same as configuring the Stage. Rules only determine if the result of the transformation should be used (replace) the existing Play Data.","s":"Rules for Play Data","u":"/multi-scrobbler/configuration/transforms/","h":"#stage-rules","p":211},{"i":226,"t":"Stages may be optionally configured to continue to the next Stage or stop (end early) all subsequent Stages, based on the outcome of the currently running Stage. These three properties can be added to the Modification Stage data, alongside Rules: onSuccess (default continue) - If the Stage successfully finishes processing onFailure (default stop) - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation result onSkip (default continue) - If the Stage does not process the Play data due to stage-level when or other stage-specific skip conditions tip The default behaviors for Flow Control are the same as you would intuitively think Stages should run IE the next Stage you have defined runs if the current Stage does not fail. Specifying Flow Control is only necessary if the above assumptions are not true for your scenario. Default Flow Control Example subsonic.json // ... \"options\": { \"playTransform\": { \"preCompare\": [ { // if this stage is successful, native is run // if this stage fails, native does not run \"type\": \"musicbrainz\", \"name\": \"MyMB\" }, { \"type\": \"native\", \"name\": \"MyNative\" } ] } } Customized Flow Control Example subsonic.json // ... \"options\": { \"playTransform\": { \"preCompare\": [ { // if musicbrainz is successful then do NOT run native, // only run native if musicbrainz fails to find a match (onFailure) \"type\": \"musicbrainz\", \"name\": \"MyMB\" \"onSuccess\": \"stop\", \"onFailure\": \"continue\" }, { \"type\": \"native\", \"name\": \"MyNative\" } ] } }","s":"Stage Flow Control","u":"/multi-scrobbler/configuration/transforms/","h":"#flow-control","p":211},{"i":228,"t":"Stages within a Hook, and Rules within each Stage, support a when object for testing if they should be run. The when object may have propertes for rule. Each property may be a string or regular expression. The value of the property is used to match the pre-transformation values from Play data. All parts of an individual when clause must test true to \"pass\" but if any when clauses pass the Stage/Rule is processed. If the when test does not pass then the Stage is skipped (onSkip). { \"when\": { \"artist\": \"Elephant Gym\", // Play must have an artist matching \"Elephant Gym\" (AND) \"album\": \"Dreams\" // Play object must have an album matching \"Dreams\" (AND) } } { \"when\": [ { \"artist\": \"Elephant Gym\", // Play must have an artist matching \"Elephant Gym\" (AND) \"album\": \"Dreams\" // Play object must have an album matching \"Dreams\" (AND) }, // OR { \"title\": \"/(Remastered)$/\", // Play title must match regular expression (AND) \"album\": \"Various Artists\" // Play album must match \"Various Artists\" (AND) } ] } More succinctly: All parts (artist album albumArtist duration meta title) of a when are AND conditions All part-objects in the when array are OR conditions Example of Stage with when condition { // IF the artist is Elephant Gym // THEN Run native stage \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", \"when\": [ { \"artist\": \"/Elephant Gym/\" } ] } ], } } Example of individual rule with when condition { // Always run native Stage // // IF artist matches \"Elephant Gym\" // THEN use result of native stage for \"artists\" of Play data \"playTransform\": { \"preCompare\": { \"type\": \"native\", \"artists\": { \"when\": [ { \"artist\": \"/Elephant Gym/\" } ] }, } } }","s":"Conditionally Run","u":"/multi-scrobbler/configuration/transforms/","h":"#conditional-modification","p":211},{"i":230,"t":"MS can log a diff of Stage transformations if/when they occur. In the playTransform object of a Source/Client config use log: \"log\": true => Output original play + final transformed output of last Stage in the array This can also be enabled by using DEBUG_MODE=true \"log\": \"all\" => Output original play + final transformed output of each Stage in the array { \"name\": \"myThing\", \"data\": {/*...*/}, \"options\": { \"playTransform\": { \"preCompare\": {/*...*/}, \"log\": true } } } Example The output shows the diff between the previous stage (or original Play) and the current stage. In docker logs this is highlighted with diff syntax: [2025-12-17 08:53:10.467 -0500] DEBUG : [App] [Sources] [Lastfm - mylfm] [Play Transform] [preCompare] [VLDJJo] Transform Diff - Original + musicbrainz-MyMB Title : Demons Theme Part II (original 12\" mix) Artists : LTJ Bukem Album Artists: (None) - Album : Producer 05: Rarities (Original 12\" Version) + Album : Producer 05: Rarities (original 12\" version) Meta : * brainz-album: 36759a8a-d3df-47da-a236-60f84fdc0cab + * brainz-artist: 28c1b7b7-355a-48b1-b2c4-75b8eb8080ef + * brainz-track: a0d51240-7ef1-4676-882e-be9f354075cb + * brainz-releaseGroup: e0cce74f-abcc-343b-9390-1673e4d57ce7","s":"Logging","u":"/multi-scrobbler/configuration/transforms/","h":"#logging","p":211},{"i":232,"t":"See Examples sections in specific Stage docs (also in the sidebar): User Stage Native Stage Musicbrainz Stage","s":"Examples","u":"/multi-scrobbler/configuration/transforms/","h":"#examples","p":211},{"i":234,"t":"The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data. This Stage is useful for standardizing your Scrobble's Play data, regardless of the Source it is coming from. Even if you have have strong opinions about the way your existing music is already tagged/organized you should consider adding the Musicbrainz Stage to your Sources, if only to benefit from adding MBIDs to scrobbled metadata. Why Should I Prefer MusicBrainz? More Than Mainstream Data The MusicBrainz database contains 37 million+ tracks 5 million+ albums 2.7 million+ artists in over 200 languages, contributed by 10,000+ editors each year with many more users voting on edits. The database covers a much wider range of music than most commercial services since it isn't restricted by licensing or incentivized to prioritize mainstream music due to business interests. You are much more likely to find data for obscure, indie, and international artists. As The Artist Intended While some large services (Spotify) may be more consistent in data structure, the MusicBrainz equivalent data is likely to be more true to the way the Artist originally intended since individuals can devote effort to individual artists. A fan of an artist is much more likely to \"get it right\" for their favorite band than a corporate business trying to do the least amount of work for the largest result. tip If you are using ENV Config for multi-scrobbler and just want a quick and easy setup, skip to ENV Configuration. tip Set up Valkey Caching to cache Musicbrainz API calls for faster processing.","s":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":233},{"i":236,"t":"The MusicBrainz database contains 37 million+ tracks 5 million+ albums 2.7 million+ artists in over 200 languages, contributed by 10,000+ editors each year with many more users voting on edits. The database covers a much wider range of music than most commercial services since it isn't restricted by licensing or incentivized to prioritize mainstream music due to business interests. You are much more likely to find data for obscure, indie, and international artists.","s":"More Than Mainstream Data","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":233},{"i":238,"t":"While some large services (Spotify) may be more consistent in data structure, the MusicBrainz equivalent data is likely to be more true to the way the Artist originally intended since individuals can devote effort to individual artists. A fan of an artist is much more likely to \"get it right\" for their favorite band than a corporate business trying to do the least amount of work for the largest result.","s":"As The Artist Intended","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":233},{"i":241,"t":"To avoid rate limiting, MusicBrainz requires API users to identify themself using a User-Agent that contains an email or URL. You must set this in the data for your stage configuration in your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, } ] } Additional Musicbrainz Servers Other, or additional, Musicbrainz Servers/Mirrors can be added to the API configuration. If more than one server is defined then multi-scrobbler will round-robin load balance API calls. Use url to define the base URL of the Musicbrainz server to use. If url is not defined multi-scrobbler assumes it is the primary Musicbrainz server, https://musicbrainz.org. Example of multiple servers: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" // uses default Musicbrainz server https://musicbrainz.org }, // additional server { \"contact\": \"contact@mydomain.com\", \"url\": \"https://my.mb.mirror.domain.com\" } ] }, } ] }","s":"API Setup","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#api-setup","p":233},{"i":243,"t":"All of the properties found in Matching with Musicbrainz section are configured in Stage Configuration as defaults. Example: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ], \"defaults\": { \"releaseStatusPriority\": [\"official\"], \"fallbackArtistSearch\": \"native\", \"releaseAllowEmpty\": true } }, } ] }","s":"Stage Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#stage-configuration","p":233},{"i":245,"t":"Each Rule should be either a boolean, specifying if the transformed data should be used for this field, or a when condition: { \"type\": \"musicbrainz\", \"name\": \"MyMB\" // ... \"title\": false, // will not apply any changes to Play title \"artists\": { \"when\": {/* ... */}, // will only apply changes to Play artists if \"when\" is satisfied /* ... */ }, \"album\": true // will always apply changes to Play album \"meta\": true // adds MusicBrainz MBIDs to scrobble data }","s":"Rules","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#rules","p":233},{"i":247,"t":"The general configuration shown above can also be configured from a selection of presets using ENV Config for individual Sources/Clients. You must always include the MB_CONTACT ENV to identify your application: MB_CONTACT=contact@mydomain.com To configure stage defaults use MB_PRESETS with a comma-delimited list of presets you wish to apply. More than one preset can be applied, in which case they combine. You must choose at least one of the presets below: default - Applies no defaults. This is the same as using no options from Matching With Musicbrainz sensible - Applies the Sensible Default configuration for sorting releases native - Applies fallbackArtistSearch: native for Artist Extraction if the first search fails to find matches aggressive - Applies Free Text Search fallbackFreeTextSearch: true if all other searches fail Finally, use ENV *_TRANSFORMS=musicbrainz on each Source/Client you wish to apply this stage to. This applies the stage in the preTransform Hook with all Rules enabled. The * stands for the prefix used for each Source/Client's ENV keys. Refer to the individual Source/Client Configuration sections to find this. Example: All Subsonic Source ENVs look like SUBSONIC_USER=myuser etc... Use SUBSONIC_TRANSFORMS=musicbrainz Example Full Docker Deploy with ENV Configuration Using Jellyfin + Maloja example from Quickstart: services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - MB_CONTACT=contact@mydomain.com - MB_PRESETS=sensible,native # creates sensible defaults with native fallback searching - JELLYFIN_URL=192.168.0.110:8096 - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b - JELLYFIN_USER=MyUser - JELLYFIN_TRANSFORMS=musicbrainz # applies musicbrainz Stage to preTransform of Jellyfin source - MALOJA_URL=http://192.168.0.100:42010 # maloja receives enhanced scrobble from Jellyfin - MALOJA_API_KEY=myApiKey volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped","s":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#env-configuration","p":233},{"i":249,"t":"note All properties found in this section are optional. If you just want a sensible default for configuraion refer to the Best Practices section. Matching your Scrobble's Play data with a result from Musicbrainz is comprised of two steps: Searching Musicbrainz using parts of your Scrobble as queries Refining matched results to select the desired/allowed match Both steps have separate configuration.","s":"Matching with Musicbrainz","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#matching-with-musicbrainz","p":233},{"i":251,"t":"Before MS begins a search it checks Scrobble data it checks if your data already contains: MBIDs for artists, album, and specific track/recording and duration If it already has all required data types then the entire Musicbrainz Stage is skipped. If any are missing then a search is performed. Define which data types are required using: searchWhenMissing (defaults to all) - A list containing any of: artists title album duration forceSearch (default false) - Force searching even if all required data is present Example Stage Configuration example: // ... \"defaults\": { // only search if MBIDs for artists or album is missing \"searchWithMissing\": ['artists', 'album'] // uncomment to make the stage always search, even if above data is present //forceSearch: true } If required data is missing then the next step is making search queries to the Musicbrainz database to try to get potential candidates. Multi-scrobbler uses the title, artist(s), and album from your Scrobble data to query for matches. note If your Scrobble data contains an ISRC (usually from Spotify) then Multi-scrobbler will search using this ID first, before the above criteria. If no match is found with the ISRC then it automatically retries with the title, artist(s), and album. Musicbrainz agressively normalizes these fields in its database which means that if your Scrobble data contains major innaccuracies or phrases fields in a non-normal way, it's possible Musicbrainz won't find any matches. This is a more common occurrence when trying to match Scrobble data from Sources that don't support multiple artist data, like Subsonic and Last.fm. Examples of Bad Data Last.fm Scrobble returns an Artist in the title and combines two artists into one string: { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup & Punk Rock Factory\"] } The corresponding Musicbrainz Recording has all artists separated and no artist in the title: { \"title\": \"Endless Possibility\", \"artists\": [\"Bowling For Soup\", \"Punk Rock Factory\", \"Wheatus\"] } note If the initial search(es), and any retried searches, do not return any results then the stage is marked as failed (onFailure) for Flow Control. Retrying Search​ If normal searches using all the fields mentioned above does not return any matches Multi-scrobbler can try additional searches with modified queries. Album Only If your Scrobble data contains a title, artist(s), and an album (all three fields) then Multi-scrobbler can retry the search using only title and album, if fallbackAlbumSearch is set in Stage Configuration: Stage Configuration example: // ... \"defaults\": { // will try an additional search using only title + album name \"fallbackAlbumSearch\": \"true\" } Artist Extraction If... Album Only returns no results or did not run Your scrobble data contains only one artist string fallbackArtistSearch is set in Stage Configuration Then Multi-scrobbler will attempt to extract multiple artists from your artist and track string. This is not automatic. You must set fallbackArtistSearch to enable this additional search. fallbackArtistSearch can be set to Native or Naive mode: Native (Recommended) Naive Native (native) mode uses an aggressive configuration of the Native Stage to extract artists using common delimiters and common \"joined\" artist patterns from the artist and title string of your Scrobble data. tip If you already have a Native Stage configured you should use that instead, running it before the Musicbrainz stage. Native Mode Example { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup & Punk Rock Factory, My Cool Band\"] } Extracts Bowling For Soup Punk Rock Factory My Cool Band from artist string Extracts Wheatus from title string Removes (feat. Wheatus) from title string because it found an artist there Resulting data used for Musicbrainz search: { \"title\": \"Endless Possibility\", \"artists\": [\"Bowling For Soup\", \"Punk Rock Factory\", \"My Cool Band\", \"Wheatus\"] } Stage Configuration example: // ... \"defaults\": { // ... \"fallbackArtistSearch\": \"native\" } Naive (naive) mode looks for the first found common delimiter in the artist string. If it finds one then it uses the preceding value as the only artist in the Musicbrainz search. It does not try to extract additional artists from the artist string, or extract anything from the title string. Naive Mode Example { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup, Punk Rock Factory & Wheatus\"] } Finds & as first common delimiter, extracts \"Bowling For Soup\" Resulting data used for Musicbrainz search: { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup\"] } Stage Configuration example: // ... \"defaults\": { // ... \"fallbackArtistSearch\": \"naive\" } Free Text If both Album Only and Artist Extraction searches fail to return results, or were not run, you can additionally enable Free Text search. This will search Musicbrainz for all text of your Scrobble data artist/title/album, without constraint. warning Free text search is unconstrained which means that Musicbrainz will match text in any part of a Recording (artist, release, or recording field), regardless of where it is found. This may lead to results that are unexpected and undesired. If you know your Source's Play data is well organized you should not enable this. Free Text search should only be used if: your music is not well organized or there may be many alternative titles/artists for the music you listen to (such as with psuedo-releases) you can tolerate that matches may not be accurate for releases. Generally, if you keep score high then matched releases should at least be the right artist or what you would expect within a reason, as a match. The release may not be the one you actually listened to but it would be \"close enough\". Stage Configuration example: // ... \"defaults\": { // ... \"fallbackFreeTextSearch\": true }","s":"Searching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#searching","p":233},{"i":254,"t":"Each match returned by MusicBrainz contains a numeric score representing how close it was to the search parameters. Set score in configuration to set a minimum score that must be met by matches. Default is 90. { // ... \"score\": 90 // matches must score 90 or higher to be considered }","s":"Score","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#score","p":233},{"i":256,"t":"There are several attributes associated with the Release a Recording (individual Track/song) belongs to that you may be interested in controlling. MS can use these attributes to filter what the final Recording selected to match against your Play data is. An easy way to think about this: Do you prefer Albums, Singles, or EPs? Do you always want to use an official album release, or are bootleg or cancelled albums okay to use? Should a track that belongs to a Compilation album be allowed to match? What country do you prefer an album release to be from? Release Attributes​ These attributes (attribute_name in config) are: Release Status (releaseStatus) - Is this release/album/ep official, promotional, bootleg, etc... Release Group Primary Type (releaseGroupPrimaryType) - Is this release an Album, Single, EP, etc... Release Group Secondary Type (releaseGroupSecondaryType) - Is this release a compilation, soundtrack, remix, etc... Release Country (releaseCountry) - What ISO2 country was this released in? US, GB, MX, etc... MusicBrainz uses the special code XW to represent a \"Worldwide\" release AKA release not made specifically for a country Each of the above attributes can be used to filter matches using allow (explicitly include) or deny (exclude) terms. The correct property name for each is like so: [attribute_name]Allow = [...] [attribute_name]Deny EX to explicitly allow only release status \"official\" \"releaseStatusAllow\": [\"official\"] EX to exclude compilations \"releaseGroupSecondaryTypeDeny\": [\"compilation\"] Empty Releases​ Sometimes a Recording may not have any associated Releases. This may be because there is not enough information about the Recording yet, or it was never included on an actual Release. You may want to filter the majority of your matches by releases but allow matching a Recording that has no releases to begin with. To allow this set releaseAllowEmpty to true in configuration: // ... \"defaults\": { // ... \"releaseAllowEmpty\": true // don't remove a match during filtering just because it has no releases }","s":"Filtering","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filtering","p":233},{"i":258,"t":"Each Release Attribute has one additional property that can be used to rank releases based on the order of the values you give it. This is the priority property. After matches have been filtered, the remaining matches will have their releases sorted. Release with an attribute that does not match are not removed, but they are sorted lower than releases that do match. Sorting can be a good alternative to filtering: with filters there is a possibility your filters may eliminate all matches; if you want to ensure that some match will be used then sorting can ensure that the best choice out of those given will always be used, without accidentally ending up with no choice. Sorting can be used instead of filters, or in conjunction with filters, it's your choice. In configuration: [attribute_name]Priority = [...] EX to prefer \"official\" releases over everything else \"releaseStatusPriority\": [\"official\"] EX to prefer albums, then singles, over everything else \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\"] If a rule is not present then multi-scrobbler defaults it to true.","s":"Sorting","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sorting","p":233},{"i":261,"t":"Generally, the Musicbrainz Stage can be used without any of the optional configuration and you should still see good results from matches. The top scored match is, anecdotally, good enough for correcting and filling in surface-level play data like Title and Artist names. For a more opinionated match that will mirror what you would expect from data from large music services: { // use official release over anything else \"releaseStatusPriority\": [\"official\"], // prefer album, then single, then ep \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], // prefer worldwide release \"releaseCountryPriority\": [\"XW\"] } Consider adding Artist Extraction in Native Mode if any of your Sources do not support multiple artists or your music collection is not tagged well. { // add the line below to the sensible defaults above // (don't forget commas) \"fallbackArtistSearch\": \"native\" }","s":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default","p":233},{"i":263,"t":"When using your own filters consider: Prefer deny over allow Releases come in all kinds of formats. Since allow is explicit you may filter out your desired match without realizing it (correct data except for release type). Or the Musicbrainz data for a higher scored match may be appropriate but you did not include it, exhaustively. Prefer Sorting over Filtering Sorting does not eliminate any matches. It is, generally, better to get some match than it is to have your Play data completely uncorrected because filtering eliminated all matches","s":"Filter Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filter-considerations","p":233},{"i":265,"t":"Use Rules to apply MusicBrainz match data selectively. If you know that your music collection is well organized and you do not want to change the artists/title/album etc... sent to a Client, you can still benefit from matches by only applying MBIDs using meta so that any Client that supports Musicbrainz data (Koito, Tealfm, Listenbrainz, Rocksky) can still get that data. Example subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"title\": false, \"artists\": false, \"album\": false, \"albumArtists\": false, \"meta\": true } ] } } } ]","s":"Using Partial Match","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#using-partial-match","p":233},{"i":267,"t":"If Musicbrainz is not returning matches Multi-scrobbler is using the wrong match or the resulting enhanced Scrobble is not what you expected Enable logging by turning on Debug Mode to help diagnose any issues with the Musicbrainz API and Scrobble enhancement. Before creating an issue please enable logging and include any logs with your issue as this is needed to debug. If you have multiple Modification Stages and need to see the diff for your Play between each Stage, enable \"log\": \"all\" in the individual Modification Stage. Example In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"log\": \"all\", \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", } ] } } } ]","s":"Logging","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#logging","p":233},{"i":270,"t":"Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ]","s":"Minimal","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#minimal","p":233},{"i":272,"t":"Using the config shown in Sensible Default with File/AIO config, instead of ENV Config. Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { \"releaseStatusPriority\": [\"official\"], \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], \"releaseCountryPriority\": [\"XW\"], \"fallbackArtistSearch\": \"native\" } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ]","s":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default-1","p":233},{"i":274,"t":"If you do not want your scrobble data to be modified (artists/album/title) but still want to benefit from associating the scrobble with a Musicbrainz match (for Scrobble Clients like Tealfm, Rocksky, and Koito), then use Partial Match rules to specify only meta to be updated. Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { // maybe something like Sensible Default? } } ] } In a Jellyfin File Config: jellyfin.json [ { \"name\": \"MyJellyfin\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"title\": false, \"artists\": false, \"album\": false, \"albumArtists\": false, \"meta\": true // only update scrobble metadata with MBIDs } ] } } } ]","s":"Add Metadata Only (No Scrobble Modification)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#add-metadata-only-no-scrobble-modification","p":233},{"i":276,"t":"Musicbrainz Stage configured with Sensible Defaults Fallback search with Artist Extraction Default Native Stage Uses Flow Control to run Native only if there are no Musicbrainz matches Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { \"releaseStatusPriority\": [\"official\"], \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], \"releaseCountryPriority\": [\"XW\"], \"fallbackArtistSearch\": \"native\", } } ] } In a Jellyfin File Config: jellyfin.json [ { \"name\": \"MyJellyfin\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { // if musicbrainz is successful then do NOT run native, // only run native if musicbrainz fails to find a match (onFailure) \"type\": \"musicbrainz\", \"name\": \"MyMB\" \"onSuccess\": \"stop\", \"onFailure\": \"continue\" }, { \"type\": \"native\" } ] } } } ]","s":"Use Native Stage if no Musicbrainz Matches","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-native-stage-if-no-musicbrainz-matches","p":233},{"i":278,"t":"The User Stage uses search-and-replace expressions, provided by you, to modify/replace parts of Play data. This Stage is most useful for correcting individual instances of bad data, or patterns, in your known data. Example scenarios: Removing (Album Version) from all Titles Removing Various Artists from Artist data Correcting spelling mistakes for individual Artist names The user Stage type is user.","s":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","h":"","p":277},{"i":280,"t":"All Stage Configuration is done using search-and-replace expressions inside individual rules. Default configuration for all Rules can still be done using Stage defaults. Example config.json { // ... \"transformers\": [ { \"type\": \"user\", \"name\": \"Normalizer\", \"defaults\": { \"title\": [ \"(Album Version)\" ], \"artists\": [ \"Various Artists\" ] } } ] } Default Stage​ For your convenience, if you do not define any User Stage Configurations then multi-scrobbler automatically builds an empty one for you. This can be used by omitting the name in your modification Stage. Example In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"user\", // do not include name, the default user stage will be used \"title\": [ // removes badterm from track title \"badterm\" ] } ] } } } ]","s":"Configuration","u":"/multi-scrobbler/configuration/transforms/user/","h":"#configuration","p":277},{"i":282,"t":"A Search-And-Replace Expression can be a plain string that matches a literal, then removes it: Expression: \"badTerm\" \"this is badTerm cool string\" => \"this is a cool string\" or a regular expression that matches and removes the match: Expression: \"/bad\\w+/i\" \"this is badSomething cool string\" => \"this is a cool string\" Or it may be an object that specifies what to match (using either plain string or regular expression) and what to replace it with: { \"search\": \"anotherBadTerm\", // match all instances of 'anotherBadTerm' \"replace\": \"goodTerm\" // replace with the string 'goodTerm' } \"this is anotherBadTerm cool string\" => \"this is goodTerm cool string\" { \"search\": \"/^\\(\\w+.com)/i\", // matches any string that starts with EX '(YourMusic.com)' \"replace\": \"[MySite.com]\" // replace with the string '[MySite.com]' } \"(Foo.com) this is a cool string\" => \"[MySite.com] this is a cool string\" The replace property uses javascript's replace() function and so can use any special string characters.","s":"Search-And-Replace Expression","u":"/multi-scrobbler/configuration/transforms/user/","h":"#search-and-replace-expression","p":277},{"i":284,"t":"Each Rule must be an array of search-and-replace expressions: lastfm.json [ { \"name\": \"myLastFm\", \"configureAs\": \"source\", \"data\": { // ... }, \"options\": { \"playTransform\": { \"type\": \"user\", \"preCompare\": [ { \"title\": [ // removes \"badTerm\" from title \"badTerm\", { // removes \"fooTerm\" from title and replaces it with \"barTerm\" \"search\": \"fooTerm\", \"replace\": \"barTerm\" } ] } ], } } } ] note If the value of the field (title, an artist, album) is an empty string after transforming then the field is removed.","s":"Rules","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rules","p":277},{"i":287,"t":"Using when for Conditional Modification Example // On search-replace in title... // IF artist matches \"Elephant Gym\" // THEN Run regex search-replace ELSE skip this rule // // Run live|remastered regex remove on title { \"title\": [ { \"search\": \"/\\\\s\\\\-\\\\s滾石40\\\\s滾石撞樂隊\\\\s40團拚經典(.+)$/i\", \"replace\": \"\", \"when\": [ { \"artist\": \"/Elephant Gym/\" } ] }, \"/(\\\\s\\\\-\\\\s|\\\\s)(feat\\\\.(.+)|live|remastered(.+))$/i\" ], }","s":"Usage with when condition","u":"/multi-scrobbler/configuration/transforms/user/","h":"#usage-with-when-condition","p":277},{"i":289,"t":"Removes the phrase (Album Version) from the Title of a Play Example { \"title\": [ \"(Album Version)\" ] }","s":"Remove phrase from Title in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-phrase-from-title-in-all-new-plays","p":277},{"i":291,"t":"Example { \"compare\": { \"candidate\": { \"title\": [ \"/(\\(.+\\))\\s*$/\" ] }, \"existing\": { \"title\": [ \"/(\\(.+\\))\\s*$/\" ] }, }, }","s":"Remove all parenthesized content from the end of a title","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-all-parenthesized-content-from-the-end-of-a-title","p":277},{"i":293,"t":"Example { \"artists\": [ { \"search\": \"Boz Skaggs\", \"replace\": \"Boz Scaggs\" } ] }","s":"Rename misspelled artist in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rename-misspelled-artist-in-all-new-plays","p":277},{"i":295,"t":"Example { \"album\": [ { \"search\": \"Various Artists\", \"replace\": \"\" } ] }","s":"Remove \"Various Artists\" albums in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-various-artists-albums-in-all-new-plays","p":277},{"i":297,"t":"Details When the Artist string is actually a multi-artist, delimited string, this search-and-replace will replace the string with just the first artist found. Ex My Artist One / My Artist Two / Another Guy My Artist One Artists are delimited with a spaced forward slash (/) in the regex below. Replace the contents of the delim capture group with the delimiter for your use case. Some more common scenarios: (?<delim>\\\\/) No spaces between slash IE My Artist One/My Artist Two/Another Guy (?<delim>\\\\s*\\\\\\\\\\s*) Backslash instead of forward slash IE My Artist One \\ My Artist Two \\ Another Guy (?<delim>,) Comma IE My Artist One, My Artist Two, Another Guy Example { \"artists\": [ { \"search\": \"(.*?)(?<delim>\\\\s*\\\\/\\\\s*)(.*$)\", \"replace\": \"$1\" } ] }","s":"Extract primary Artist from delimited, multi-Artist string","u":"/multi-scrobbler/configuration/transforms/user/","h":"#extract-primary-artist-from-delimited-multi-artist-string","p":277},{"i":299,"t":"To do...","s":"Client Development/Tutorial","u":"/multi-scrobbler/development/dev-client/","h":"","p":298},{"i":301,"t":"The Native Stage uses built-in heuristics to try to extract Artists from Play artist/track data. This Stage is most useful for Sources that report limited data such as: Subsonic - Reports Artists as a single string A non-exhaustive list of heuristics: Splits artists in artist string using common delimiters EX Foo Artist, Bar Guy, Baz Band - My Cool Song Does not split artists with & in name, if other delimiters are present Does not split artist name when only one delimiter is present Splits artists on common joiner phrases (ft. feat. vs. etc...) Extracts artists from Play title using joiner phrases EX My Cool Song (feat. SomeGuy) A practical example of what the Native Stage will do to Play data: This Scrobble from Subsonic { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup & Punk Rock Factory\"] } Will be transformed into this { \"title\": \"Endless Possibility\", \"artists\": [\"Bowling For Soup\", \"Punk Rock Factory\", \"Wheatus\"] }","s":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","h":"","p":300},{"i":303,"t":"Available properties for Stage Configuration: delimitersExtra - A list of string characters that should be considered delimiters for artists in addition to multi-scrobbler's default list (, / \\ ) delimiters - A list of string characters that should be considered delimiters for artists. Replaces all delimiters (MS not use any defaults, only what you give it) artistsIgnore - a list of strings and/or regular expressions. Any monolothic artist string that matches from the list will not be modified. artistsParseFrom a list of the properties that should be used to try to extract artists. Can be artists title or both. Defaults to both when not provided in options ( [\"artists\", \"title\"] ) When artists is present it tries to extract additional artists from artist strings When title is present it tries to extract artists from ft. feat. vs. etc... found in the track title Importantly, if artists is not present in artistsParseFrom then no artists are used at all (only those from title, if present) artistsParseMonolithicOnly - boolean value, defaults to true. When true native tranformer will only attempt to extract artists if the scrobble data has only one string for artist (pre-transform) This means that, for Sources like Spotify/Jellyfin/etc. that provide proper lists of artists in their data and the list has more than one string, it will not try to extract artists from their strings Example of the behavior for artistsParseFrom The Foos, The Bars - My Cool Track (ft. Frank) Config => extracted artists \"artistsParseFrom\": [\"artists\", \"title\"] => The Foos, The Bars, Frank \"artistsParseFrom\": [\"artists\"] => The Foos, The Bars \"artistsParseFrom\": [\"title\"] => Frank \"artistsParseFrom\": [] =>","s":"Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#configuration","p":300},{"i":305,"t":"Each Rule should be either a boolean, specifying if the transformed data should be used for this field, or a when condition.: { \"type\": \"native\", // ... \"title\": false, // will not apply any changes to Play title \"artists\": { \"when\": {/* ... */}, // will only apply changes to Play artists if \"when\" is satisfied /* ... */ }, \"album\": true // will always apply changes to Play album } If a rule is not present then multi-scrobbler defaults it to true.","s":"Rules","u":"/multi-scrobbler/configuration/transforms/native/","h":"#rules","p":300},{"i":307,"t":"For your convenience, if you do not define any Native Stage Configurations then multi-scrobbler automatically builds one using the defaults shown in configuration. This can be used by omitting the name in your modification Stage. Example In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", // do not include name, the default native stage will be used } ] } } } ]","s":"Default Stage","u":"/multi-scrobbler/configuration/transforms/native/","h":"#default-stage","p":300},{"i":309,"t":"The default configuration shown above can also be applied using ENV Config for individual Sources/Clients. Use ENV *_TRANSFORMS=native on each Source/Client you wish to apply this stage to. This applies the stage in the preTransform Hook with all Rules enabled. The * stands for the prefix used for each Source/Client's ENV keys. Refer to the individual Source/Client Configuration sections to find this. Example All Subsonic Source ENVs look like SUBSONIC_USER=myuser etc... Use SUBSONIC_TRANSFORMS=native Example Full Docker Deploy with ENV Configuration Using Jellyfin + Maloja example from Quickstart: services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - JELLYFIN_URL=192.168.0.110:8096 - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b - JELLYFIN_USER=MyUser - JELLYFIN_TRANSFORMS=native # applies native Stage to preTransform of Jellyfin source - MALOJA_URL=http://192.168.0.100:42010 # maloja receives enhanced scrobble from Jellyfin - MALOJA_API_KEY=myApiKey volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped","s":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#env-configuration","p":300},{"i":312,"t":"Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\", \"defaults\": { // default delimiters when this Stage is used in a hook \"delimiters\": [ \"•\" ], // default delimiters when this Stage is used in a hook \"artistsParseFrom\": [\"artists\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\" } ] } } } ]","s":"Parse only artists string using a custom delimiter","u":"/multi-scrobbler/configuration/transforms/native/","h":"#parse-only-artists-string-using-a-custom-delimiter","p":300},{"i":314,"t":"Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\", \"defaults\": { \"artistsIgnore\": [ \"Crosby, Stills, Nash & Young\", \"Polo & Pan\" ] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\" } ] } } } ]","s":"Don't parse specific artists","u":"/multi-scrobbler/configuration/transforms/native/","h":"#dont-parse-specific-artists","p":300},{"i":316,"t":"In the scenario where you want to extract Artists from Track titles with joiners like My Cool Track (feat. Foobar) but want to keep the title as-is: Example No additional stage configuration is required so we can use the default Stage. In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", \"title\": false // do not modify title } ] } } } ]","s":"Extract Artists from Title but do not modify Title","u":"/multi-scrobbler/configuration/transforms/native/","h":"#extract-artists-from-title-but-do-not-modify-title","p":300},{"i":319,"t":"Multi-scrobbler is written entirely in Typescript. It consists of a backend and frontend. The backend handles all Source/Client logic, mounts web server endpoints that listen for Auth callbacks and Source ingress using expressjs, and serves the frontend. The frontend is a standalone Vitejs app that communicates via API to the backend in order to render the dashboard.","s":"Architecture","u":"/multi-scrobbler/development/dev-common/","h":"#architecture","p":317},{"i":321,"t":"Development requires Node v18.19.1 or higher is installed on your system. tip When running locally (not with a devcontainer) you can use nvm to manage the installed node version. Clone this repository somewhere and then install from the working directory git clone https://github.com/FoxxMD/multi-scrobbler.git . cd multi-scrobbler nvm use # optional, sets correct node version when running without devcontainer npm install npm run start","s":"Project Setup","u":"/multi-scrobbler/development/dev-common/","h":"#project-setup","p":317},{"i":323,"t":"This repository contains workspace settings for development with VSCode. These include: Run/Debug Launch configurations for the application and tests Devcontainer for development with all dependencies already installed Useful extensions for linting and running tests To use the Devcontainer simple open the repository in VSCode and \"Use Devcontainer\" when the notification is presented. npm install will be run when a new container is created.","s":"VSCode","u":"/multi-scrobbler/development/dev-common/","h":"#vscode","p":317},{"i":325,"t":"info In this document, when referring to aspects of Sources and Clients that are shared between both, the Source/Client will be referred to as a Component. A Component is composed of two parts: Typescript interfaces describing structure of configuration for that Component A concrete class inheriting from a common \"startup\" abstract class that enforces how the Component is built and operates In both parts Source/Clients share some common properties/behavior before diverging in how they operate.","s":"Common Development","u":"/multi-scrobbler/development/dev-common/","h":"#common-development","p":317},{"i":327,"t":"The configuration for a Component should always have this minimum shape, enforced respectively by the interfaces CommonSourceConfig and CommonClientConfig: interface MyConfig { name: string data?: object options?: object } data contains data that is required for a Component to operate such as credentials, callback urls, api keys, endpoints, etc... options are optional settings that can be used to fine-tune the usage of the Component but are not required or do not majorly affect behavior. EX additional logging toggles","s":"Config","u":"/multi-scrobbler/development/dev-common/","h":"#config","p":317},{"i":329,"t":"Components inherit from an abstract base class, AbstractComponent, that defines different \"stages\" of how a Component is built and initialized when MS first starts as well as when restarting the Component in the event it stops due to an error/network failure/etc... Stages​ Stages below are invoked in the order listed. All stages are asynchronous to allow fetching network requests or reading files. The stage function (described in each stage below) should return a value or throw: return null if the stage is not required return true if the stage succeeded return a string if the stage succeeded and you wish to append a result to the log output for this stage throw an Exception if the stage failed for any reason and the Component should not continue to run/start up Stage: Build Data​ This stage should be used to validate user configuration, parse any additional data from async sources (file, network), and finalize the shape of any configuration/data needed for the Component to operate. info Implement doBuildInitData in your child class to invoke this stage. Examples Parse a full URL like http://SOME_IP:7000/subfolder/api from user config containing a base url like data.baseUrl: 'SOME_IP' and then store this in the class config Validate that config data contains required properties user password salt Read stored credentials from ${this.configDir}/currentCreds-MySource-${name}.json; Stage: Check Connection​ This stage is used to validate that MS can communicate with the service the Component is interacting with. This stage is invoked on MS startup as well as any time the Component tries to restart after a failure. If the Component depends on ingress (like Jellyfin/Plex webhook) this stage is not necessary. info Implement doCheckConnection in your child class to invoke this stage. Examples Make a request to the service's server to ensure it is accessible Open a websocket connection and check for a ping-pong Stage: Test Auth​ MS determines if Auth is required for a Component based on two class properties. You should set these properties during constructor initialization for your Component class: requiresAuth - (default false) Set to true if MS should check/test Auth for this Component requiresAuthInteraction - (default false) Set to true if user interaction is required to complete auth IE user needs to visit a callback URL If the Component requires authentication in order to communicate with a service then any required data should be built in this stage and a request made to the service to ensure the authentication data is valid. This stage should return: true if auth succeeded false if auth failed without unexpected errors IE the authentication data is not valid and requires user interaction to resolve the failure throw an exception if network failure or unexpected error occurred You should attempt to re-authenticate, if possible. Only throw an exception or return false if there is no way to recover from an authentication failure. info Implement doAuthentication in your child class to invoke this stage. Examples Generate a Bearer Token for Basic Auth from user/password given in config and store in class properties Make a request to a known endpoint with Authorization token from read credentials file to see if succeeds or returns 403 Catch a 403 and attempt to reauthenticate at an auth endpoint with user/password given in config","s":"Concrete Class","u":"/multi-scrobbler/development/dev-common/","h":"#concrete-class","p":317},{"i":331,"t":"The PlayObject is the standard data structure MS uses to store listen (track) information and data required for scrobbling. It consists of: Track Data -- a standard format for storing track, artists, album, track duration, the date the track was played at, etc... Listen Metadata -- Optional but useful data related to the specific play or specifics about the Source/Client context for this play such as Platform specific ID, web URL to track, device/user ID that played this track, etc... Both Sources and Clients use the PlayObject interface. When a Component receives track info from its corresponding service it must transform this data into a PlayObject before it can be interacted with. For more refer to the TS documentation for PlayObject or AmbPlayObject in your project","s":"Play Object","u":"/multi-scrobbler/development/dev-common/","h":"#play-object","p":317},{"i":333,"t":"Source Development and Tutorial Client Development and Tutorial","s":"Creating Clients and Sources","u":"/multi-scrobbler/development/dev-common/","h":"#creating-clients-and-sources","p":317},{"i":335,"t":"This document will provide a step-by-step guide for creating a (trivial) new Source in MS alongside describing what aspects of the Source need to be implemented based on the service you use. Before using this document you should review Common Development.","s":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","h":"","p":334},{"i":337,"t":"You are the developer of a fancy, new self-hosted web-based media player called Cool Player. Cool Player has a slick interface and many bells and whistles, but most importantly it has an API. The API: Has an unauthenticated health endpoint at /api/health that returns 200 if the service is running properly Has authenticated endpoints that require a user-generated token in the header Authorization MY_TOKEN Has a /api/recent endpoint that lists recently played tracks with a timestamp Has a /api/now-playing endpoint that returns information about the state of the player like current track, player position in the track, etc... Cool Player is by default accessed on port 6969 Your personal instance of Cool Player is hosted at http://192.168.0.100:6969 and the api is accessed at http://192.168.0.100:6969/api Because there is an API that MS can actively read this will be a polling Source where MS sends requests to Cool Player to get scrobble information -- as opposed to an ingress Source like Jellyfin/Plex that uses webhooks from the service to send data to MS.","s":"Scenario","u":"/multi-scrobbler/development/dev-source/","h":"#scenario","p":334},{"i":340,"t":"We will create a new config interface for Cool Player using the Common Config and tell MS it is a valid config that can be used. Create a new file for your config: /src/backend/common/infrastructure/config/source/coolplayer.ts import { PollingOptions } from \"../common.js\"; import { CommonSourceConfig, CommonSourceData } from \"./index.js\"; // all of the required data for the Build Data and Test Auth stages (from Common Development docs) // should go here export interface CoolPlayerSourceData extends CommonSourceData, PollingOptions { // remember to annotation your properties! /** * The user-generated token for Cool Player auth created in Cool Player -> Settings -> User -> Tokens * * @example f243331e-cf5b-49d7-846b-0845bdc965b4 * */ token: string /** * The host and port where Cool Player is hosted * * @example http://192.168.0.100:6969 * */ baseUrl: string } export interface CoolPlayerSourceConfig extends CommonSourceConfig { data: CoolPlayerSourceData } export interface CoolPlayerSourceAIOConfig extends CoolPlayerSourceConfig { // when using the all-in-one 'config.json' this is how users will identify this source type: 'coolplayer' } Add the new interface to the list of valid interfaces for sources: src/backend/common/infrastructure/config/source/sources.ts import { ChromecastSourceAIOConfig, ChromecastSourceConfig } from \"./chromecast.js\"; // ... import { CoolPlayerSourceAIOConfig, CoolPlayerSourceConfig } from \"./coolplayer.js\"; export type SourceConfig = SpotifySourceConfig // ... | CoolPlayerSourceConfig; export type SourceAIOConfig = SpotifySourceAIOConfig // ... | CoolPlayerSourceAIOConfig; Finally, add the source type identifier to the list of valid identifiers src/backend/common/infrastructure/Atomic.ts export type SourceType = 'spotify' // ... | 'coolplayer'; export const sourceTypes: SourceType[] = [ 'spotify', // ... 'coolplayer' ]; Now we will create a new Source inheriting from AbstractComponent that: accepts our config interface implements a function to transform CoolPlayer's track data into a PlayObject implements required stages implements required methods to current player state and/or now playing track","s":"Define and Implement Config","u":"/multi-scrobbler/development/dev-source/","h":"#define-and-implement-config","p":334},{"i":342,"t":"First we create a new Source called CoolPlayerSource and setup our constructor to accept the config and specify Auth behavior. src/backend/sources/SpotifySource.ts import { CoolPlayerSourceConfig } from \"../common/infrastructure/config/source/coolplayer.js\"; import MemorySource from \"./MemorySource.js\"; import { InternalConfig, } from \"../common/infrastructure/Atomic.js\"; // MemorySource is the base class used for polling-type Sources export default class CoolPlayerSource extends MemorySource { // type hints for TS to know what the base class config looks like declare config: CoolPlayerSourceConfig; constructor(name: any, config: CoolPlayerSourceConfig, internal: InternalConfig, emitter: EventEmitter) { super('coolplayer', name, config, internal, emitter); // Cool Player required authentication this.requiresAuth = true; // but does not require user interaction for auth to work this.requiresAuthInteraction = false; // tells MS this is a Source that can be activity monitored through API this.canPoll = true; } }","s":"Create CoolPlayer Source","u":"/multi-scrobbler/development/dev-source/","h":"#create-coolplayer-source","p":334},{"i":344,"t":"When MS starts it reads all configs and determines which Source to build based on the configs found. We need to tell it to build a CoolPlayerSource when a coolplayer config type is found. We modify ScrobbleSources.ts to add CoolPlayerSource as an option: src/backend/sources/ScrobbleSources.ts // ... import { CoolPlayerSource, CoolPlayerData } from \"./CoolPlayerSource.js\"; export default class ScrobbleSources { // ... buildSourcesFromConfig = async (additionalConfigs: ParsedConfig[] = []) => { // ... // if CoolPlayerSource should be able to be built from ENVs only // then add it as a case statement here for (const sourceType of sourceTypes) { switch (sourceType) { // ... case 'musikcube': // ... break; case 'coolplayer': const cp = { baseUrl: process.env.COOL_URL, token: process.env.COOL_TOKEN } if (!Object.values(cp).every(x => x === undefined)) { configs.push({ type: 'coolplayer', name: 'unnamed', source: 'ENV', mode: 'single', configureAs: defaultConfigureAs, data: cp as CoolPlayerData }); } break; default: break; } } } // ... // (required) create new CoolPlayerSource if source config type is 'coolplayer' addSource = async (clientConfig: ParsedConfig, defaults: SourceDefaults = {}) => { // ... let newSource: AbstractSource; switch (type) { // ... case 'musikcube': // ... break; case 'coolplayer': newSource = await new CoolPlayerSource(name, compositeConfig as CoolPlayerSourceConfig, internal, this.emitter); break; default: break; } } }","s":"Initialize Source from Config","u":"/multi-scrobbler/development/dev-source/","h":"#initialize-source-from-config","p":334},{"i":346,"t":"Now we will create a static function that is used to take the track data returned from Cool Player's API and return a standard PlayObject. src/backend/sources/CoolPlayerSource.ts import dayjs from \"dayjs\"; import { FormatPlayObjectOptions, } from \"../common/infrastructure/Atomic.js\"; import { PlayObject } from \"../../core/Atomic.js\"; export default class CoolPlayerSource extends MemorySource { // ... // 'obj' should ideally be a real TS interface // if CoolPlayer has a ts/js client we would use that otherwise // we should build our own interfaces to represent track data from Cool Player's API static formatPlayObj(obj: any, options: FormatPlayObjectOptions = {}): PlayObject { const { trackName, artistName, albumName, duration, playedAt, } = obj; return { data: { artists: [artistName], album: albumName, track: trackName, // assuming seconds duration, // assuming playedAt is an ISO8601 timestamp playDate: dayjs(playedAt) }, meta: { source: 'CoolPlayer' } } } }","s":"Implement Play Object Transform","u":"/multi-scrobbler/development/dev-source/","h":"#implement-play-object-transform","p":334},{"i":348,"t":"Next we will implement the Stages required to get CoolPlayerSource running. Build Data​ First we implement the Build Data Stage. We will check that the token and baseUrl properties have been provided by the user. Additionally, we will parse the baseUrl and add default ports/prefix. src/backend/sources/CoolPlayerSource.ts import { URL } from \"url\"; // ... export default class CoolPlayerSource extends MemorySource { baseUrl!: URL; // ... static parseConnectionUrl(val: string) { const normal = normalizeUrl(val, {removeTrailingSlash: false, normalizeProtocol: true}) const url = new URL(normal); if (url.port === null || url.port === '') { url.port = '6969'; } if (url.pathname === '/') { url.pathname = '/api/'; } return url; } protected async doBuildInitData(): Promise<true | string | undefined> { const { token, baseUrl } = this.config; if (token === null || token === undefined || (typeof token === 'string' && token.trim() === '')) { throw new Error(`'token' must be defined`); } if (baseUrl === null || baseUrl === undefined || (typeof baseUrl === 'string' && baseUrl.trim() === '')) { throw new Error(`'baseUrl' must be defined`); } try { this.baseUrl = CoolPlayerSource.parseConnectionUrl(baseUrl); } catch (e) { throw new Error(`Could not parse baseUrl: ${baseUrl}`, {cause: e}); } this.logger.verbose(`Config URL: ${baseUrl} => Normalized: '${this.url.toString()}'`); return true; } } Check Connection​ Second we will implement the Check Connection Stage: src/backend/sources/CoolPlayerSource.ts import request from 'superagent'; import { UpstreamError } from \"../common/errors/UpstreamError.js\"; // ... export default class CoolPlayerSource extends MemorySource { // ... protected async doCheckConnection(): Promise<true | string | undefined> { try { const resp = await request.get(`${this.baseUrl}/health`); return true; // if /health returned version info we could instead read response and return a string with version info for visibility to the user // return `Cool Player Version: ${resp.body.version}`; } catch (e) { throw e; } } } Test Auth​ Finally, we will implement Auth Test Stage: src/backend/sources/CoolPlayerSource.ts import request from 'superagent'; import { UpstreamError } from \"../common/errors/UpstreamError.js\"; // ... export default class CoolPlayerSource extends MemorySource { // ... doAuthentication = async () => { try { const resp = await request .get(`${this.baseUrl}/recent`) .set('Authorization', `Token ${this.config.token}`); return true; } catch (e) { // if Cool Player returned an error as json we could parse it from error body and throw new Error with the message throw e; } } }","s":"Implement Stages","u":"/multi-scrobbler/development/dev-source/","h":"#implement-stages","p":334},{"i":350,"t":"The majority of Sources MS monitors primarily operate as a source of truth for a music player rather than a played music history. Only Listenbrainz and Last.fm operate as a source of music history. To this end, MS implements a state machine that emulates the behavior of a music player in order to keep track of when a song you are listening to should be scrobbled. It does this by monitoring the \"currently playing\" track reported by a Source's service, with varying degrees of accuracy depending on what information is returned from the service. The state machine is implemented in MemorySource which our CoolPlayerSource inherits from. For a polling Source to work properly we need to implement a function, getRecentlyPlayed, that returns PlayObjects that are \"newly\" played. These are then checked against previously \"discovered\" plays and their timestamp to determine if they should be surfaced to Clients to scrobble. To take advantage of the MemorySource state machine we will additionally use processRecentPlays from MemorySource inside getRecentlyPlayed. We pass track and/or player state returned from the Source service to processRecentPlayers. It then takes care of deriving Source player state based on how this data changes over time. The advantage to using processRecentPlays is that our Source service does not necessarily need to pass any player information -- as long as the track info has a duration we can more-or-less determine if it has been played long enough to scrobble. src/backend/sources/CoolPlayerSource.ts import request from 'superagent'; import { SourceData, PlayerStateData, SINGLE_USER_PLATFORM_ID } from \"../common/infrastructure/Atomic.js\"; // ... export default class CoolPlayerSource extends MemorySource { // ... protected async getRecentlyPlayed(options: RecentlyPlayedOptions = {}): Promise<PlayObject[]> { const plays: SourceData[] = []; try { // currently playing tracks/player state data const resp = await request .get(`${this.baseUrl}/now-playing`) .set('Authorization', `Token ${this.config.token}`); const { body: { playerState, // 'playing' or 'stopped' or 'paused'... position, // number of seconds into the track IE at position 48 -> ( 0:48/3:56 in player UI ) play: { /* track data */} } } = resp; // transform into standard player state data const playerData: PlayerStateData = { platformId: SINGLE_USER_PLATFORM_ID, play: CoolPlayerSource.formatPlayObj(play), position }; // if Cool Player does return player state we can also push a regular PlayObject to this list plays.push(playerData); } catch (e) { throw e; } // process player state through state machine // if the track changes or player state changes // and currently played track has been listened to long enough to be scrobbled it will return in newPlays const newPlays = this.processRecentPlays(plays); // finally, we return new plays and MS checks to see if they have been previously seen // before signalling to Clients that they can be scrobbled return newPlays; } } Congratulations! Your CoolPlayerSource has been minimally implemented and can now be used in multi-scrobbler.","s":"Implement Polling","u":"/multi-scrobbler/development/dev-source/","h":"#implement-polling","p":334},{"i":353,"t":"To have your Source try to scrobble \"missed\" tracks when MS starts up the Source's service must be able to provide: track information timestamp of when the track was played In your Source implement getBackloggedPlays and set setting in constructor indicating it has backlogging capabilities: src/backend/sources/CoolPlayerSource.ts import request from 'superagent'; import { PlayObject, } from \"../common/infrastructure/Atomic.js\"; // ... export default class CoolPlayerSource extends MemorySource { constructor(/* ... */) { super(/* ... */); // ... // tell MS it should try to get backlogged tracks on startup this.canBacklog = true; } // ... protected getBackloggedPlays = async (options: RecentlyPlayedOptions): Promise<PlayObject[]> => { try { const resp = await request .get(`${this.baseUrl}/recent`) .set('Authorization', `Token ${this.config.token}`); // assuming list from body looks like track info returned in // \"Implement Play Object Transform\" section const { body = [] } = resp; return body.map(x => CoolPlayerSource.formatPlayObj(x)); } catch (e) { throw new Error('Error occurred while getting recently played', {cause: e}); } } }","s":"Backlog","u":"/multi-scrobbler/development/dev-source/","h":"#backlog","p":334},{"i":355,"t":"There are some scenarios where polling and/or state machine is not the right tool to handle determining if incoming data should be scrobbled: The Source service handles scrobble threshold internally, the data being received should always be scrobbled (WebScrobbler, Plex, Tautulli, Listenbrainz, Last.fm) You prefer to handle the scrobble determination yourself Music History Source​ If the Source is still polling but the track returned should always be scrobbled if not already seen IE the Source service is a music history source (Listenbrainz, Last.fm), rather than a music player, then simply indicate to MS the source of truth type by setting it in the constructor. The state machine will always return a track if it is new and not seen, regardless of how recently it was seen: src/backend/sources/CoolPlayerSource.ts import { SOURCE_SOT } from \"../../core/Atomic.js\"; // ... export default class CoolPlayerSource extends MemorySource { constructor(/* ... */) { super(/* ... */); // ... // tell MS it should immediately scrobble any new, unseen tracks from the upstream service this.playerSourceOfTruth = SOURCE_SOT.HISTORY; } } Non-Polling Source​ Ingress Sources (like Plex, Tautulli, Webscrobbler, Jellyfin) do not having a polling mechanism because the upstream service contacts MS when there is an event, rather than MS contacting the upstream service. For these Sources you will need to implement endpoints in src/service/api.ts and corresponding files. See the existing Sources in the project as references for how to do this. You may still wish to use the state machine MemorySource (like Jellyfin) if the events received are not \"scrobble\" events but instead of implementing getRecentlyPlayed you will implement your own function in your Source class, like handle(), that receives data and then uses processRecentPlays. After new plays have been determined see the next section for how to scrobble... Basic Source​ At the core of a Source that implements AbstractSource's functionality is the ability to Discover and Scrobble plays. These functions are not seen in the MVP CoolPlayerSource because they are automatically done by the polling functionality after being returned from getRecentlyPlayed. Discovery​ A Source keeps track of all the \"plays\" that are determined to be valid for scrobbling. When a play is valid it is checked to see if it has already been \"discovered\" by comparing the track info and timestamp of the play against already discovered plays. This prevents duplicate scrobbling by using the Source's own data and simplifies scrobbling for Sources by allowing your implementation to \"always\" ingest track data without having to worry about whether its new or not -- AbstractSource and discover() will take care of that for you. src/backend/sources/MyBasicSource.ts export default class MyBasicSource extends AbstractSource { handle(somePlay: PlayObject) { // if the track is \"new\" and not seen before it is returned in the discovered list // we then know it is OK to be sent to Clients for scrobbling const discovered: PlayObject[] = this.discover([somePlay]); } } This additionally will be surfaced to the user in the Dashboard in the \"Tracks Discovered\" page. Scrobbling​ After a play is verified to be discovered we can then scrobble it. This will emit the plays to the ScrobbleClients service which then disseminates the play to all Clients that were configured to listen in the Source's config. src/backend/sources/MyBasicSource.ts export default class MyBasicSourceSource extends AbstractSource { handle(somePlay: PlayObject) { const discovered: PlayObject[] = this.discover([somePlay]); // emit plays that can be scrobbled by clients this.scrobble(discovered); } } If your service only emits an event when a play is scrobbled you can technically skip using discover() but it is good practice to use it unless you have a very good reason not to. note Using scrobble() does not guarantee a track is actually scrobbled! The Scrobble Clients also check the play against their own \"recently scrobbled\" list to prevent duplicates.","s":"Other Source Types","u":"/multi-scrobbler/development/dev-source/","h":"#other-source-types","p":334},{"i":359,"t":"Install Flatpak Install flatpak-builder flatpak-node-generator​ Requires python 3.7+, pip/pipx","s":"Flatpak and flatpak-builder","u":"/multi-scrobbler/development/flatpak/","h":"#flatpak-and-flatpak-builder","p":356},{"i":361,"t":"Set the branch tag or commit to use for MS in the source section of io.github.foxxmd.multiscrobbler.yml","s":"Update Project source","u":"/multi-scrobbler/development/flatpak/","h":"#update-project-source","p":356},{"i":364,"t":"A convenience bash script is provided that automates generating offline sources and building the flatpak app for you. This is the recommend method to use. Located in the project at flatpak/setup.sh, run it from the flatpak directory with this syntax: ./setup.sh -o -b /path/to/flatpak/build/dir Args: -o => Delete and overwrite any existing generated sources -b => The absolute path to the directory that should be used for flatpak build/artifacts. If not defined will use `CWD/build` -y => Proceed without confirming settings","s":"Use Setup Script","u":"/multi-scrobbler/development/flatpak/","h":"#use-setup-script","p":356},{"i":366,"t":"If you cannot use setup.sh follow the below to manually generate sources and build the flatpak app: Instructions Use flatpak-node-generator to generate sources​ First, make sure node_modules is deleted or empty for both the project and docsite directories. Then, from MS project root: PROJECT_DIR flatpak-node-generator npm package-lock.json Move generated-sources.json into PROJECT_DIR/flatpak and rename generated-sources.0.json Then, generate docsite sources: PROJECT_DIR flatpak-node-generator npm docsite/package-lock.json Move generated-sources.json into PROJECT_DIR/flatpak and rename generated-sources.1.json Build flatpak​ In the below command replace /home/yourUser/multi-scrobbler-flatpak with a directory to use for storing flatpak build/artifacts. PROJECT_DIR/flatpak flatpak-builder --repo=/home/yourUser/multi-scrobbler-flatpak/repo --state-dir=/home/yourUser/multi-scrobbler-flatpak/state /home/yourUser/multi-scrobbler-flatpak/build io.github.foxxmd.multiscrobbler.yml --force-clean info Append --install --user to the above command to have the app installed immediately.","s":"Manual Setup","u":"/multi-scrobbler/development/flatpak/","h":"#manual-setup","p":356},{"i":368,"t":"If built with --install --user (default when using setup.sh) you can now run MS using the command flatpak run -u io.github.foxxmd.multiscrobbler","s":"Run App","u":"/multi-scrobbler/development/flatpak/","h":"","p":356},{"i":372,"t":"These sources are ingress-based which means that multi-scrobbler waits for the Webscrobbler extension or app using Listenbrainz Endpoint to contact multi-scrobbler, as opposed to multi-scrobbler contacting them. multi-scrobbler will log information about any server that connects to it for these services. In the logs it looks something like this: [2025-07-10 12:32:21.417 -0400] INFO : [App] [API] [Ingress] [WebScrobbler] [Ingress] [WebScrobbler] Received request from a new remote address: ::ffff:127.0.0.1 (192.168.0.100) (UA: Mozilla/5.0 (X11; Linux x86_64; rv:139.0) Gecko/20100101 Firefox/139.0) [2025-07-10 12:32:21.418 -0400] INFO : [App] [API] [Ingress] [WebScrobbler] [Ingress] [WebScrobbler] ::ffff:127.0.0.1 (192.168.0.100) (UA: Mozilla/5.0 (X11; Linux x86_64; rv:139.0) Gecko/20100101 Firefox/139.0) Received data for API URL slug '(none)' for the first time. It also logs if a server tries to connect to a URL that it does not recognize: 2023-02-22T11:16:12-05:00 debug : [App ] Server received POST request from ::ffff:192.168.0.100 (UA: PlexMediaServer/1.24.5.5173-8dcc73a59) to unknown route: /plkex So, if you do not see either of these in your logs then the Source is not able to connect to your multi-scrobbler instance at all. This is not something multi-scrobbler can fix and means you have an issue in your network. Troubleshooting​ Check or try all these steps before submitting an issue: Turn on Debug Logging​ First, turn on debug logging for multi-scrobbler by setting the environmental variable DEBUG_MODE=true. Then, check the output for any additional information. Check Host name and URL​ The URLs examples in the configuration documentation assume you are running Webscrobbler/LFM Endpoint on the same server as multi-scrobbler. If these are not the same machine then you need to determine the IP address or domain name that multi-scrobbler is reachable at and use that instead of localhost when configuring these sources. This is likely the same host name that you would use to access the web interface for multi-scrobbler. EX http://localhost:9078/api/webscrobbler -> http://192.168.0.140:9078/api/webscrobbler Check Firewall and Port Forwarding​ If the machine multi-scrobbler is running on has a firewall ensure that port 9078 is open. Or if it is in another network entirely make sure your router is forwarding this port and it is open to the correct machine. Check Source Service Logs​ Webscrobbler​ See Debugging the extension to get logs which should have information about failed requests.","s":"Webscrobbler/Listenbrainz Endpoint doesn't connect","u":"/multi-scrobbler/FAQ/","h":"#ingress-connection","p":369},{"i":374,"t":"Ensure any client id or secrets are correct in your configuration. The callback/redirect URL for these services must be: the same address you would use to access the multi-scrobbler web interface the web-interface must be accessible from the browser you are completing authentication from. If multi-scrobbler is not running on the same machine your browser is on then the default/example addresses (http://localhost...) will not work. You must determine the address you can reach the web interface at (such as http://192.168.0.140:9078) then use that in place of localhost in the callback URLs. EX http://localhost:9078/lastfm/callback -> http://192.168.0.220:9078/lastfm/callback","s":"Spotify/Deezer/LastFM won't authenticate","u":"/multi-scrobbler/FAQ/","h":"#spotifydeezerlastfm-wont-authenticate","p":369},{"i":376,"t":"If you see errors in multi-scrobbler for YTM that contain 401 or 403 like Error: Could not send the specified request to browse. Status code: 401 then YTM has invalidated your authentication. First, ensure you are NOT using YoutubeTV authentication. If you completed authentication by entering a \"User Code\" you are using YoutubeTV which has stopped working. You should reauthenticate using Cookies or Custom OAuth. When using OAuth Client Authentication​ Refresh your authentication by using the (Re)authenticate link from MS's web dashboard. When using Cookies Authentication​ The library MS uses relies on scraping the YTM site by using cookies from your actual browser to pretend it is a browser. It does its best to keep these up to date but since this is not an official way to access the service YTM may invalidate your access to the authenticated session at any time. How this is triggered is unknown and not something multi-scrobbler can control. You can help limit the chance of your session being invalidated by getting the cookie from an Incognito/Private Session and then immediately closing the browser afterwards. To re-authenticate MS follow the YTM instructions to retrieve a new set of cookies for multi-scrobbler and then restart MS to potentially resolve the problem.","s":"Youtube Music fails after some time","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-fails-after-some-time","p":369},{"i":379,"t":"If you see something like this in your logs: 2023-02-19T10:05:42-06:00 warn : [App] App config file exists but could not be parsed! 2023-02-19T10:05:42-06:00 error : [App] Exited with uncaught error 2023-02-19T10:05:42-06:00 error : [App] Error: config.json could not be parsed It means the JSON in your configuration file is not valid. Copy and paste your configuration into a site like JSONLint to find out where errors you have and fix them.","s":"Config could not be parsed","u":"/multi-scrobbler/FAQ/","h":"#config-could-not-be-parsed","p":369},{"i":382,"t":"This is a limitation of the Last.fm API where the artist field is only one string and Last.fm does not recognize (play well) with \"combined\" artists. Multi-scrobbler works the same was the official Spotify-Last.fm integration works -- it only scrobbles the first artist on a multi-artist track.","s":"Last.fm does not scrobble tracks with multiple artists correctly","u":"/multi-scrobbler/FAQ/","h":"#lastfm-does-not-scrobble-tracks-with-multiple-artists-correctly","p":369},{"i":384,"t":"The Google Cast integration relies on a few common fields in the data it receives from your casting device. Every platform that can cast (Spotify, Pandora, etc...) should use these fields the same but there are slight differences between their implementations that may confuse multi-scrobbler. Specific platforms may also return more information in non-common fields that are undocumented. To diagnose these issues you must enable payload logging for your google cast Source, run MS, and then include logs with this output from that run. Without the raw data logged from your cast device it will be nearly impossible to resolve your issue.","s":"Google Cast track information is missing/incorrect or MS player has weird times","u":"/multi-scrobbler/FAQ/","h":"#google-cast-track-information-is-missingincorrect-or-ms-player-has-weird-times","p":369},{"i":386,"t":"It is likely the app playing on the cast device is incorrectly reporting the media type as not music. MS logs will tell you what type the media is reported as with lines like: My Artist - Example Track has 'unknown' media type and allowUnknownMedia=false, will not track Refer to Allow Unknown Media Type section to fix this My Artist - Example Track has 'movie' media type so will not track Refer to Force Media Tracking section to fix this","s":"Google Cast device does not track media","u":"/multi-scrobbler/FAQ/","h":"#google-cast-device-does-not-track-media","p":369},{"i":388,"t":"Before reporting an issue turn on metadata logging in the MS VLC configuration, see the VLC documentation.","s":"VLC is not scrobbling fields correctly","u":"/multi-scrobbler/FAQ/","h":"#vlc-is-not-scrobbling-fields-correctly","p":369},{"i":390,"t":"How MS detects YTM history In order for multi-scrobbler to accurately determine if a song has been scrobbled it needs a source of truth. For YTM this is a \"history\" list scraped from the YTM website. Unfortunately, the data in this list can be (often) inconsistent which makes it hard for multi-scrobbler to \"trust\" that it is correct and determine when/if new scrobbles occur. This inconsistency is not something multi-scrobbler can control -- it is a side-effect of having to use an unofficial method to access YTM (scraping). To compensate for this multi-scrobbler resets when it considers this list the \"source of truth\" based on if the list changes in an inconsistent way between consecutive checks. New scrobbles can only be detected when this list is \"OK\" as a source of truth for N+1 checks. Therefore, any new tracks that appear when the list is inconsistent will be ignored. Duplicate scrobbles can also occur if the change between two checks is technically consistent. For instance, if you listen to a track twice in some period, separated by other music, YTM will sometimes \"remove\" the track from the earlier time (further down in your history) and \"re-add\" it at the top of the history. Reporting YTM scrobble issues​ If you experience scrobble detection issues you can help improve MS's YTM heureistic by providing thorough feedback as an issue. Please do the following to provide the most useful report: Turn on Change Detection​ In your YTM configuration (ytmusic.json) add logDiff under options like this: { \"type\": \"ytmusic\", \"name\": \"MyYTM\", \"data\": { ... }, \"options\": { \"logDiff\": true } } or set either ENVs: YTM_LOG_DIFF=true DEBUG_MODE=true This will cause MS to log YTM history changes similar to this: [Ytmusic - MyYTM] Changes from last seen list: 1. (tuhe1CpHRxY) KNOWER - I’m The President --- undefined => Moved - Originally at 6 2. (Mtg8V6Xa2nc) Vulfpeck - Romanian Drinking Song --- Schvitz => Moved - Originally at 1 3. (rxbCaiyYSXM) Nightmares On Wax - You Wish --- In A Space Outta Sound => Moved - Originally at 2 4. (tMt_YXr90AM) Gorillaz - O Green World --- undefined => Moved - Originally at 3 ... Which are essential to troubleshooting this behavior. Turn on File Logging​ Optionally, if your logs are busy due to many other sources, you can log only YTM logs to a file. Turn this on with the logToFile config option: { \"type\": \"ytmusic\", \"name\": \"MyYTM\", \"data\": { ... }, \"options\": { \"logDiff\": true, \"logToFile\": true } } This will cause MS to write YTM logs to a file in your logs folder named ytmusic-MyYTM.log (based on your source name). Provide Detail and Context​ Provide a detailed account of how you were using YTM when the issue occurred, including things like: the platform listening on (desktop, mobile, 3rd party client, etc...) any changes in platform I switched from desktop to listening on my phone... how you were listening to music I was playing an album start to finish I listened to two songs in a row, then browsed for a new song in library by artist, then went back to a song in the queue... Explain the expected behavior (it should have scrobbled songs x, y, then z) and what actually happened (it scrobbled songs x, then y, then x again, then z) Provide ALL logs from the time when the issue occurred including logs from BEFORE (ideally 2-3 minutes of logs) and AFTER the issue.","s":"Youtube Music misses or duplicates scrobbles","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-misses-or-duplicates-scrobbles","p":369},{"i":392,"t":"tip For the difference between ENV and File examples in this document see Configuration Types.","s":"Overview","u":"/multi-scrobbler/installation/","h":"","p":391},{"i":394,"t":"Cross-platform images are built for x86 (Intel/AMD) and ARM64 (IE Raspberry Pi) Available Images Dockerhub Github Packages Repository Page docker.io/foxxmd/multi-scrobbler:latest Repository Page ghcr.io/foxxmd/multi-scrobbler:latest Or use the example docker-compose.yml, found in the repo, after modifying it to fit your configuration: docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones #- JELLYFIN_APIKEY= #- JELLYFIN_URL= #- JELLYFIN_USER= #- MALOJA_URL=http://maloja:42010 #- MALOJA_API_KEY= #- PUID=1000 # required if running docker on linux host, see main README Docker setup instructions #- PGID=1000 # required if running docker on linux host, see main README Docker setup instructions # set if using a source/client with redirect URI that you have not explicitly set and MS is NOT running on the same machine that you will view the dashboard from # EX: You will view MS dashboard at 'http://192.168.0.101:9078' -> set BASE_URL=http://192.168.0.101:9078 #- BASE_URL=http://MyHostIP:9078 volumes: - \"./config:/config\" #networks: # - (optional to add container to the same bridge network that maloja is inside to be able to use docker internal networking & dns to resolve and connect to maloja URL via http://maloja:port) ports: - 9078:9078 # first port is the HOST port multi-scrobbler will serve UI and API on restart: unless-stopped Recommended configuration steps for docker or docker-compose usage: Storage​ You should bind a host directory into the container for storing configurations and credentials. Otherwise, these will be lost when the container is updated. Example Docker Docker Compose Using -v method for docker: docker run ... -v \"$(pwd)/config:/config\" foxxmd/multi-scrobbler Using docker-compose: docker-compose.yml services: multi-scrobbler: # ... volumes: - \"./config:/config\" Networking​ If you are using a bridge network (default docker setup) you must map a port to the container in order to access the dashboard and use MS with some sources (Webscrobbler, LFM/LZ Endpoints). The default container port is 9078. Example Docker Docker Compose Docker run publish options: docker run ... -p 9078:9078 foxxmd/multi-scrobbler docker-compose: docker-compose.yml services: multi-scrobbler: # ... ports: - \"9078:9078\" Base URL​ Optionally, when using a Source or Client that has a \"Redirect URI\" that you have not explicitly defined and using a bridge network or installing MS on a different machine than the one used to view the dashboard set the Base URL as the IP of the host machine. (This is the IP you would use to view the dashboard in a browser) Example Docker Docker Compose docker run ... -e BASE_URL=\"http://hostMachineIP\" foxxmd/multi-scrobbler docker-compose: docker-compose.yml services: multi-scrobbler: # ... environment: - BASE_URL=http://hostMachineIP Other​ (Optionally) set the timezone for the container using the environmental variable TZ (docker) (docker-compose) Linux Host​ info If you are running this container with Docker on a Linux Host you must specify user:group permissions of the user who owns the configuration directory on the host to avoid docker file permission problems. These can be specified using the environmental variables PUID and PGID. To get the UID and GID for the current user run these commands from a terminal: id -u -- prints UID id -g -- prints GID","s":"Docker","u":"/multi-scrobbler/installation/","h":"#docker","p":391},{"i":396,"t":"tip See the Quick Start Guide for another guided docker-compose example The example scenario: Jellyfin Source Maloja Client Serving app on port 9078 Docker container located on a different IP (192.168.0.100) so use Base URL Config/data directory on host machine in a directory next to docker-compose.yml Linux uid/gid is 1000:1000 Docker Docker Compose ENV File docker run --name multi-scrobbler -e \"JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c\" -e \"JELLYFIN_URL=192.168.0.101:8096\" -e \"JELLYFIN_USER=MyUser\" -e \"BASE_URL=192.168.0.100\" -e \"MALOJA_URL=http://domain.tld\" -e \"MALOJA_API_KEY=1234\" -e \"PUID=1000\" -e \"PGID=1000\" -p 9078:9078 -v /home/myUser/ms:/config foxxmd/multi-scrobbler docker run --name multi-scrobbler -e \"PUID=1000\" -e \"PGID=1000\" -e \"BASE_URL=192.168.0.100\" -p 9078:9078 -v \"$(pwd)/config:/config\" foxxmd/multi-scrobbler See docker-compose.yml sample above for more options and annotations. docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c - JELLYFIN_URL=192.168.0.101:8096 - JELLYFIN_USER=MyUser - BASE_URL=http://192.168.0.100:9078 - MALOJA_URL=http://domain.tld:42010 - MALOJA_API_KEY=1234 - PUID=1000 - PGID=1000 volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped","s":"Docker Usage Example","u":"/multi-scrobbler/installation/","h":"#docker-usage-example","p":391},{"i":398,"t":"After installation see service.md to configure multi-scrobbler to run automatically in the background.","s":"Local Installation","u":"/multi-scrobbler/installation/","h":"#local-installation","p":391},{"i":400,"t":"Clone this repository somewhere and then install from the working directory git clone https://github.com/FoxxMD/multi-scrobbler.git . cd multi-scrobbler nvm use # optional, to set correct Node version npm install npm run docs:install && npm run build npm run start Rollup build error​ During building if you encounter an error like: Your current platform \"XXX\" and architecture \"XXX\" combination is not yet supported by the native Rollup build. Modify overrides in package.json to use @rollup/wasm-node as a drop-in replacement for rollup: \"overrides\": { \"spotify-web-api-node\": { \"superagent\": \"$superagent\" } \"vite\": { \"rollup\": \"npm:@rollup/wasm-node@^4.9.6\" } } See this issue for more detail. Usage Examples​ ENV File JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c JELLYFIN_URL=192.168.0.101:8096 JELLYFIN_USER=MyUser MALOJA_URL=\"http://domain.tld\" node src/index.js ./config/config.json ./config/config.json { \"sources\": [ { \"type\": \"jellyfin\", \"clients\": [\"myConfig\"], \"name\": \"myJellyfinSource\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"url\": \"http://192.168.0.101:8096\", \"user\": \"MyUser\" } } ], \"clients\": [ { \"type\": \"maloja\", \"name\": \"myConfig\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ], } npm run start tip The web UI and API is served on port 9078. This can be modified using the PORT environmental variable.","s":"Nodejs","u":"/multi-scrobbler/installation/","h":"#nodejs","p":391},{"i":402,"t":"Unsupported Flatpak/Flathub installs are no longer supported. You can still build MS as a Flatpak app from source. See more information about Flatpak EOL.","s":"Flatpak","u":"/multi-scrobbler/installation/","h":"#flatpak","p":391},{"i":404,"t":"Systemd is system and service manager that is used by most popular linux distros including Ubuntu, Fedora, Pop!_OS, Debian, and Arch. This setup will create a user service that runs on login.","s":"Systemd","u":"/multi-scrobbler/installation/service/","h":"","p":403},{"i":406,"t":"Create a new service file for multi-scrobbler under your HOME config: mkdir -p ~/.config/systemd/user touch ~/.config/systemd/user/multi-scrobbler.service In a text editor add contents below to the file you created, multi-scrobbler.service: [Unit] Description=multi-scrobbler After=network.target [Service] Type=simple WorkingDirectory=/path/to/multi-scrobbler/directory ExecStart=npm run start Restart=no [Install] WantedBy=default.target","s":"Create A Unit File","u":"/multi-scrobbler/installation/service/","h":"#create-a-unit-file","p":403},{"i":408,"t":"Save the file then run: systemctl daemon-reload systemctl --user enable multi-scrobbler.service systemctl --user start multi-scrobbler.service This will scan for new services and pickup our multi-scrobbler user service enable the service to run at login automatically start the service now","s":"Start the Service","u":"/multi-scrobbler/installation/service/","h":"#start-the-service","p":403},{"i":410,"t":"Open a PR if you would like to document setting up multi-scrobbler for other service managers!","s":"Other Service Methods","u":"/multi-scrobbler/installation/service/","h":"","p":403},{"i":412,"t":"This guide will get you up and running with multi-scrobbler using Docker and docker compose. At the end of the guide you will have: the dashboard served on port 9078 of a host machine which has an IP of 192.168.0.100 data saved to the same directory as the docker-compose.yml file multi-scrobbler monitoring Spotify, Jellyfin, Navidrome, Plex, and/or Last.fm for listening activity multi-scrobbler scrobbling to Lastfm, Maloja, and/or Koito note If the multi-scrobbler container is on the same machine you will be viewing the dashboard from (IE localhost) you can remove and ignore BASE_URL usage below. Additionally, replace usage of 192.168.0.100 with localhost.","s":"Quickstart","u":"/multi-scrobbler/quickstart/","h":"","p":411},{"i":414,"t":"Create a new folder for multi-scrobbler related data and then create docker-compose.yml with this content: ~/msData/docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - BASE_URL=http://192.168.0.100:9078 # all Environmental Variables in below examples go here! volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped","s":"Create Docker Compose File","u":"/multi-scrobbler/quickstart/","h":"#create-docker-compose-file","p":411},{"i":416,"t":"Sources are the services/music players multi-scrobbler monitors to look for listening activity. Jellyfin Spotify Navidrome Plex Last.fm Follow the Jellyfin configuration instructions for setting up an API Key. Then, add these values to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - JELLYFIN_URL=192.168.0.110:8096 # URL to Jellyfin UI - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b # Api Key created in previous step - JELLYFIN_USER=MyUser # Your username in Jellyfin To access your Spotify activity you must create a Spotify App to get a Client ID/Secret and set a valid Redirect URI. Refer to the Spotify Authentication instructions in the docs. Assuming you used the HTTPS method for your Redirect URI from the instructions above...after the application is created add these values to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - SPOTIFY_CLIENT_ID=yourClientId - SPOTIFY_CLIENT_SECRET=yourClientSecret - SPOTIFY_REDIRECT_URI=https://multi-scrobbler.mydomain.com/callback Later, after starting multi-scrobbler, visit the dashboard at http://192.168.0.100:9078 and click (Re)authenticate on the Spotify card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete. Navidrome supports scrobbling using Listenbrainz. You should use this, rather than a Subsonic Source because Navidrome's internal scrobbling functionality supports providing multiple artists and offline scrobbling while the Subsonic Source does not. To setup Navidrome to scrobble to multi-scrobbler via the Listenbrainz option: Create Listenbrainz Endpoint Source​ Create a new Listenbrainz Endpoint Source in multi-scrobbler by creating a token to use with the endpoint via ENV Config in environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - LZE_TOKEN=myCoolToken The token can be anything. (Re)start multi-scrobbler after making this change. Configure Navidrome​ Set the ListenBrainz.BaseURL (env ND_LISTENBRAINZ_BASEURL) to http://myMultiScrobblerIP:9078/1/ in your Navidrome installation. Assuming you are using the docker installation, modify environment to add: docker-compose.yml - ND_LISTENBRAINZ_BASEURL=http://192.168.0.100:9078/1/ Restart Navidrome after making this change. Then, follow the directions for enabling Listenbrainz scrobbling in Navidrome. The Listenbrainz user token is the token you created for LZE_TOKEN earlier. Find your Plex Token and make note of the URL and Port used to connect to your Plex instance. Add these values to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - PLEX_URL=http://192.168.0.101:32400 - PLEX_TOKEN=6c0ihz8j7__f5r18oa0zm8 # optional, restrict scrobbling to a list of comma-delimited users #- PLEX_USERS_ALLOW=myPlexUsername Restart multi-scrobbler to create the new Source. You may wish to refer to the User and Library defaults/filtering in the Plex Source docs for a more granular setup. If you are already scrobbling to Last.fm and wish to mirror your scrobbling activity to one or more other Clients, use this Source. If, instead, you want to scrobble from multi-scrobbler to Last.fm then see the Last.fm tab in the Setup Clients section below. Register for an API account at Last.fm. Use the following for Callback URL: http://192.168.0.100:9078/lastfm/callback After account creation make note of the Api Key and Secret that are displayed. Create a new File named lastfm.json in the ./config directory that will be used with your docker-compose.yml stack and copy the below contents, replacing placeholders with the data you got from Last.fm API account creation: ~/msData/config/lastfm.json [ { \"name\": \"myLastFmSource\", \"configureAs\": \"source\", \"data\": { \"apiKey\": \"MY_API_KEY_PLACEDHOLDER\", \"secret\": \"MY_SECRET_PLACEHOLDER\", \"redirectUri\": \"http://192.168.0.100:9078/lastfm/callback\" } } ] Later, after starting multi-scrobbler, visit the dashboard at http://192.168.0.100:9078 and click (Re)authenticate on the Last.fm (Source) card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete.","s":"Setup Sources","u":"/multi-scrobbler/quickstart/","h":"#setup-sources","p":411},{"i":418,"t":"Multi-scrobbler can use Musicbrainz to match activity from your Sources in order to fill in missing data, or correct/normalize existing data, before it is scrobbled to the Clients below. This step is optional. Musicbrainz Setup Instructions Configure Musicbrainz API note This step only needs to be performed once regardless of how many Sources you want to use Musicbrainz for. You must provide a way for Musicbrainz to contact you. Add these value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml # an email or personal website musicbrainz can use to contact you - MB_CONTACT=myCoolName@emailProvider.com # how musicbrainz searches and selects matches - MB_PRESETS=sensible,native Presets are found here. Enable Musicbrainz For A Source Musicbrainz can be enabled for multiple Sources. Follow the directions in each tab to enable it for that Source. Jellyfin Spotify Navidrome Plex Last.fm Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - JELLYFIN_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - SPOTIFY_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - LZE_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - PLEX_TRANSFORMS=musicbrainz Modify the lastfm.json file you created in the Setup Sources step to add the highlighted section in the example below. The comma at the top highlighted section is important! ~/msData/config/lastfm.json [ { \"name\": \"myLastFmSource\", \"configureAs\": \"source\", \"data\": { \"apiKey\": \"MY_API_KEY_PLACEDHOLDER\", \"secret\": \"MY_SECRET_PLACEHOLDER\", \"redirectUri\": \"http://192.168.0.100:9078/lastfm/callback\" }, \"options\": { \"playTransform\": { \"preCompare\": { \"type\": \"musicbrainz\" } } } } ]","s":"(Optional) Correct Scrobbles with Musicbrainz","u":"/multi-scrobbler/quickstart/","h":"#optional-correct-scrobbles-with-musicbrainz","p":411},{"i":420,"t":"note This step only needs to be performed once regardless of how many Sources you want to use Musicbrainz for. You must provide a way for Musicbrainz to contact you. Add these value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml # an email or personal website musicbrainz can use to contact you - MB_CONTACT=myCoolName@emailProvider.com # how musicbrainz searches and selects matches - MB_PRESETS=sensible,native Presets are found here.","s":"Configure Musicbrainz API","u":"/multi-scrobbler/quickstart/","h":"","p":411},{"i":422,"t":"Musicbrainz can be enabled for multiple Sources. Follow the directions in each tab to enable it for that Source. Jellyfin Spotify Navidrome Plex Last.fm Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - JELLYFIN_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - SPOTIFY_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - LZE_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - PLEX_TRANSFORMS=musicbrainz Modify the lastfm.json file you created in the Setup Sources step to add the highlighted section in the example below. The comma at the top highlighted section is important! ~/msData/config/lastfm.json [ { \"name\": \"myLastFmSource\", \"configureAs\": \"source\", \"data\": { \"apiKey\": \"MY_API_KEY_PLACEDHOLDER\", \"secret\": \"MY_SECRET_PLACEHOLDER\", \"redirectUri\": \"http://192.168.0.100:9078/lastfm/callback\" }, \"options\": { \"playTransform\": { \"preCompare\": { \"type\": \"musicbrainz\" } } } } ]","s":"Enable Musicbrainz For A Source","u":"/multi-scrobbler/quickstart/","h":"","p":411},{"i":424,"t":"Clients are services that store scrobbles. Multi-scrobbler will scrobble all listening activity from the Sources you configured to all Clients you configure here. Maloja Last.fm Koito Setup a Maloja server if you have not already done this. Maloja Setup Intructions Using Maloja's example docker-compose.yml: ~/malojaData/docker-compose.yml loading... View on GitHub Uncomment environment and add MALOJA_FORCE_PASSWORD=CHANGE_ME to set an admin password Start the container: ~/malojaData docker compose up -d Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at http://192.168.0.100:42010/admin_apikeys) Create a New Key and then copy the generated key value Finally, add these values to the environment section in the docker-compose.yml you created for multi-scrobbler earlier. ~/msData/docker-compose.yml - MALOJA_URL=http://192.168.0.100:42010 - MALOJA_API_KEY=myApiKey Register for an API account at Last.fm. Use the following for Callback URL: http://192.168.0.100:9078/lastfm/callback After account creation use the displayed information and add these values to the environment section in the docker-compose.yml you created for multi-scrobbler earlier. ~/msData/docker-compose.yml - LASTFM_API_KEY=myApiKey - LASTFM_SECRET=myApiSecret Setup a Koito server if you have not already done this. Create (or get) an API Key From your Koito server dashboard navigate to Settings (bottom-left icon) => API Keys Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key EX pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL Take note of your Koito username (used below as myUser) Determine your Koito URL This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance. EX dashboard at http://192.168.0.100:4110 => replace myURL below with http://192.168.0.100:4110 More info on the URL to use is the full docs Add/Substitute values above into these examples values and add them to the environment section in the docker-compose.yml you created for multi-scrobbler earlier. ~/msData/docker-compose.yml - KOITO_TOKEN=myToken - KOITO_USER=myUser - KOITO_URL=myURL tip Ensure that Koito is configured to allow requests from multi-scrobbler! In Koito config set KOITO_ALLOWED_HOSTS to the IP the multi-scrobbler dashboard is accessible from.","s":"Setup Clients","u":"/multi-scrobbler/quickstart/","h":"#setup-clients","p":411},{"i":426,"t":"tip If you are running your multi-scrobbler container on a Linux host see these instructions for setting proper file permissions. From the same directory as the docker-compose.yml you created earlier start the container: ~/msData docker compose up -d You're done! Multi-scrobbler is now running. It will monitor the sources you configured and scrobble to clients you set up. Visit http://192.168.0.100:9078 to see the dashboard where configured Sources/Clients show current status and authentication options display statistics about discovered/scrobbled tracks and Now Playing status a real-time log shows multi-scrobbler's activity","s":"Start Multi-Scrobbler","u":"/multi-scrobbler/quickstart/","h":"#start-multi-scrobbler","p":411},{"i":428,"t":"See more advanced docker options as well as other install methods in the Installation docs Review the Configuration docs Learn about how to configure multi-scrobbler using files for more complicated Source/Client scenarios See all available Sources and Clients alongside configuration examples Learn how to set up notification webhooks Check out the kitchensink example Setup Scrobble Enhancements with Musicbrainz to automatically correct and fill in missing track information for your scrobbles Consult the FAQ for solutions to common problems","s":"Next Steps","u":"/multi-scrobbler/quickstart/","h":"#next-steps","p":411},{"i":430,"t":"A javascript app to scrobble music you listened to, to Maloja, Last.fm, ListenBrainz, and Koito. Supports scrobbling from many Sources Azuracast Deezer Google Cast (Chromecast) Icecast Jellyfin JRiver Kodi Koito Last.fm Last.fm (Endpoint) ListenBrainz ListenBrainz (Endpoint) Maloja Mopidy MPD (Music Player Daemon) MPRIS (Linux Desktop) Musikcube Plex Rocksky Spotify Subsonic-compatible APIs (like Airsonic and Navidrome) teal.fm WebScrobbler VLC Yamaha MusicCast Youtube Music Supports scrobbling to many Clients Koito Last.fm ListenBrainz Maloja Rocksky teal.fm Enhance/correct scrobble data with search patterns, built-in corrections, or the Musicbrainz database Monitor status of Sources and Clients using webhooks (Gotify, Ntfy, Apprise) or healthcheck endpoint Supports Now Playing for scrobble Clients Supports configuring for single or multiple users (scrobbling for your friends and family!) Web server interface for stats, basic control, and detailed logs Graceful network and client failure handling (queued scrobbles that auto-retry) Smart handling of credentials (persistent, authorization through app) Easy configuration through ENVs or JSON Install using Docker images for x86/ARM or locally with NodeJS Quick Start Guide Why should I use this over a browser extension and/or mobile app scrobbler? Platform independent -- Because multi-scrobbler communicates directly with service APIs it will scrobble everything you play regardless of where you play it. No more need for apps on every platform you use! Open-source -- Get peace of mind knowing exactly how your personal data is being handled. Track your activity regardless of where you listen -- Scrobble from many Sources to one Client with ease and without duplicating tracks. Manage scrobbling for others -- Scrobble for your friends and family without any setup on their part. Easily silo sources to specific clients to keep plays separate. Standardize your data -- Match your scrobbles with the Musicbrainz database to ensure scrobbled data is as correct and rich as possible. But I already scrobble my music to Last.fm/ListenBrainz, is multi-scrobbler for me? Yes! You can use Last.fm as a Source or Listenbrainz as a Source to forward scrobbles from your profile to any other Client! That way you can keep your current scrobble setup as-is but still get the benefit of capturing your data to a self-hosted location. Use the Last.fm tab in the Quickstart Sources to get started.","s":"Overview","u":"/multi-scrobbler/","h":"","p":429},{"i":432,"t":"You set up configurations for one or more Sources and one or more Clients. MS monitors all of your configured Sources. When new tracks are played by a Source MS grabs that information and then sends it (scrobbles it) to all Clients that Source is configured to forward to.","s":"How Does multi-scrobbler (MS) Work?","u":"/multi-scrobbler/","h":"#how-does-multi-scrobbler-ms-work","p":429},{"i":434,"t":"A Source is a data source that contains information about music you are playing or have listened to, like a desktop player, web music player, or cloud music service. Examples are Spotify, Jellyfin, Plex, Youtube Music, Navidrome, etc... Source configurations consist of: A friendly name. Any data needed to communicate or authenticate with the Source. An optional list of Client names that the Source should scrobble to. If omitted the Source also scrobbles to all configured Clients.","s":"Source","u":"/multi-scrobbler/","h":"#source","p":429},{"i":436,"t":"A Client is an application that stores the historical information about what music you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz... Client configurations consist of: A friendly name. Any data needed to communicate or authenticate with the Client.","s":"Client","u":"/multi-scrobbler/","h":"#client","p":429},{"i":438,"t":"See the Quick Start Guide","s":"Quick Start","u":"/multi-scrobbler/","h":"#quick-start","p":429},{"i":440,"t":"See the Installation documentation","s":"Installation","u":"/multi-scrobbler/","h":"#installation","p":429},{"i":442,"t":"See the Configuration documentation","s":"Configuration","u":"/multi-scrobbler/","h":"#configuration","p":429},{"i":444,"t":"A status page with statistics, recent logs, and some runtime configuration options can be found at http://localhost:9078 Output is also provided to stdout/stderr as well as file if specified in configuration. On first startup you may need to authorize Spotify and/or Last.fm by visiting the callback URL (which can also be accessed from the status page). Visit the status page above to find the applicable link to trigger this.","s":"Usage","u":"/multi-scrobbler/","h":"#usage","p":429},{"i":446,"t":"Having issues with connections or configuration? Check the FAQ before creating an issue!","s":"Help/FAQ","u":"/multi-scrobbler/","h":"#helpfaq","p":429},{"i":448,"t":"Detailed architecture and development guides for Sources/Clients","s":"Development","u":"/multi-scrobbler/","h":"#development","p":429},{"i":450,"t":"MIT","s":"License","u":"/multi-scrobbler/","h":"#license","p":429},{"i":453,"t":"Currently, multi-scrobbler does not have any databases or dependencies that require additional interaction/consideration when updating. The majority of major/minor version releases introduce only new functionality but occasionally may also include breaking changes in behavior or configuration. These changes, and how to update configs accordingly, are detailed in Github Release Notes. It is recommended to check this page before upgrading. Alternatively, multi-scrobbler version can be pinned using git tags or docker image tags that match release versions IE foxxmd/multi-scrobbler:0.9.7","s":"Updating","u":"/multi-scrobbler/updating/","h":"#updating","p":451},{"i":455,"t":"Docker Docker Compose docker image pull foxxmd/multi-scrobbler:latest docker container stop multi-scrobbler docker container rm multi-scrobbler docker run --name multi-scrobbler ... The last command is the same as the command used to initialy run multi-scrobbler. docker compose pull docker compose up -d","s":"Docker","u":"/multi-scrobbler/updating/","h":"#docker","p":451},{"i":457,"t":"Assuming the repository was used for initial installation with git clone, update by pulling the latest commit: git pull and restart multi-scrobbler.","s":"Nodejs","u":"/multi-scrobbler/updating/","h":"#nodejs","p":451}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/2",[0,4.227,1,3.954,2,6.351,3,4.329,4,1.357]],["t/4",[0,1.663,4,1.47,5,0.81,6,1.601,7,0.679,8,1.899,9,1.314,10,2.261,11,3.765,12,2.177,13,2.735,14,1.429,15,1.548,16,2.607,17,2.247,18,3.359,19,1.447,20,1.464,21,0.685,22,1.335,23,1.685,24,1.877,25,1.64,26,1.224,27,1.877,28,2.168,29,1.05,30,1.11,31,0.524,32,1.532,33,1.144,34,1.412,35,1.558,36,1.388,37,1.962,38,1.224,39,2.96,40,2.346,41,1.017,42,2.408,43,1.233,44,2.948,45,1.81,46,2.263,47,4.195,48,4.195,49,1.079,50,1.05,51,0.645,52,0.317,53,0.561,54,1.11,55,1.182,56,0.998,57,1.685,58,1.685,59,1.877,60,2.96,61,1.182,62,0.874,63,1.388,64,0.841,65,2.735,66,3.833,67,1.556,68,3.765,69,1.047,70,2.09,71,1.877,72,1.118,73,1.704,74,2.37,75,2.774,76,1.996,77,3.146,78,3.206,79,2.222,80,3.206,81,1.717,82,3.206,83,3.206,84,1.606,85,1.625,86,1.135,87,1.17,88,1.464,89,2.481,90,0.825,91,1.325,92,1.144,93,1.182,94,1.144,95,2.171,96,1.685,97,1.954,98,1.59,99,1.59,100,2.877,101,1.29,102,3.501,103,3.206,104,1.036,105,1.359,106,0.81,107,0.857,108,1.325,109,1.224,110,1.877,111,1.685,112,1.877,113,1.685,114,1.685,115,1.422,116,1.111,117,0.524,118,2.263,119,2.263,120,2.263,121,2.37,122,1.842,123,2.877,124,1.464,125,1.685,126,1.877,127,1.685,128,1.877,129,0.504,130,1.202,131,1.144,132,1.464,133,1.685,134,1.877,135,0.707,136,0.696,137,1.685,138,1.182,139,1.05,140,0.696,141,1.685,142,2.515,143,1.685,144,1.558,145,1.464,146,1.558,147,2.481,148,1.877,149,1.685,150,1.05,151,1.877,152,1.558,153,1.685,154,1.685,155,3.102,156,2.877,157,2.877,158,2.877,159,1.685,160,2.661,161,1.877,162,1.111,163,1.464,164,1.05,165,1.464,166,1.224,167,1.685,168,1.558,169,1.877,170,0.81,171,1.877,172,2.499,173,1.663,174,2.37,175,1.685,176,1.746,177,1.558,178,1.558,179,1.685,180,1.877,181,1.685,182,1.877,183,0.974,184,0.874,185,1.558,186,1.388]],["t/6",[4,1.638,5,1.149,6,2.066,7,0.64,19,1.668,34,1.627,72,2.428,76,2.8,89,4.116,107,3.178,130,1.686,187,3.792,188,2.465,189,5.19,190,5.361,191,6.247,192,2.898,193,4.913]],["t/8",[4,0.929,5,0.467,6,1.252,7,0.83,8,3.027,9,1.958,10,2.893,13,4.819,14,0.723,15,1.608,21,2.036,25,1.101,41,0.986,43,0.86,44,1.613,49,2.148,52,1.399,53,1.452,56,1.987,60,1.707,73,1.987,77,1.814,81,1.53,92,2.279,104,1.541,105,1.584,117,0.833,119,2.639,121,2.764,122,3.204,129,1.003,147,3.943,164,3.118,176,2.037,194,6.668,195,2.211,196,3.739,197,2.363,198,3.739,199,2.437,200,3.103,201,2.764,202,2.211,203,2.639,204,4.122,205,3.511,206,3.399,207,2.09,208,5.576,209,1.777,210,2.512,211,2.531,212,3.775,213,4.628,214,2.497,215,3.739,216,3.831,217,3.739,218,3.775,219,2.148,220,3.739,221,3.739,222,2.211,223,3.739,224,3.739,225,1.896,226,2.279,227,3.103,228,1.741,229,2.597,230,2.531,231,2.915,232,2.354,233,1.814,234,3.399,235,2.764,236,1.94,237,3.355,238,1.741,239,2.639,240,1.674,241,2.437,242,3.739,243,3.739,244,3.739,245,4.122,246,3.739,247,3.739,248,1.987,249,1.854,250,1.854,251,3.739]],["t/10",[12,4.17,52,1.355,89,4.752,130,1.947,252,5.441,253,5.672,254,4.271]],["t/12",[4,1.37,7,0.807,9,1.454,16,2.208,17,1.806,22,2.286,28,2.136,41,0.562,43,0.847,44,2.369,67,3.994,69,1.544,76,2.208,81,2.246,87,2.004,122,3.154,129,1.963,131,3.346,162,2.49,238,2.557,255,2.327,256,6.452,257,2.459,258,5.808,259,4.927,260,4.557,261,7.386,262,4.28,263,5.704,264,4.607,265,2.722,266,3.216,267,3.875,268,3.579,269,3.154,270,2.784,271,5.49,272,4.927,273,5.49,274,5.49,275,5.49,276,5.49,277,5.49,278,5.49,279,5.49,280,5.49,281,5.49,282,5.49,283,5.49,284,5.49,285,5.49]],["t/14",[0,1.897,4,1.397,5,0.274,7,0.796,8,2.333,9,1.743,10,2.126,14,1.591,15,1.672,17,0.722,19,1.289,25,1.937,31,1.701,34,1.334,37,0.868,41,1.027,43,1.077,44,2.367,45,2.029,49,2.701,50,1.227,51,1.257,52,1.11,53,1.152,54,1.298,66,3.243,68,1.97,69,1.697,70,1.431,92,1.338,101,2.451,104,0.375,106,2.84,117,0.761,129,0.981,130,0.531,206,1.338,210,1.771,229,1.703,250,1.813,255,0.93,257,0.983,266,0.965,270,1.113,286,8.571,287,1.638,288,5.359,289,1.261,290,2.988,291,1.821,292,3.657,293,1.482,294,4.926,295,1.088,296,1.821,297,1.97,298,1.022,299,3.657,300,6.264,301,3.603,302,2.384,303,1.496,304,1.97,305,1.431,306,2.194,307,1.67,308,3.657,309,4.552,310,2.229,311,2.384,312,2.235,313,7.382,314,3.476,315,2.582,316,3.657,317,3.657,318,3.162,319,4.064,320,2.194,321,2.194,322,1.195,323,2.194,324,2.194,325,2.78,326,1.486,327,0.883,328,1.821,329,1.549,330,2.194,331,1.431,332,3.657,333,3.657,334,2.194,335,0.983,336,1.821,337,2.194,338,1.298,339,2.194,340,2.194,341,2.866,342,1.821,343,1.549,344,2.194,345,2.476,346,2.194,347,2.194,348,2.194,349,2.194,350,1.166,351,1.711,352,2.194,353,1.738,354,2.194,355,3.657]],["t/16",[3,3.279,4,1.028,5,0.771,7,0.726,9,1.634,25,1.816,35,5.121,41,0.971,105,2.615,115,2.263,116,1.634,129,2.337,130,1.913,141,5.538,238,4.056,268,4.023,318,4.097,356,5.346,357,6.187,358,6.479,359,5.148,360,6.17,361,5.838,362,3.129,363,5.538,364,6.17,365,6.17,366,5.538,367,2.817,368,4.81]],["t/18",[5,1.045,7,0.769,9,1.792,15,1.375,16,2.721,32,2.469,56,3.594,86,2.395,87,2.469,116,1.792,143,6.07,147,3.999,233,3.283,239,4.774,293,2.133,335,3.029,369,3.215,370,3.782,371,5.922,372,5.614,373,6.764,374,3.999,375,3.685,376,3.215,377,8.153,378,6.764,379,4.123,380,6.764,381,4.579]],["t/20",[5,0.971,6,1.746,52,1.311,53,1.362,90,3.417,166,5.069,176,4.236,382,4.598,383,6.979,384,3.417,385,4.132,386,3.128]],["t/22",[4,1.078,5,0.901,6,1.207,14,1.253,15,0.724,19,1.656,25,1.048,34,1.027,41,1.049,43,1.113,52,1.092,53,1.134,64,1.595,76,1.432,85,1.805,86,1.261,90,2.846,104,1.391,129,1.442,130,1.747,131,2.17,136,2.401,147,4.265,162,1.911,166,5.308,167,3.196,168,5.987,170,2.319,172,5.624,173,3.743,174,3.974,175,3.196,176,4.219,177,2.955,178,5.375,179,3.196,181,3.196,183,1.847,184,1.658,185,2.955,186,2.632,189,3.947,225,1.805,239,2.513,288,3.794,318,4.018,335,1.595,375,1.94,381,2.411,384,2.846,387,3.196,388,5.048,389,2.955,390,4.222,391,2.632,392,1.892,393,2.955,394,2.242,395,5.375,396,3.561,397,3.561,398,3.561,399,3.561,400,4.461,401,3.794,402,4.824,403,3.561,404,3.561,405,3.561,406,3.561,407,3.561,408,4.824,409,3.561,410,5.375,411,4.461,412,3.974,413,3.561,414,3.561,415,3.561,416,3.561,417,3.561]],["t/24",[3,3.088,5,0.726,7,0.534,11,6.817,13,3.788,19,1.138,31,1.622,39,3.088,81,2.377,86,2.057,102,4.101,104,0.992,108,4.101,162,1.539,176,3.165,190,3.658,193,4.101,228,2.706,257,3.402,295,2.881,305,3.788,343,4.101,384,2.554,386,2.337,390,4.952,400,4.822,418,7.448,419,5.81,420,5.017,421,4.529,422,4.822,423,9.312,424,3.658,425,4.295,426,5.215,427,7.595,428,4.63,429,7.595,430,4.529,431,5.81,432,3.934,433,5.81,434,5.81,435,4.822,436,4.822,437,5.215,438,2.419,439,2.706]],["t/26",[6,1.746,34,1.486,42,3.774,43,1.2,197,3.295,301,4.598,440,3.483,441,6.979,442,3.417,443,5.264,444,2.199,445,3.55]],["t/28",[41,1.046,42,3.701,104,1.303,197,3.232,444,2.157,445,3.482,446,4.382,447,4.51,448,4.51,449,4.972]],["t/31",[6,1.511,34,1.861,52,1.134,53,1.178,62,3.132,99,3.335,174,4.972,230,4.554,248,3.574,288,4.747,290,3.664,307,3.071,312,3.197,369,3.197,391,6.698,392,3.574,450,6.726,451,6.92,452,6.036,453,5.582,454,5.243,455,4.972,456,3.76,457,6.726,458,4.235,459,5.243,460,6.726,461,6.726,462,6.036]],["t/33",[4,1.009,5,1.078,6,2,7,0.654,9,1.108,14,1.377,15,1.231,25,1.783,32,1.527,34,1.36,39,2.223,41,1.006,52,1.021,53,1.061,69,1.278,85,2.121,90,1.839,94,2.55,104,1.333,106,1.805,115,2.04,116,1.108,117,0.523,129,1.625,130,1.013,132,3.261,172,3.261,213,3.472,214,1.874,245,3.093,252,2.832,254,3.783,255,1.773,269,2.404,287,2.712,335,1.874,362,4.514,369,1.988,377,5.435,385,2.223,386,1.683,401,5.024,428,3.691,444,2.668,446,5.238,463,2.279,464,1.883,465,3.581,466,2.474,467,3.142,468,4.184,469,4.184,470,2.953,471,1.805,472,2.474,473,3.609,474,3.093,475,2.832,476,3.093,477,4.184,478,2.55,479,3.755,480,6.056,481,2.521,482,2.03,483,4.184]],["t/35",[0,2.186,4,0.702,5,0.526,7,0.82,14,0.815,17,1.386,31,1.176,32,3.031,34,1.163,37,1.667,41,0.623,43,1.103,52,1.32,53,1.371,72,1.47,73,2.239,79,1.887,86,2.155,97,3.71,106,2.627,129,1.918,162,2.562,183,2.186,188,2.531,192,1.754,193,2.973,225,4.21,248,2.239,250,2.089,270,3.086,287,1.887,293,2.253,310,2.568,322,2.295,350,2.239,369,3.721,386,1.695,447,5.771,467,2.186,482,2.045,484,2.186,485,2.653,486,3.497,487,3.497,488,5.052,489,1.667,490,2.747,491,3.781,492,3.781,493,2.973,494,1.667,495,3.781,496,3.084,497,3.284,498,6.473,499,5.463,500,4.296,501,4.213,502,4.213,503,4.213,504,3.115,505,6.087,506,6.087,507,4.213,508,4.213,509,6.087,510,4.213,511,2.653,512,3.781,513,2.747]],["t/37",[6,2.001,8,1.95,9,1.842,10,1.776,14,1.532,15,1.414,19,1.667,25,2.047,31,1.421,32,1.859,41,1.037,43,1.073,69,1.075,79,2.281,86,1.803,104,1.188,117,0.869,135,2.62,136,2.579,140,1.888,162,2.098,170,3.001,183,4.109,214,3.115,225,2.582,293,1.606,315,2.158,353,3.305,447,5.438,495,4.57,498,5.422,499,4.57,514,5.092,515,4.57,516,5.422,517,5.422,518,5.422,519,5.422,520,5.422,521,5.142,522,2.62,523,2.662]],["t/39",[5,0.826,7,0.608,32,2.415,34,1.577,52,1.391,53,1.445,67,3.21,79,3.695,139,3.698,162,2.185,188,2.922,195,3.911,197,3.99,209,3.144,218,4.478,287,2.962,293,2.085,384,2.907,386,2.661,440,2.962,484,3.432,524,2.24,525,3.515,526,4.312,527,5.489,528,4.031,529,4.031,530,5.936,531,3.8,532,6.614]],["t/41",[6,1.756,7,0.457,8,1.901,9,1.811,10,1.732,14,1.512,15,1.39,19,1.65,22,2.067,25,2.012,31,1.386,41,1.033,43,1.055,69,1.048,79,3.061,101,1.997,104,1.167,115,1.959,116,1.811,117,0.854,119,4.824,121,5.053,122,3.927,135,2.575,136,2.535,140,1.841,162,1.315,164,3.822,192,2.067,213,5.673,214,3.061,216,4.491,218,5.292,225,2.518,257,3.061,258,3.505,293,2.465,315,2.104,353,3.249,522,2.575,523,2.617,533,4.966,534,4.966,535,3.505,536,4.966,537,4.966,538,3.871,539,4.966,540,3.871,541,3.237,542,3.671,543,4.457]],["t/43",[4,1.126,5,0.845,7,0.622,28,2.632,34,1.599,52,1.141,53,1.184,79,3.747,86,2.963,87,2.469,170,2.918,188,2.963,287,3.029,350,3.594,384,2.973,386,2.721,440,3.029,445,4.453,484,3.509,524,2.833,525,3.594,526,4.409,544,4.123,545,5,546,4.409,547,3.429]],["t/45",[6,1.767,8,1.925,9,1.826,10,1.754,14,1.522,15,1.402,19,1.658,25,2.03,31,1.403,32,1.836,41,1.035,43,1.064,69,1.061,86,1.781,104,1.177,115,1.976,116,1.826,117,0.861,135,2.597,136,2.557,140,1.865,162,2.084,170,3.395,183,4.082,214,3.088,315,2.131,353,3.277,445,2.296,516,5.375,517,5.375,518,5.375,519,5.375,520,5.375,522,2.597,523,2.639,524,1.703,545,3.717,548,5.028,549,7.061,550,5.028,551,5.028,552,7.061,553,4.513,554,6.895,555,4.668]],["t/47",[4,0.977,7,0.703,19,1.149,22,2.443,37,3.024,41,0.601,42,4.126,43,0.905,44,3.298,45,2.532,49,3.371,50,4.274,56,3.118,64,2.628,86,2.707,97,3.576,106,2.532,129,1.574,162,1.554,184,2.733,188,2.078,210,2.21,225,4.567,250,2.91,293,2.41,310,3.576,312,2.789,367,3.49,485,3.694,489,2.321,490,3.825,521,5.651,556,5.266,557,5.266,558,5.266,559,4.87,560,3.972,561,4.574,562,4.87,563,5.266,564,5.266,565,4.338,566,5.266,567,5.266,568,5.266,569,5.266,570,5.867,571,3.28,572,4.574]],["t/49",[6,2.044,8,2.073,9,1.92,10,1.889,14,1.581,15,1.474,19,1.71,25,2.134,31,1.511,32,1.977,41,1.046,42,2.628,43,1.119,60,2.473,69,1.143,104,1.238,115,2.078,116,1.92,117,0.906,135,2.731,136,2.689,140,2.008,162,2.165,163,5.652,164,4.054,165,5.652,214,3.247,225,2.746,293,1.708,315,2.295,353,3.446,522,2.731,523,2.775,573,5.415,574,4.86,575,4.86,576,6.507]],["t/51",[5,0.724,6,0.884,7,0.533,13,3.776,19,1.135,21,2.115,30,2.327,33,3.531,34,1.858,52,0.664,53,0.689,65,2.566,69,0.831,76,1.583,79,1.763,86,1.394,87,1.437,109,3.776,117,1.192,188,2.051,192,1.639,197,1.668,228,1.833,233,1.91,240,1.763,245,2.91,255,1.668,263,4.515,287,1.763,288,4.088,301,3.425,307,1.797,310,2.399,312,1.871,325,2.327,370,2.2,386,1.583,438,1.639,440,3.395,442,1.73,444,1.113,445,1.797,448,4.777,451,3.267,464,1.801,481,1.639,482,1.91,484,2.042,496,1.698,535,2.778,577,4.088,578,3.647,579,2.261,580,4.327,581,2.091,582,2.937,583,3.532,584,3.267,585,4.62,586,3.776,587,3.532,588,2.478,589,3.532,590,4.515,591,4.807,592,2.2,593,3.068,594,3.068,595,3.532,596,3.267,597,6.873,598,2.91,599,3.936,600,2.665,601,2.665,602,2.91,603,2.327,604,4.088,605,5.704,606,3.068,607,2.778,608,3.267,609,5.198,610,2.665,611,3.532,612,3.936,613,3.936,614,2.566,615,3.532,616,2.778,617,3.532,618,3.068,619,2.91,620,3.532,621,2.91,622,3.936,623,3.936,624,3.936,625,2.478,626,3.936,627,3.068,628,2.091]],["t/53",[7,0.797,73,3.81,79,3.883,87,2.618,225,3.635,293,2.261,369,3.407,448,5.511,485,5.459,494,2.836,580,5.459,629,4.514,630,7.169,631,7.169,632,7.169,633,6.434,634,7.169,635,4.008,636,5.95]],["t/56",[6,1.693,7,0.599,8,1.776,9,1.727,10,1.618,14,1.458,15,1.325,19,1.602,25,1.919,31,1.294,41,1.023,43,1.006,52,1.099,53,1.142,69,0.979,79,3.662,104,1.113,117,0.814,135,2.456,136,2.417,140,1.72,192,2.714,210,1.747,214,2.92,225,3.822,250,2.3,293,1.462,307,2.118,315,1.965,353,3.098,369,2.204,448,3.854,522,2.456,523,2.495,524,1.571,580,5.148,600,3.14,603,2.742,635,2.593,636,3.85,637,6.476,638,4.413,639,5.082,640,5.85,641,3.024,642,5.876,643,3.273,644,3.024,645,4.163,646,3.14,647,4.163,648,4.163,649,4.638,650,4.163,651,4.638,652,4.163,653,6.519,654,6.519]],["t/58",[5,0.515,7,0.757,13,3.909,19,1.174,22,1.718,30,2.44,33,4.305,34,1.694,36,3.05,51,1.418,52,1.011,53,1.05,65,2.69,69,0.871,76,1.66,79,1.848,86,2.123,109,3.909,117,1.19,147,2.44,162,1.093,188,2.123,192,1.718,197,1.748,228,1.922,233,2.002,240,1.848,255,1.748,263,3.216,287,1.848,301,2.44,307,1.884,310,2.515,376,1.961,386,1.66,440,3.472,444,1.167,445,1.884,449,5.601,455,3.05,456,2.307,481,1.718,482,2.002,484,2.141,494,1.632,496,1.78,535,2.912,545,3.05,560,4.782,577,2.912,580,3.775,581,2.192,582,3.04,583,3.703,584,4.976,585,5.019,586,4.604,587,3.703,588,2.598,589,3.703,590,4.674,591,4.976,592,2.307,593,3.216,594,3.216,595,3.703,596,3.424,598,3.05,600,2.793,601,2.793,602,3.05,603,2.44,604,4.231,605,5.862,606,3.216,607,2.912,608,3.424,635,2.307,639,4.674,643,2.912,655,3.703,656,3.703,657,5.995,658,4.126,659,4.126,660,3.424,661,4.126,662,4.126,663,4.126,664,4.126,665,3.703,666,3.05,667,3.05]],["t/60",[16,2.884,41,0.887,79,3.211,129,1.924,184,4.34,188,3.07,240,3.883,250,3.555,372,5.95,470,5.06,485,4.514,489,2.836,538,5.589,580,5.459,608,5.95,668,7.169,669,5.06,670,3.635,671,5.95]],["t/63",[6,1.645,7,0.673,8,1.684,9,1.663,10,1.535,14,1.417,15,1.277,19,1.564,25,1.848,31,1.228,41,1.014,43,0.969,52,1.059,53,1.1,64,1.97,69,0.928,79,3.576,104,1.072,117,0.784,135,2.366,136,2.328,138,2.77,140,1.631,184,2.049,192,2.614,202,2.601,210,1.657,214,2.812,240,1.97,250,2.181,307,2.009,315,1.864,353,2.984,522,2.366,523,2.404,524,1.49,580,5.027,586,2.868,592,2.46,600,2.978,603,2.601,637,5.959,638,4.251,639,5.708,640,5.635,641,2.868,642,5.708,644,4.093,645,3.948,646,2.978,647,3.948,648,3.948,650,3.948,672,5.406,673,4.399,674,4.399,675,4.399,676,4.399,677,4.399,678,3.948,679,6.279,680,5.635,681,5.635,682,5.635,683,5.635,684,5.635,685,3.429]],["t/65",[7,0.489,33,4.366,34,1.874,40,4.528,42,2.581,76,2.881,77,3.931,79,3.627,81,2.931,86,3.371,101,2.14,170,2.295,197,2.254,199,3.468,219,3.056,240,2.382,294,3.754,343,5.055,438,2.982,439,2.477,440,2.382,444,2.635,445,2.429,478,3.242,496,2.295,535,3.754,616,3.754,686,4.147,687,4.774,688,9.044,689,7.269,690,4.147,691,3.932,692,4.415,693,5.319,694,4.147,695,5.319,696,5.319,697,4.415,698,5.28,699,4.147,700,5.319,701,5.319,702,2.638,703,5.319]],["t/67",[1,1.108,5,0.702,6,1.937,7,0.21,14,1.205,16,0.918,19,1.689,34,0.924,40,2.703,41,1.076,42,2.346,52,0.385,53,0.4,62,2.617,67,1.108,69,1.416,81,2.3,87,1.379,104,1.472,117,1.077,118,2.667,120,2.667,122,1.311,124,2.945,130,1.625,140,0.846,144,1.894,154,2.049,155,2.793,156,4.339,157,3.391,158,3.391,159,2.049,162,1.968,164,3.482,170,2.425,176,2.634,184,1.063,216,1.311,218,1.545,250,1.132,258,1.611,264,2.379,268,1.488,290,1.243,293,0.72,295,3.327,307,1.042,322,2.058,335,2.789,350,1.213,390,1.488,391,5.698,439,1.063,440,1.692,444,0.645,456,1.276,465,3.682,524,2.109,555,1.545,616,1.611,629,1.437,687,2.049,689,2.049,697,3.136,702,1.132,704,2.282,705,5.589,706,3.778,707,3.778,708,5.62,709,2.793,710,2.793,711,2.945,712,2.049,713,5.589,714,3.391,715,3.391,716,1.894,717,2.282,718,2.282,719,2.049,720,4.339,721,2.049,722,4.339,723,2.049,724,2.049,725,2.049,726,2.049,727,2.049,728,2.282,729,2.282,730,2.049,731,4.339,732,4.339,733,3.412,734,3.391,735,2.049,736,2.049,737,2.945,738,2.049,739,2.667,740,2.558,741,2.049,742,1.894,743,1.894,744,2.282,745,2.282,746,2.282,747,1.779,748,2.049,749,1.545,750,1.779,751,2.049,752,2.049,753,2.049,754,2.049,755,1.894,756,2.049,757,2.049,758,2.049,759,2.049,760,2.049,761,3.391,762,2.049,763,2.049]],["t/69",[6,1.883,14,0.673,15,0.707,19,0.681,41,1.088,81,1.423,104,1.606,113,3.121,117,1.175,118,3.727,120,3.727,122,1.998,124,2.711,162,2.221,164,4.285,170,3.076,216,1.998,218,2.355,240,1.558,335,1.558,479,3.121,524,1.178,555,2.355,603,2.056,616,2.454,697,2.886,712,3.121,713,6.397,714,4.739,715,4.739,719,3.121,720,5.729,721,3.121,722,5.729,723,3.121,724,3.121,725,3.121,726,3.121,727,3.121,730,3.121,731,5.729,732,5.729,733,4.505,734,4.739,735,3.121,736,3.121,737,4.116,738,3.121,739,2.454,741,3.121,742,2.886,743,2.886,748,3.121,749,2.355,750,2.711,751,3.121,752,3.121,754,3.121,755,2.886,756,3.121,757,3.121,758,3.121,759,3.121,760,3.121,761,4.739,762,3.121,763,3.121,764,3.478,765,3.121,766,3.478,767,3.478,768,3.478]],["t/71",[5,1.111,40,4.184,43,1.155,45,3.229,81,3.062,117,0.935,233,3.632,438,3.704,442,3.289,444,2.116,464,2.327,473,3.794,578,4.712,690,5.834,691,5.532,702,3.711]],["t/73",[34,1.233,40,1.979,41,1.099,42,1.718,52,0.597,81,1.448,104,0.604,197,2.268,287,4.64,293,1.116,371,4.207,379,2.157,384,2.352,438,2.228,439,1.648,445,2.443,447,2.093,448,2.093,449,2.307,473,1.795,592,1.979,691,2.617,702,1.755,769,3.539,770,3.177,771,3.539,772,2.498,773,2.759,774,2.498,775,5.148,776,2.396,777,2.498,778,2.759,779,2.759,780,2.617,781,2.617,782,2.498,783,2.617,784,2.617,785,2.617,786,3.177,787,2.396,788,3.177,789,2.759]],["t/76",[5,1.194,7,0.407,17,2.636,19,0.868,22,1.845,29,2.478,31,1.237,34,1.731,51,2.527,52,1.428,53,1.483,72,1.546,92,2.701,99,3.13,117,1.1,150,2.478,191,3.977,195,2.62,197,1.878,266,1.948,287,3.588,295,2.198,322,2.414,338,2.62,371,2.889,386,2.539,392,2.355,420,2.478,435,3.678,443,3.001,444,2.079,445,2.024,447,2.62,463,2.414,464,2.633,467,2.299,473,3.2,481,1.845,489,1.753,496,1.912,524,1.501,592,2.478,610,3.001,619,3.276,711,3.455,772,3.128,775,4.11,790,2.701,791,4.432,792,3.977,793,2.889,794,4.432,795,2.546,796,6.312,797,3.73,798,3.128,799,3.128,800,3.977,801,3.977,802,5.665,803,3.678,804,4.921,805,4.455,806,3.977,807,3.455,808,4.432,809,4.432,810,4.432,811,4.432,812,3.977,813,2.701,814,4.432]],["t/78",[4,1.246,5,1.111,12,3.883,287,3.352,362,3.794,370,4.184,386,3.01,444,2.516,464,2.766,524,3.013,815,5.601,816,4.561,817,5.282]],["t/80",[1,2.793,4,1.403,5,0.943,6,2.258,7,0.774,9,1.524,14,1.113,19,1.127,22,2.396,34,1.609,41,0.994,43,0.888,52,0.97,53,1.008,67,2.793,69,1.214,94,4.6,104,1.585,117,0.719,211,3.896,335,3.772,369,2.735,394,3.623,472,3.402,494,2.986,547,2.918,588,3.623,739,4.061,740,3.896,818,3.896,819,4.776,820,4.486,821,5.754,822,5.754,823,4.254,824,5.754]],["t/82",[4,0.91,5,0.911,7,0.671,9,1.448,14,1.057,15,1.111,16,2.198,25,1.609,32,2.663,34,1.044,41,1.035,69,1.153,84,3.354,99,2.71,111,4.905,117,0.683,130,1.767,132,4.26,149,4.905,150,4.078,152,6.054,153,4.905,186,4.04,210,2.748,287,2.448,386,2.198,443,3.7,454,4.26,464,2.268,467,2.835,472,3.231,478,3.331,710,4.04,793,3.563,797,3.979,801,7.369,825,5.465,826,4.536,827,5.465,828,5.465,829,7.294,830,7.294,831,5.465,832,3.857,833,5.465,834,5.465]],["t/84",[1,2.593,4,0.89,5,1.085,14,1.034,15,1.086,17,1.758,25,1.573,31,1.491,34,1.783,41,1.015,52,1.212,53,1.258,69,1.128,72,1.864,76,2.89,90,2.348,105,2.264,116,1.903,117,0.668,129,2.178,130,1.74,142,2.709,190,3.364,210,2.013,254,2.839,269,3.07,296,4.434,298,2.488,307,3.706,341,3.257,369,2.539,376,2.539,428,3.257,459,4.165,463,2.911,467,2.772,472,4.8,494,2.113,524,2.433,628,2.839,797,2.264,835,5.343,836,3.257,837,4.434,838,4.795,839,3.483,840,3.771,841,3.617,842,3.95,843,3.617,844,2.839,845,4.795,846,4.795]],["t/86",[4,1.117,5,0.472,7,0.73,14,1.086,15,0.767,17,2.443,25,1.111,31,1.053,32,2.448,34,1.808,41,0.996,43,0.582,52,0.947,53,0.983,69,1.567,74,4.957,76,1.518,86,1.336,87,1.378,90,1.659,101,2.259,105,1.599,115,1.082,116,1.487,117,0.472,129,2.313,130,1.36,142,1.914,150,2.11,162,2.103,173,1.958,210,1.422,226,2.3,241,2.46,254,3.947,269,3.853,291,3.132,296,3.132,298,1.758,307,3.625,319,1.958,341,2.3,362,1.914,367,1.723,369,1.794,376,1.794,428,3.423,444,1.067,446,2.168,459,2.942,464,1.174,472,3.32,478,2.3,496,1.629,500,5.242,522,1.422,772,3.963,773,5.227,797,2.38,798,2.664,799,2.664,807,2.942,823,2.79,832,2.664,838,3.387,839,2.46,840,2.664,841,2.555,842,2.79,843,2.555,844,2.006,845,3.387,846,3.387,847,3.132,848,2.942,849,2.664,850,3.387,851,2.942,852,2.555,853,3.387,854,4.661,855,3.774,856,3.387,857,3.774,858,3.774,859,3.774,860,5.615,861,3.387,862,3.963,863,3.387,864,3.387,865,3.774,866,3.387,867,3.387,868,2.555,869,3.387,870,2.664]],["t/88",[5,0.626,8,1.917,9,1.326,10,1.747,15,1.018,19,1.347,25,1.474,31,1.397,34,1.314,41,1.034,43,1.061,69,1.057,104,1.563,115,1.97,116,2.424,117,0.859,135,2.59,136,2.549,140,1.857,155,5.082,162,2.079,315,2.122,353,3.731,428,3.052,522,2.59,523,2.632,546,3.264,605,4.156,670,2.539,773,6.12,797,2.913,856,6.17,863,4.494,864,6.17,866,4.494,867,6.17,871,5.007,872,2.539,873,8.566,874,5.007,875,5.007,876,5.007,877,5.007,878,4.156,879,5.007,880,6.875]],["t/90",[5,1.158,7,0.791,29,4.812,79,3.173,99,3.513,117,0.885,147,4.189,173,3.676,228,3.299,466,4.189,496,3.057,774,6.544,881,5.88,882,7.084,883,6.358,884,7.084,885,3.961,886,4.07,887,5.88,888,6.358,889,7.084]],["t/92",[7,0.73,16,2.057,29,2.859,41,0.714,52,0.863,53,0.896,84,1.958,97,4.252,104,1.191,106,2.207,204,3.781,210,3.362,238,2.382,293,1.613,295,2.536,301,3.024,322,2.786,338,4.124,394,3.22,411,4.245,440,2.291,442,2.248,488,4.245,490,3.334,547,2.593,588,3.22,635,3.9,670,2.593,749,6.041,774,4.923,775,2.859,797,2.167,817,3.609,839,5.175,883,4.59,890,7.406,891,3.117,892,3.609,893,3.334,894,5.789,895,5.114,896,3.987,897,8.526,898,6.975,899,5.114,900,5.437,901,3.987,902,5.157,903,5.374,904,5.114,905,4.245,906,3.609,907,5.114,908,4.59,909,5.114,910,5.114,911,4.59,912,3.22,913,4.59,914,5.114,915,5.114]],["t/94",[5,0.733,6,1.717,8,2.246,9,1.554,10,2.047,15,1.193,19,1.149,25,1.727,31,1.638,41,1.064,43,1.18,69,1.238,104,1.305,115,2.191,116,2.025,117,0.955,135,2.88,136,2.835,140,2.176,210,2.21,315,2.486,353,2.789,522,2.88,523,2.926,749,3.972,774,4.141,890,7.057,891,3.576,894,4.87,916,5.867,917,5.867,918,7.644,919,7.644]],["t/96",[3,3,5,0.705,14,1.092,15,1.148,17,1.857,32,2.061,34,1.079,41,1.004,43,0.871,72,1.969,75,3.157,84,2.161,99,3.696,104,0.964,117,0.705,130,2.021,192,2.351,206,3.441,228,2.629,329,3.985,362,2.863,442,2.481,464,2.594,471,2.436,504,4.174,616,3.985,774,5.889,775,3.157,797,2.392,816,3.441,890,4.686,901,4.401,920,5.646,921,3.985,922,5.646,923,3.985,924,4.401,925,2.863,926,7.453,927,6.925,928,7.453,929,5.646,930,5.646,931,4.401,932,5.646,933,5.646,934,6.689,935,4.686,936,4.174,937,5.646,938,5.646]],["t/98",[3,3.379,4,1.203,5,0.795,7,0.664,12,2.024,14,0.459,15,1.01,17,1.893,18,1.607,19,1.65,22,0.988,28,2.474,31,1.089,32,1.814,34,0.949,41,0.98,43,0.888,44,2.144,45,2.144,52,0.658,53,0.87,55,1.494,69,1.049,72,0.828,74,1.754,75,1.327,90,1.043,91,1.675,99,1.177,101,0.955,104,1.168,106,1.024,115,1.118,116,1.033,117,0.795,129,1.047,130,0.575,139,1.327,145,1.85,176,2.126,192,2.069,238,2.314,240,1.747,248,1.261,254,1.261,266,1.043,269,1.363,287,1.063,298,2.68,307,1.084,319,1.231,325,1.403,335,1.063,338,1.403,356,1.607,357,2.544,358,1.675,359,2.544,361,1.754,362,3.664,375,2.126,382,1.403,385,1.261,386,0.955,436,1.97,438,2.069,440,3.381,442,1.715,444,1.103,463,1.293,464,2.126,473,1.203,481,1.624,482,3.086,494,1.543,565,1.754,577,1.675,579,1.363,603,1.403,618,1.85,628,2.073,638,1.607,666,1.754,776,3.364,777,5.518,778,3.873,784,2.884,815,4.305,818,1.607,862,1.675,901,1.85,921,1.675,924,3.042,939,5.951,940,2.13,941,2.373,942,2.373,943,2.373,944,3.673,945,1.85,946,1.547,947,2.373,948,2.884,949,3.238,950,2.13,951,1.547,952,1.85,953,1.97,954,1.494,955,4.968,956,2.307,957,2.373,958,2.373,959,2.373,960,1.363,961,2.544,962,5.755,963,2.373,964,2.13,965,2.373,966,1.446,967,2.373,968,2.373,969,1.675,970,2.373,971,1.97,972,1.85,973,1.97,974,2.373,975,2.13,976,3.238,977,2.373,978,2.373,979,2.373,980,2.373,981,2.373,982,2.307,983,2.13,984,2.13,985,1.754,986,2.373,987,2.373,988,4.488,989,2.373,990,3.902,991,4.968,992,4.459,993,3.042,994,3.902,995,2.378,996,2.884,997,2.544,998,1.85,999,1.494,1000,3.902,1001,2.373,1002,1.97,1003,2.373,1004,4.124,1005,2.373,1006,2.373]],["t/100",[4,0.766,5,0.575,8,1.762,9,1.717,10,1.605,14,0.89,15,1.318,19,0.902,25,1.355,31,1.284,32,1.68,34,1.557,41,1.056,43,1.257,69,0.971,81,1.883,87,1.68,92,2.805,104,1.107,115,1.319,116,1.219,117,0.81,129,1.235,135,2.442,136,2.404,140,1.707,190,2.898,240,2.904,255,1.95,270,3.287,315,1.95,319,2.388,386,1.851,481,3.392,494,1.821,522,2.442,523,2.482,777,6.289,778,3.588,815,4.726,862,3.248,872,2.334,992,5.819,1007,4.602,1008,4.602,1009,4.818,1010,4.818,1011,4.602,1012,3.588,1013,4.131,1014,4.131,1015,4.602,1016,4.602,1017,3.82,1018,4.602,1019,4.602,1020,6.483,1021,6.483,1022,6.483,1023,6.483]],["t/102",[4,0.981,5,1.099,7,0.809,14,0.779,18,5.19,26,2.626,32,2.799,34,1.759,41,0.872,43,0.622,52,1.293,53,1.342,69,0.85,90,1.771,104,0.688,105,2.497,108,2.843,115,1.155,116,1.067,117,0.736,129,1.581,130,0.976,150,2.252,152,3.344,162,2.16,192,2.9,229,1.876,236,2.09,254,3.131,265,1.998,307,3.724,318,2.09,325,5.037,362,2.043,384,1.771,442,2.59,444,1.139,464,2.166,467,3.057,471,2.542,494,1.594,531,2.315,572,3.14,581,2.141,628,2.141,641,2.626,660,5.782,670,2.043,772,4.158,779,7.033,797,2.497,832,2.843,862,2.843,870,2.843,873,5.288,953,3.344,969,2.843,1024,7.665,1025,4.89,1026,2.456,1027,4.028,1028,3.14,1029,4.028,1030,4.028,1031,3.616,1032,3.616,1033,3.616,1034,3.616,1035,3.344,1036,2.252,1037,3.616,1038,3.616,1039,5.892,1040,5.892,1041,4.028]],["t/104",[5,0.751,8,2.303,9,1.593,10,2.098,15,1.223,19,1.178,25,1.771,31,1.679,41,1.06,43,1.403,69,1.269,104,1.327,115,2.226,116,2.058,117,0.971,135,2.927,136,2.881,140,2.231,162,2.279,315,2.549,353,2.859,522,2.927,523,2.974,779,6.056,1037,6.972,1038,6.972,1042,6.015,1043,6.015]],["t/106",[1,4.103,4,1.146,7,0.633,41,0.865,52,1.16,53,1.205,86,2.436,87,2.512,101,2.768,106,2.969,115,1.972,130,1.666,183,3.57,184,3.204,257,3.082,376,3.27,385,3.656,535,4.856,592,4.727,698,4.486,780,6.251,795,3.953,900,5.364,939,5.512,1044,3.847,1045,6.175,1046,6.175]],["t/108",[7,0.833,14,1.39,15,1.461,21,1.951,30,3.159,41,0.735,43,1.109,52,1.212,53,1.258,60,2.44,69,1.516,88,4.165,105,2.264,107,2.44,129,2.178,130,1.294,162,2.628,207,4.017,210,2.013,211,3.617,230,3.617,234,3.257,236,2.772,241,3.483,255,2.264,265,2.649,266,2.348,269,3.07,295,2.649,303,2.94,319,4.504,351,4.165,471,2.305,571,2.987,581,2.839,592,2.987,780,6.001,852,3.617,939,3.483,956,3.159,999,3.364,1047,4.434,1048,4.434,1049,6.448,1050,3.364,1051,4.434,1052,5.343,1053,5.343,1054,4.434,1055,5.343,1056,7.185]],["t/110",[5,0.662,8,2.027,9,1.892,10,1.847,14,1.563,15,1.452,19,1.694,25,2.102,31,1.478,41,1.042,43,1.102,69,1.118,86,1.875,104,1.22,115,2.479,116,1.892,117,0.892,129,1.916,135,2.691,136,2.648,140,1.964,162,2.14,183,4.193,184,3.763,257,3.199,315,2.244,353,2.517,522,2.691,523,2.734,780,5.28,1049,4.753,1051,5.927,1057,5.296,1058,5.296,1059,5.296,1060,5.296,1061,7.142,1062,7.142,1063,7.142]],["t/112",[1,3.359,4,1.152,41,0.868,51,2.378,52,1.167,53,1.212,87,2.527,101,2.784,106,2.986,115,1.983,129,2.277,183,3.591,184,3.223,264,4.357,310,4.218,374,5.017,376,3.289,385,3.677,401,4.884,482,3.359,511,4.357,781,6.273,795,3.976,1044,3.869,1045,6.211,1046,6.211,1064,5.744]],["t/114",[7,0.833,14,1.39,15,1.461,21,1.951,30,3.159,41,0.735,43,1.109,52,1.212,53,1.258,60,2.44,69,1.516,105,2.264,107,2.44,129,2.178,162,2.628,187,2.911,207,4.017,210,2.013,211,3.617,230,3.617,234,3.257,236,2.772,241,3.483,255,2.264,265,2.649,266,3.158,269,3.07,295,2.649,303,2.94,319,4.504,351,4.165,374,3.159,471,2.305,571,2.987,581,2.839,781,6.001,852,3.617,956,3.159,999,3.364,1047,4.434,1048,4.434,1050,3.364,1051,4.434,1054,4.434,1065,6.448,1066,4.795,1067,5.343,1068,5.343,1069,5.343,1070,5.343,1071,5.343]],["t/116",[5,0.674,8,2.064,9,1.915,10,1.881,14,1.578,15,1.47,19,1.707,25,2.128,31,1.505,41,1.045,43,1.115,69,1.138,86,1.909,104,1.234,115,2.071,116,1.915,117,0.903,129,1.94,135,2.723,136,2.68,140,1.999,162,2.16,183,4.231,184,3.798,315,2.285,353,2.562,522,2.723,523,2.767,781,5.344,1065,7.318,1072,5.391,1073,5.391,1074,5.391,1075,5.391,1076,7.228,1077,5.999,1078,7.228]],["t/118",[4,1.398,5,1.171,6,1.886,7,0.729,9,2.224,10,1.512,14,1.741,15,1.477,19,1.554,22,1.805,25,2.138,34,1.388,37,2.873,41,1.012,43,0.959,52,0.731,53,0.759,72,1.512,86,1.535,94,2.643,104,1.061,117,0.776,135,2.341,136,2.304,140,1.608,162,1.646,170,2.681,183,3.224,188,1.535,192,1.805,214,3.253,298,2.019,386,1.744,447,5.623,464,1.348,484,2.249,494,1.715,498,4.844,515,3.891,516,4.844,517,4.844,518,4.844,519,4.844,520,4.844,521,4.594,522,2.341,523,2.379,582,2.198,670,2.198,775,2.424,954,2.73,1079,3.891,1080,2.362]],["t/120",[5,1.083,6,1.61,7,0.659,34,1.781,52,1.209,53,1.255,79,3.211,86,2.539,115,2.055,188,3.07,197,4.201,287,3.211,386,2.884,440,3.211,484,3.72,525,3.81,526,4.674]],["t/122",[4,1.166,5,0.875,7,0.848,34,1.633,37,2.769,52,1.181,53,1.226,85,3.55,86,2.479,87,2.556,101,2.816,162,1.854,170,3.021,197,3.909,384,3.077,500,4.941,525,3.72,581,3.72,582,3.55,1081,6.51,1082,7.001,1083,7.001]],["t/124",[4,0.902,5,0.906,7,0.667,8,2.073,9,2.165,10,1.889,14,1.581,15,1.474,19,1.71,25,2.134,31,2.023,34,1.035,41,1.046,43,1.119,69,1.143,101,2.178,104,1.238,115,2.078,116,1.92,117,0.906,130,1.312,135,2.731,136,2.689,140,2.008,162,1.434,315,2.295,384,2.38,522,2.731,523,2.775,525,2.878,872,2.746,1081,5.117,1084,5.415,1085,7.25,1086,4.86,1087,5.415,1088,4.86,1089,5.415,1090,6.507,1091,7.25,1092,5.415]],["t/126",[4,1.547,5,1.104,6,1.985,7,0.741,34,1.775,52,1.074,53,1.115,94,3.881,106,2.747,117,0.796,188,2.853,197,4.147,214,2.852,255,2.698,287,2.852,384,2.799,386,2.561,440,2.852,471,2.747,484,3.304,489,2.519,525,3.384,526,4.151,582,3.228,670,3.228,775,3.56,816,3.881,960,3.658,1093,6.367]],["t/128",[4,0.855,5,1.067,6,1.571,7,0.731,9,2.262,10,1.792,14,1.729,15,1.618,19,1.673,25,2.342,37,2.032,41,1.038,43,1.079,52,0.866,53,0.899,104,1.195,115,2.005,116,1.853,117,0.874,119,4.937,121,5.172,122,4.019,135,2.635,136,2.594,140,1.905,164,3.911,197,3.371,214,3.133,216,4.019,218,4.736,258,3.625,298,2.392,494,2.032,522,2.635,523,2.678,543,4.61,670,2.604,1080,2.798,1094,5.453]],["t/130",[4,0.892,5,0.331,6,0.958,7,0.662,8,1.013,9,0.701,10,0.923,15,0.538,19,0.835,20,2.063,25,0.779,31,0.739,34,1.629,39,1.406,41,1.04,43,0.658,52,1.213,53,1.26,69,1.13,77,1.284,84,1.013,86,0.937,94,1.613,97,1.613,101,1.715,104,0.914,105,1.121,106,1.84,115,1.222,116,1.783,117,0.533,130,1.297,135,1.606,136,1.581,140,0.981,142,2.162,145,3.324,146,3.539,162,1.418,164,3.433,183,3.185,184,2.859,188,1.896,210,0.997,225,3.648,240,1.185,257,3.015,268,1.725,289,1.52,293,2.386,315,1.121,343,1.868,350,1.406,353,2.026,357,2.78,369,1.258,376,1.258,438,1.102,475,1.792,481,2.995,482,2.599,485,1.666,489,1.047,504,3.152,521,1.956,522,1.606,523,1.632,524,2.562,555,3.625,628,1.406,698,3.491,702,4.137,733,3.779,737,4.174,742,4.444,743,3.539,765,2.375,776,2.887,815,2.684,820,3.324,839,1.725,850,2.375,896,3.324,939,3.491,940,2.375,951,1.725,988,1.868,996,1.956,1009,4.254,1012,3.324,1034,2.375,1095,2.646,1096,2.646,1097,2.063,1098,2.646,1099,4.263,1100,1.956,1101,2.375,1102,4.263,1103,5.354,1104,2.646,1105,2.646,1106,5.354,1107,2.375,1108,2.375,1109,2.375,1110,2.646,1111,4.871,1112,2.646,1113,4.444,1114,2.646,1115,2.646,1116,2.646,1117,2.646,1118,3.826,1119,3.826,1120,3.826,1121,3.826,1122,3.826,1123,3.826,1124,3.826,1125,4.263,1126,2.375]],["t/132",[5,1.083,6,1.61,7,0.659,34,1.781,52,1.209,53,1.255,79,3.211,86,2.539,115,2.055,188,3.07,287,3.211,386,2.884,440,3.211,445,4.527,484,3.72,525,3.81,526,4.674]],["t/134",[4,1.204,5,0.674,7,0.835,9,1.428,22,2.245,31,1.505,32,1.968,34,1.558,37,3.226,52,1.469,53,1.526,85,2.733,86,1.909,87,1.968,90,2.369,95,3.65,101,2.169,129,1.447,162,2.16,170,2.326,199,3.515,206,3.286,226,3.286,240,2.415,264,3.394,370,3.014,384,2.369,440,3.237,445,4.149,466,3.188,478,3.286,494,2.133,500,5.101,525,2.865,581,2.865,582,2.733,644,3.515,797,2.285,798,3.805,799,3.805,804,4.203,953,4.474,1081,5.755,1127,5.391,1128,6.487,1129,4.838,1130,3.515,1131,4.838,1132,4.838,1133,5.391,1134,5.391,1135,4.838,1136,4.474,1137,5.391]],["t/136",[4,1.216,6,1.64,7,0.671,31,2.038,37,2.888,52,1.231,53,1.278,77,3.543,101,2.937,170,4.053,210,3.302,257,3.27,295,3.62,384,3.209,425,5.397,445,3.334,471,3.15,999,4.597,1138,5.153]],["t/138",[4,0.874,5,0.887,7,0.653,8,2.009,9,2.131,10,1.831,14,1.556,15,1.443,19,1.688,25,2.09,31,1.981,34,1.357,41,1.041,43,1.095,69,1.108,101,2.856,104,1.212,115,2.035,116,1.88,117,0.887,130,1.271,135,2.675,136,2.633,140,1.947,162,1.39,170,3.471,257,2.351,315,2.224,384,2.307,440,2.351,522,2.675,523,2.718,525,2.789,549,7.22,753,4.711,755,5.892,872,2.661,1086,4.711,1088,4.711,1139,5.249,1140,4.711,1141,5.249,1142,5.249,1143,7.099]],["t/140",[4,1.351,5,0.804,6,1.822,7,0.746,28,2.504,34,1.782,52,1.085,53,1.127,79,2.883,86,3.145,87,2.35,170,2.777,188,2.872,350,3.42,384,2.829,386,2.589,440,2.883,445,4.481,464,2.001,484,3.339,524,2.18,525,3.42,526,4.196,544,3.923,545,4.758,546,4.196,547,3.263,775,3.598,954,4.052,1079,5.776]],["t/142",[4,0.827,5,1.052,6,1.535,7,0.719,9,2.23,10,1.732,14,1.709,15,1.589,19,1.65,25,2.301,37,1.964,41,1.033,43,1.055,52,0.837,53,0.87,104,1.167,115,1.959,116,1.811,117,0.854,135,2.575,136,2.535,140,1.841,162,1.811,170,2.949,183,3.546,214,3.061,298,2.313,445,3.845,494,1.964,516,5.329,517,5.329,518,5.329,519,5.329,520,5.329,522,2.575,523,2.617,552,6.135,553,4.457,555,4.628,670,2.518,1080,2.705,1144,6.835]],["t/144",[4,1.449,5,1.087,6,1.954,7,0.663,9,1.91,14,1.683,22,3.003,34,1.378,37,3.442,42,4.535,72,2.516,86,2.554,94,4.396,188,2.554,192,3.003,214,3.23,582,3.657]],["t/146",[4,0.863,5,1.155,6,1.58,7,0.735,9,2.27,10,1.807,14,1.734,15,1.625,19,1.679,25,2.352,37,2.049,41,1.039,42,4.16,43,1.086,52,0.874,53,0.907,104,1.202,115,2.017,116,1.864,117,0.879,135,2.651,136,2.609,140,1.921,162,1.864,163,5.485,164,3.934,165,5.485,214,3.152,298,2.413,494,2.049,522,2.651,523,2.694,575,4.65,576,6.315,670,2.627,1080,2.822]],["t/148",[4,1.089,5,0.817,7,0.753,14,1.265,15,1.536,21,1.7,30,2.753,34,0.89,38,3.035,41,0.838,43,1.009,52,1.274,53,1.323,69,1.379,75,2.603,86,2.315,90,2.046,105,1.973,115,1.334,129,1.754,162,2.586,207,3.655,210,1.754,211,3.152,228,2.168,230,3.152,234,2.838,241,3.035,255,1.973,264,4.115,266,2.873,269,2.675,295,2.309,303,2.675,319,3.919,351,3.63,438,2.721,444,1.849,464,1.448,494,1.842,571,2.603,581,4.014,646,3.152,782,6.483,797,1.973,852,3.152,921,3.286,997,3.035,999,2.932,1017,3.864,1047,3.864,1048,3.864,1050,2.932,1054,3.864,1145,4.656,1146,4.656,1147,4.656,1148,4.179,1149,3.286,1150,6.536,1151,6.536,1152,4.656,1153,4.656,1154,4.656,1155,4.656,1156,4.656,1157,4.656,1158,4.656]],["t/150",[1,3.107,5,0.8,7,0.743,14,1.239,21,2.337,34,1.545,41,0.827,43,0.988,52,1.363,53,1.416,64,3.62,67,3.107,72,2.233,92,3.902,226,3.902,227,5.313,229,3.765,331,4.173,444,1.81,464,2.513,481,2.665,482,3.107,782,5.705,936,4.733,952,4.99,1113,5.313,1159,7.255,1160,5.745,1161,5.473,1162,5.313,1163,4.99,1164,5.745,1165,6.401,1166,5.745]],["t/152",[5,0.737,7,0.705,34,1.629,41,0.785,43,0.91,52,1.437,53,1.492,104,1.31,117,0.958,173,3.059,226,3.594,227,4.894,229,2.746,236,3.979,341,3.594,456,3.297,464,3.036,481,2.455,782,4.161,812,5.292,872,2.99,936,4.359,1164,8.1,1167,3.965,1168,6.365,1169,5.896,1170,5.292,1171,5.896,1172,5.046,1173,3.196]],["t/154",[5,0.709,9,2.215,14,1.618,15,1.52,19,1.742,25,2.201,41,1.072,43,1.154,90,2.493,104,1.277,115,2.143,116,1.98,117,0.934,135,2.817,136,2.773,140,2.104,162,1.98,522,2.817,523,2.862,782,4.003,1050,4.707,1159,6.71,1160,6.71,1170,6.71,1174,5.672,1175,7.477]],["t/156",[6,1.67,7,0.684,12,3.859,14,1.439,17,2.447,41,0.761,129,1.996,266,3.269,319,3.859,783,6.552,795,4.273,844,3.952,1176,6.675,1177,7.437,1178,7.437,1179,7.437,1180,5.797,1181,7.437]],["t/158",[5,0.683,8,2.092,9,1.932,10,1.906,14,1.589,15,1.483,19,1.716,25,2.147,31,1.525,41,1.063,43,1.126,69,1.153,104,1.246,115,2.09,116,1.932,117,0.911,130,1.767,135,2.748,136,2.705,140,2.027,142,3.698,162,1.932,184,3.397,315,2.316,522,2.748,523,2.792,783,4.04,1182,5.465,1183,5.465,1184,5.465,1185,5.465,1186,7.294,1187,7.294,1188,6.547,1189,7.294]],["t/160",[4,0.655,7,0.362,9,1.534,28,2.949,29,2.2,31,1.918,34,0.752,37,2.719,44,3.271,45,3.271,49,2.261,52,1.425,53,1.415,56,2.091,60,1.797,70,4.481,72,1.373,93,2.478,107,1.797,147,2.327,190,2.478,210,2.182,219,2.261,253,2.778,266,3.021,295,2.872,309,3.267,314,2.91,342,3.267,345,2.665,367,1.797,372,3.267,375,3.744,388,3.068,432,2.665,438,1.639,444,1.113,464,1.224,471,2.499,473,2.937,496,3.271,524,1.962,540,3.068,581,2.091,592,3.238,628,2.091,694,3.068,784,2.91,795,4.355,797,2.913,802,3.532,844,2.091,851,4.515,903,2.665,925,1.996,939,3.776,961,3.776,975,7.583,999,2.478,1036,2.2,1044,3.238,1064,5.704,1176,5.198,1190,7.013,1191,4.282,1192,3.936,1193,5.792,1194,8.079,1195,3.267,1196,3.936,1197,8.079,1198,2.665,1199,3.532,1200,3.532,1201,3.532,1202,3.068,1203,3.936,1204,3.936,1205,3.936,1206,3.532,1207,2.566,1208,2.566,1209,5.792,1210,3.936,1211,3.936,1212,3.532,1213,3.936,1214,3.936,1215,3.936,1216,3.936,1217,3.936]],["t/162",[5,0.856,7,0.63,8,1.909,9,1.816,10,1.739,14,1.516,15,1.394,19,1.653,25,2.018,31,1.392,34,1.31,41,1.064,43,1.058,69,1.052,81,2.805,87,1.821,104,1.441,115,1.965,116,1.816,117,0.856,130,1.208,135,2.583,136,2.542,140,1.849,268,3.251,315,2.113,470,3.519,473,3.476,481,2.854,522,2.583,523,2.624,783,5.068,787,4.641,952,6.107,1009,4.053,1010,4.053,1162,5.69,1190,5.69,1218,4.986,1219,4.986,1220,4.986,1221,4.986,1222,6.152]],["t/164",[4,1.038,7,0.805,17,2.879,37,3.462,41,0.814,69,1.316,86,3.371,101,3.198,105,2.642,115,2.278,129,2.133,162,2.106,184,2.904,187,3.396,265,3.092,266,3.494,319,3.235,325,4.7,385,3.313,394,3.925,471,2.69,525,3.313,670,3.161,785,5.877,852,4.221,853,5.595,854,5.175,1223,4.065,1224,6.235,1225,6.235,1226,6.235,1227,5.595]],["t/166",[5,0.689,7,0.507,8,2.111,9,1.944,10,1.924,14,1.596,15,1.492,19,1.793,25,2.16,31,1.539,41,1.048,43,1.132,69,1.164,86,1.953,104,1.253,115,2.103,116,1.944,117,0.917,129,1.48,135,2.765,136,2.722,140,2.045,162,1.944,184,3.418,266,2.424,315,2.337,325,3.261,353,2.621,522,2.765,523,2.81,785,6.5,1188,6.587,1227,7.403,1228,5.515,1229,5.515,1230,5.515]],["t/168",[4,0.689,5,0.319,6,0.929,7,0.48,8,0.976,9,1.383,10,0.89,12,2.147,14,1.01,15,0.841,17,0.839,19,1.177,25,1.218,31,0.712,34,1.696,39,1.355,40,5.134,41,1.045,43,0.806,52,0.698,53,0.725,69,1.638,70,4.858,73,1.355,77,1.238,86,0.903,87,0.931,104,0.707,105,1.081,106,1.1,115,1.186,116,1.591,117,0.517,129,0.684,130,1.002,135,1.559,136,1.535,140,0.946,142,2.098,145,3.226,146,3.434,162,1.591,170,3.35,183,2.147,255,1.081,257,3.168,266,1.121,268,2.698,269,1.465,293,0.804,295,1.265,307,1.164,315,1.081,319,1.323,350,1.355,353,1.967,357,2.698,438,1.062,475,1.727,481,3.103,482,2.916,494,1.009,496,1.1,513,1.663,522,1.559,523,1.584,524,3.164,547,1.293,555,4.472,672,1.727,698,3.917,733,4.993,737,4.071,776,2.802,815,2.605,892,1.8,896,3.226,939,1.663,1009,4.183,1012,3.226,1080,1.389,1101,2.289,1111,4.79,1113,4.334,1118,3.714,1119,3.714,1120,3.714,1121,3.714,1122,3.714,1123,3.714,1124,3.714,1126,3.714,1166,3.714,1195,2.117,1231,4.138,1232,2.55,1233,6.605,1234,6.605,1235,2.55,1236,4.138,1237,2.55,1238,2.55,1239,2.55,1240,2.55,1241,2.55,1242,2.55,1243,2.55,1244,2.55,1245,4.138,1246,4.138,1247,4.138]],["t/170",[4,1.139,5,0.855,6,2.051,7,0.629,34,1.821,73,3.635,84,2.619,188,2.422,228,3.186,263,5.333,386,2.752,438,2.848,448,5.891,464,2.62,484,3.549,577,4.828,578,4.307,579,3.931,580,4.307,586,4.46,954,4.307,1248,5.678]],["t/172",[6,1.746,34,1.486,37,3.076,73,4.132,117,0.971,448,4.598,496,3.355,580,4.896,585,4.739,586,5.069,844,4.132,960,4.467]],["t/174",[4,1.299,5,1.139,6,1.752,7,0.717,9,2.336,10,1.725,14,1.807,15,1.586,19,1.647,22,2.059,25,2.296,37,3.085,41,1.032,43,1.052,52,0.834,53,0.866,72,1.725,94,3.014,104,1.164,117,0.852,135,2.568,136,2.528,140,1.834,192,2.059,214,3.493,225,3.456,298,2.303,448,5.214,494,1.956,522,2.568,523,2.609,582,2.507,637,4.81,642,5.313,652,4.438,670,2.507,1080,2.694,1249,6.816,1250,6.816]],["t/176",[4,0.792,5,0.279,6,1.245,7,0.744,9,1.468,16,0.898,17,1.565,20,1.739,28,2.736,29,2.073,33,1.36,34,0.426,36,1.65,43,0.344,44,1.6,45,2.654,51,0.767,52,1.503,53,1.543,54,1.319,64,2.755,65,1.455,67,1.083,70,2.417,79,0.999,81,3.879,86,0.79,91,1.575,93,1.405,97,2.26,99,1.839,106,0.963,107,1.019,115,1.063,117,0.279,129,1.487,138,2.335,150,1.248,162,1.95,170,0.963,186,1.65,188,1.962,209,1.061,216,1.282,219,1.282,228,1.039,236,1.158,240,2.755,248,1.186,250,1.106,252,2.511,253,1.575,256,5.835,257,2.972,264,4.178,293,0.704,298,1.039,302,1.455,322,2.02,350,1.97,362,1.88,363,2.003,367,1.019,369,1.762,374,2.813,375,1.216,376,1.762,385,1.186,424,1.405,442,0.981,444,1.345,453,1.852,464,1.153,467,1.924,471,2.053,473,1.131,476,1.65,482,1.083,485,2.995,489,0.883,496,2.053,513,1.455,525,1.186,526,1.455,528,1.36,529,1.36,541,1.455,546,2.417,555,1.511,571,1.248,588,1.405,601,1.511,607,1.575,614,3.613,625,1.405,635,2.66,644,4.009,667,1.65,669,1.575,686,1.739,694,1.739,716,1.852,775,1.248,798,1.575,799,1.575,832,1.575,839,1.455,842,1.65,844,1.186,862,1.575,872,1.131,885,1.248,888,3.328,891,3.378,892,1.575,893,1.455,902,1.65,906,1.575,925,1.131,944,1.65,956,2.813,960,2.733,982,2.192,1033,2.003,1050,1.405,1100,1.65,1135,2.003,1136,3.078,1161,5.475,1180,1.739,1206,2.003,1208,1.455,1251,3.708,1252,2.231,1253,1.739,1254,1.575,1255,1.852,1256,2.003,1257,4.27,1258,2.231,1259,3.221,1260,1.248,1261,2.891,1262,3.078,1263,3.328,1264,2.231,1265,6.636,1266,2.231,1267,2.231,1268,2.231,1269,2.231,1270,2.231,1271,4.974,1272,2.231,1273,1.739,1274,1.511,1275,2.231,1276,1.739,1277,2.231,1278,1.739,1279,4.758,1280,4.758,1281,1.852,1282,2.231,1283,2.003,1284,1.739,1285,2.231,1286,2.231,1287,2.231,1288,2.231,1289,2.231,1290,2.231,1291,2.003,1292,2.231,1293,3.708,1294,1.739,1295,1.65,1296,2.231,1297,3.078,1298,3.078,1299,2.231,1300,2.231,1301,2.231,1302,2.231,1303,2.231,1304,2.003,1305,2.231,1306,1.575,1307,1.739]],["t/178",[5,0.659,6,1.599,8,2.018,9,1.886,10,1.839,14,1.56,15,1.448,19,1.691,25,2.096,31,1.471,41,1.051,43,1.099,69,1.113,81,2.157,104,1.216,114,6.391,115,2.041,116,1.886,117,0.89,118,5.025,119,5.025,120,5.025,121,5.264,122,4.091,123,7.236,124,5.551,125,6.391,135,2.683,136,2.641,140,1.955,315,2.234,353,3.384,522,2.683,523,2.726,528,3.214,625,3.319,1161,3.57,1271,4.732,1308,5.272,1309,5.272,1310,5.272]],["t/180",[0,2.943,3,3.014,4,0.945,5,0.934,7,0.85,12,2.943,15,1.153,16,3.008,25,1.67,34,1.598,38,4.874,51,1.95,84,2.862,85,3.791,88,4.422,90,3.286,101,2.282,130,1.374,184,2.642,210,2.137,236,2.943,255,2.404,293,2.357,311,3.698,335,2.541,362,2.876,384,3.286,394,3.571,432,3.841,439,3.482,440,2.541,442,2.493,445,3.414,481,2.362,524,1.921,598,4.194,690,5.828,733,4.003,790,4.557,1111,3.841,1130,4.874,1173,2.648,1253,4.422,1274,3.841,1311,5.672,1312,5.672,1313,5.672,1314,5.672,1315,4.003]],["t/182",[5,0.653,8,2.001,9,1.875,10,1.823,14,1.553,15,1.439,19,1.685,25,2.084,31,1.459,32,1.908,41,1.058,43,1.092,69,1.103,86,1.851,104,1.209,115,2.029,116,1.875,117,0.884,135,2.667,136,2.625,140,1.938,162,2.126,184,3.297,293,1.648,315,2.215,353,3.815,439,3.297,522,2.667,523,2.71,524,2.397,733,4.996,1316,5.226,1317,5.226,1318,5.226,1319,5.226,1320,4.185,1321,7.078,1322,8.603,1323,7.078]],["t/184",[4,1.089,5,0.817,6,2.01,7,0.601,33,3.987,34,1.846,51,2.248,73,3.476,84,2.504,86,2.316,117,0.817,188,2.316,228,3.047,376,3.109,386,2.631,449,6.296,464,2.034,484,3.394,560,4.429,577,4.617,584,5.429,585,3.987,586,5.833,639,6.388,655,5.871,656,5.871,954,4.119,1248,5.429]],["t/186",[6,1.746,34,1.486,37,3.076,73,4.132,117,0.971,449,5.069,496,3.355,580,4.896,585,4.739,586,5.069,844,4.132,960,4.467]],["t/188",[4,1.481,5,1.111,6,1.681,9,1.982,14,1.721,22,3.116,37,3.519,72,2.61,94,4.561,192,3.116,214,3.352,449,4.879,582,3.794,1324,6.211]],["t/190",[1,2.35,4,0.806,5,1.006,6,1.088,7,0.766,9,1.779,10,1.084,14,1.409,15,1.21,16,1.25,19,1.316,21,1.134,25,1.751,32,1.134,34,1.391,37,1.229,41,1.055,43,0.918,51,2.502,52,0.524,53,0.544,76,1.25,87,1.134,99,1.541,104,1.317,117,0.964,135,1.824,136,1.796,140,1.152,197,2.521,210,1.171,214,3.261,298,1.447,335,1.392,438,2.016,444,1.682,449,4.379,481,2.016,482,2.35,494,1.229,522,1.824,523,1.854,529,1.894,560,2.104,586,2.026,642,5.676,644,2.026,665,2.789,666,2.297,670,1.575,672,4.93,678,2.789,680,6.535,681,6.535,682,6.535,683,6.535,684,6.535,685,2.422,816,1.894,817,3.417,988,4.199,1080,1.693,1163,2.422,1295,2.297,1325,7.713,1326,7.281,1327,2.422,1328,2.193,1329,3.107,1330,3.107,1331,2.579,1332,3.107,1333,2.579,1334,3.107,1335,3.107,1336,3.107,1337,3.107,1338,3.107,1339,3.107,1340,2.579,1341,4.842,1342,5.949,1343,7.281,1344,6.717,1345,2.579,1346,2.422]],["t/192",[3,1.554,4,0.487,7,0.724,12,1.517,14,0.566,15,1.163,16,1.176,17,2.138,18,3.126,19,0.573,21,1.686,32,1.068,36,2.162,41,1.031,43,0.451,52,0.779,53,1.138,62,1.362,64,1.31,74,2.162,85,1.483,98,1.45,104,1.208,107,1.335,115,1.862,116,1.721,117,0.715,129,1.744,130,1.386,184,2.665,192,1.218,202,1.729,205,4.091,210,1.102,225,1.483,226,1.783,238,2.665,245,3.414,264,5.288,265,1.45,266,2.515,288,2.064,290,1.593,314,2.162,325,1.729,338,1.729,356,3.126,357,1.907,359,1.907,362,3.587,370,1.635,375,2.515,376,2.195,382,1.729,442,3.305,444,0.827,446,1.68,464,0.909,471,1.262,485,1.841,486,3.832,487,2.427,496,1.992,525,1.554,547,1.483,627,2.28,629,1.841,641,1.907,666,2.162,669,2.064,670,1.483,709,2.162,787,6.205,795,1.68,816,1.783,839,1.907,849,2.064,885,2.582,891,1.783,900,2.28,901,2.28,912,2.907,925,1.483,944,2.162,966,1.783,998,2.28,1044,4.904,1167,1.957,1172,1.635,1173,2.301,1324,3.832,1347,4.618,1348,2.925,1349,1.98,1350,2.925,1351,2.925,1352,4.618,1353,2.925,1354,2.925,1355,2.925,1356,3.414,1357,3.832,1358,2.925,1359,2.925,1360,2.28,1361,7.075,1362,2.625,1363,2.925,1364,4.312,1365,2.665,1366,3.874,1367,4.618,1368,2.427,1369,4.144,1370,3.832,1371,2.925,1372,2.925,1373,2.925,1374,2.925,1375,2.925,1376,2.427,1377,2.925]],["t/194",[5,0.712,8,2.182,9,1.987,10,1.988,14,1.622,15,1.525,19,1.745,25,2.208,31,1.591,41,1.053,43,1.157,69,1.203,104,1.281,115,2.149,116,1.987,117,0.937,135,2.826,136,2.781,140,2.114,162,1.987,184,3.493,315,2.415,353,2.709,522,2.826,523,2.871,787,3.859,1369,5.115,1370,6.225,1378,5.699,1379,8.383,1380,5.699,1381,7.5]],["t/196",[7,0.524,17,1.875,31,1.591,32,2.081,52,0.961,53,0.998,60,2.602,70,3.716,77,2.766,79,2.553,90,2.505,92,4.572,104,0.973,147,3.37,162,2.22,166,4.89,228,2.654,257,2.553,264,3.589,270,2.89,293,2.643,338,3.37,341,3.474,367,2.602,379,4.572,394,3.589,440,2.553,456,3.187,494,2.255,496,3.236,497,4.443,526,3.716,592,3.187,594,4.443,611,5.115,644,3.716,798,4.023,799,4.023,803,4.73,891,4.572,896,5.847,951,3.716,966,3.474,1050,3.589,1149,5.293,1263,5.115,1382,5.699,1383,5.699,1384,4.73,1385,5.115,1386,5.699,1387,5.699,1388,5.699,1389,5.699,1390,5.699,1391,5.699,1392,5.699]],["t/198",[0,2.986,5,1.117,6,1.695,7,0.854,14,1.113,15,1.17,21,2.756,31,1.606,32,2.101,41,1.054,43,0.888,85,2.918,98,2.854,104,1.289,117,0.943,129,2.025,162,2.231,255,2.439,293,2.656,379,3.507,625,3.623,1081,6.31,1384,4.776,1393,5.754,1394,7.547,1395,5.754,1396,5.754,1397,7.547,1398,5.754,1399,5.754,1400,5.754,1401,5.754]],["t/200",[4,1.439,7,0.655,17,2.345,22,2.967,34,1.651,90,3.132,104,1.217,206,4.344,252,5.849,254,4.59,379,4.344,494,2.819,643,6.097,903,4.825,1149,6.097,1254,5.03,1402,6.396,1403,8.343]],["t/202",[5,0.653,8,2.001,9,2.126,10,1.823,14,1.553,15,1.439,19,1.685,25,2.084,31,1.459,34,1.353,41,1.058,43,1.092,69,1.103,87,1.908,104,1.209,115,1.498,116,1.384,117,0.884,129,1.402,135,2.667,136,2.625,140,1.938,255,2.215,315,2.215,379,4.892,481,2.947,522,2.667,523,2.71,872,2.65,952,5.518,1009,4.185,1010,4.185,1081,4.996,1162,5.875,1402,4.69,1403,6.353,1404,5.226,1405,5.226,1406,5.226,1407,5.226,1408,7.078,1409,7.078]],["t/204",[7,0.714,32,2.196,34,1.644,52,1.31,53,1.36,65,3.921,69,1.269,74,5.743,101,3.125,150,3.363,162,2.409,226,3.666,269,3.456,270,3.05,291,4.992,293,1.897,303,2.461,307,2.746,362,3.05,386,2.42,438,2.504,444,1.701,464,1.87,478,3.666,500,5.483,600,4.072,772,5.483,789,7.089,797,2.549,798,4.245,799,4.245,815,3.787,832,4.245,1136,4.992,1410,6.015,1411,6.015,1412,6.015,1413,6.015,1414,6.015,1415,6.015,1416,7.768]],["t/206",[5,0.722,8,2.214,9,2.005,10,2.017,14,1.633,15,1.539,19,1.755,25,2.229,31,1.614,41,1.055,43,1.168,69,1.22,104,1.293,115,2.17,116,2.005,117,0.946,135,2.852,136,2.808,140,2.144,162,2.236,272,6.795,315,2.45,353,2.748,522,2.852,523,2.898,789,5.902,815,3.641,1417,5.782,1418,5.782,1419,7.571]],["t/208",[2,1.417,3,0.966,4,0.519,5,0.39,6,1.735,7,0.692,9,1.085,14,0.603,16,1.254,17,2.475,19,0.951,22,0.757,29,1.743,30,1.075,32,1.138,34,0.596,37,0.719,39,0.966,41,0.921,51,1.072,52,0.307,53,0.318,62,0.846,64,2.447,72,1.088,77,0.882,79,0.814,84,0.696,87,1.773,90,0.799,93,1.144,95,1.231,97,1.108,98,2.031,99,1.546,101,1.254,104,0.829,107,1.424,115,1.174,116,1.863,117,0.607,118,2.201,120,2.201,122,1.044,129,1.099,130,0.992,139,1.016,147,2.421,162,1.447,176,1.699,188,1.935,190,1.963,192,0.757,195,1.075,199,1.185,207,1.016,210,0.685,216,1.791,228,2.545,229,0.846,234,1.108,237,2.798,238,1.907,248,0.966,252,1.231,256,4.75,257,3.267,260,1.508,265,0.901,270,0.922,290,1.699,293,1.291,295,1.546,302,2.033,307,0.83,312,0.864,361,1.344,362,1.581,367,2.217,369,2.834,376,0.864,385,0.966,386,1.254,390,1.185,392,0.966,394,1.144,430,1.417,432,1.231,437,4.358,438,2.021,440,1.397,446,1.791,454,1.417,455,1.344,464,0.565,471,2.095,478,2.959,484,0.943,485,1.144,489,1.62,493,1.283,496,1.345,497,1.417,504,1.344,524,1.056,540,3.192,541,2.67,542,3.027,572,1.417,579,1.044,601,2.111,614,1.185,625,1.144,633,1.631,635,1.016,636,1.508,644,2.033,669,2.89,671,1.508,686,1.417,692,1.508,698,1.185,699,1.417,711,1.417,740,2.111,747,4.26,749,4.557,750,1.417,775,1.016,776,4.318,795,1.044,797,0.77,816,1.901,818,1.231,839,2.033,840,2.201,842,2.305,844,1.657,881,2.588,885,1.743,891,2.496,892,1.283,893,4.158,902,1.344,908,1.631,912,2.578,921,1.283,923,1.283,924,1.417,946,2.033,951,1.185,960,2.353,966,1.901,972,1.417,999,1.963,1014,1.631,1100,1.344,1138,1.283,1161,4.557,1202,2.431,1254,2.201,1261,2.431,1262,1.508,1274,3.7,1276,1.417,1278,1.417,1281,1.508,1306,1.283,1307,1.417,1328,1.283,1360,1.417,1420,1.817,1421,1.817,1422,3.785,1423,1.631,1424,1.817,1425,1.508,1426,5.586,1427,2.798,1428,1.817,1429,1.817,1430,1.817,1431,1.631,1432,1.817,1433,1.631,1434,1.631,1435,2.798,1436,1.417,1437,1.508,1438,3.675,1439,3.675,1440,1.631,1441,1.631,1442,4.095,1443,3.399,1444,1.631,1445,1.817,1446,1.817,1447,1.817,1448,1.817,1449,1.631,1450,1.508,1451,1.817,1452,2.798,1453,3.118,1454,1.817,1455,3.118,1456,1.817,1457,1.817,1458,1.344,1459,1.817,1460,1.508,1461,1.631,1462,3.118,1463,3.675,1464,3.192,1465,1.631,1466,1.817,1467,1.631,1468,3.118,1469,3.118,1470,3.118,1471,1.344,1472,1.283,1473,1.817,1474,2.305,1475,1.631,1476,1.817,1477,1.817,1478,1.817,1479,1.817,1480,1.817,1481,1.631,1482,1.817,1483,1.631,1484,1.283,1485,1.817,1486,1.817,1487,1.817,1488,1.817,1489,1.817,1490,1.817,1491,1.817,1492,1.817,1493,1.817,1494,1.817,1495,1.817,1496,1.631,1497,1.508,1498,1.817]],["t/210",[5,0.584,6,1.843,8,1.789,9,1.736,10,1.631,14,1.464,15,1.333,19,1.607,25,1.929,31,1.305,41,1.057,43,1.011,69,0.987,104,1.119,115,1.878,116,2.173,117,0.819,118,4.626,120,4.626,130,1.587,135,2.469,136,2.431,140,1.733,142,2.37,210,1.761,216,2.686,238,2.177,256,3.299,257,2.094,315,1.981,478,2.849,522,2.469,523,2.509,541,3.047,747,3.644,749,5.125,750,5.109,775,2.613,885,2.613,1161,3.165,1422,3.644,1426,6.282,1440,5.882,1441,5.882,1443,5.44,1499,4.674,1500,4.674,1501,7.569,1502,4.674,1503,4.674,1504,4.674,1505,4.674,1506,6.554,1507,6.554,1508,6.554]],["t/212",[5,0.887,6,1.595,14,1.016,21,1.916,34,1.647,39,3.772,51,1.804,52,1.357,53,1.243,62,3.306,75,2.935,87,1.916,90,2.307,99,2.603,105,2.224,117,1.125,203,3.705,205,3.305,209,2.495,219,3.016,229,2.445,230,3.554,253,3.705,312,2.495,326,3.554,329,5.01,367,2.397,412,3.881,438,2.185,458,3.305,472,3.104,582,3.6,610,3.554,797,2.224,813,3.199,923,3.705,934,6.372,936,3.881,948,5.248,966,3.199,998,4.092,1167,3.008,1173,3.052,1255,4.357,1295,3.881,1362,4.711,1365,4.193,1509,4.711,1510,5.249,1511,4.092,1512,4.711,1513,4.092,1514,5.249,1515,5.249,1516,5.249,1517,4.711,1518,5.249,1519,4.092,1520,4.357,1521,4.357]],["t/214",[5,1.178,6,2.059,34,1.838,51,1.904,52,0.934,53,0.97,98,2.748,138,3.489,250,4.368,367,3.361,443,3.752,444,2.884,489,2.912,547,2.809,797,3.12,954,4.635,995,3.377,1031,4.973,1315,5.196,1474,4.096,1511,4.319,1521,4.599,1522,5.541,1523,5.541,1524,5.541,1525,5.541,1526,4.973,1527,3.911,1528,5.541,1529,6.512,1530,6.11,1531,7.362,1532,7.362]],["t/216",[4,0.954,5,1.05,6,1.69,7,0.527,34,1.094,41,1.075,62,2.667,84,2.192,104,0.978,109,3.734,115,1.641,116,1.517,117,1.115,130,1.387,187,3.12,202,3.386,203,4.042,206,3.491,212,3.877,214,2.565,607,4.042,925,2.904,1138,4.042,1223,3.734,1259,3.877,1315,6.298,1444,5.14,1511,4.464,1533,5.727,1534,5.727,1535,4.905,1536,5.14,1537,5.14,1538,4.753,1539,2.722,1540,2.722,1541,5.14]],["t/218",[0,2.009,5,0.715,6,1.285,7,0.691,16,1.557,34,1.533,41,1.036,43,0.597,51,1.331,52,0.653,53,0.678,62,2.665,72,1.996,87,1.414,99,1.92,104,0.661,117,1.158,130,0.938,195,2.289,212,2.621,232,2.438,236,2.009,248,3.041,250,3.376,252,2.621,255,1.641,341,2.36,444,2.576,464,1.779,471,1.671,472,2.289,489,2.264,531,2.225,582,1.963,588,2.438,610,2.621,621,2.862,816,4.584,925,4.954,931,3.018,954,2.438,995,4.149,1198,2.621,1259,3.875,1315,6.54,1511,4.461,1521,4.75,1529,2.862,1535,5.231,1536,3.475,1538,3.214,1539,1.84,1540,3.814,1541,6.11,1542,4.461,1543,5.723,1544,3.475,1545,3.872,1546,2.862,1547,5.136,1548,3.214,1549,3.872,1550,3.872,1551,3.872,1552,5.723,1553,3.018,1554,3.214,1555,3.872]],["t/220",[7,0.496,12,3.75,16,2.169,19,1.416,21,1.968,41,0.835,43,0.832,45,2.326,76,3.28,84,2.064,117,1.168,130,1.306,137,4.838,139,3.014,206,3.286,209,2.562,229,2.511,249,2.673,255,2.285,265,2.673,312,2.562,326,3.65,327,2.908,444,2.306,482,2.616,524,2.448,531,3.097,579,3.097,581,2.865,607,3.805,672,3.65,925,2.733,995,3.286,1026,3.286,1036,3.014,1173,2.559,1254,3.805,1294,4.203,1364,3.286,1530,4.474,1535,5.316,1553,4.203,1556,4.278,1557,6.487,1558,3.366,1559,4.838,1560,3.394,1561,4.474,1562,4.838]],["t/222",[4,1.183,7,0.74,14,1.507,15,1.349,19,1.657,25,1.778,31,0.718,41,1.091,43,0.932,45,1.11,69,1.85,76,1.035,85,1.304,98,1.276,104,1.519,105,1.766,117,0.887,129,1.118,130,1.463,132,2.005,133,2.309,162,0.681,183,1.335,184,1.198,206,1.568,229,1.198,232,2.624,233,1.248,239,1.815,254,1.367,255,2.226,268,2.717,293,0.811,303,2.715,318,3.133,335,1.152,381,1.742,439,2.446,471,1.11,482,1.248,531,1.478,629,1.62,705,2.309,787,1.742,870,1.815,1010,4.422,1173,2.349,1320,3.106,1364,1.568,1365,2.446,1370,2.135,1450,2.135,1530,2.135,1535,4.876,1539,2.87,1540,2.87,1556,3.714,1558,3.748,1563,2.572,1564,2.135,1565,4.359,1566,5.507,1567,3.106,1568,4.167,1569,4.167,1570,2.572]],["t/224",[1,2.112,4,0.725,7,0.669,19,0.852,22,1.812,41,1.035,67,3.856,72,1.518,73,2.312,76,3.382,77,2.112,81,1.78,116,2.104,117,0.909,142,2.206,150,3.483,207,2.433,209,2.068,210,2.742,222,3.684,232,3.922,233,2.112,241,2.837,248,2.312,298,3.7,303,2.978,335,3.259,370,2.433,444,2.606,464,1.353,467,2.258,471,1.877,494,1.721,529,2.652,582,3.159,588,2.74,594,3.392,629,2.74,832,3.071,840,3.071,868,2.946,885,4.891,1080,2.37,1167,3.367,1173,2.813,1365,3.389,1556,3.707,1558,2.026,1571,3.905,1572,6.358,1573,3.611,1574,3.392,1575,4.218,1576,3.071,1577,3.217,1578,3.483]],["t/226",[0,2.015,4,0.647,12,2.015,19,1.476,21,1.418,28,3.385,32,1.418,39,2.064,41,1.054,43,0.885,67,1.885,69,1.696,104,1.286,116,1.029,117,0.717,130,1.652,176,2.116,187,2.116,219,2.232,222,2.297,239,2.742,254,2.064,255,1.646,303,1.589,305,4.91,327,3.03,335,1.74,341,2.368,374,4.454,392,3.624,444,1.099,462,3.486,463,3.125,471,1.676,478,2.368,542,5.568,547,1.97,601,5.1,625,2.446,699,3.028,823,2.872,841,3.884,868,2.63,966,2.368,1002,3.224,1100,2.872,1198,2.63,1259,4.618,1278,3.028,1497,4.761,1539,2.727,1540,2.727,1556,4.143,1558,3.917,1567,3.392,1578,2.172,1579,3.884,1580,3.884,1581,3.884,1582,3.224,1583,5.149,1584,5.661,1585,3.884,1586,3.486,1587,2.742,1588,3.884,1589,3.486,1590,3.884,1591,3.392,1592,5.737]],["t/228",[7,0.494,19,1.053,21,3.177,28,2.52,41,1.076,43,0.829,76,2.162,84,1.363,90,1.565,108,2.513,116,0.943,117,0.672,150,1.991,206,3.277,207,3.621,210,2.025,222,2.105,229,1.658,232,4.876,298,1.658,303,1.457,335,2.408,336,2.955,444,2.461,465,3.178,641,3.504,868,4.884,973,5.375,1167,3.582,1173,3.347,1259,2.411,1365,3.016,1366,3.639,1484,4.57,1535,2.321,1539,2.555,1540,2.555,1556,3.582,1558,3.606,1574,2.776,1575,2.411,1578,3.621,1586,3.196,1587,2.513,1593,3.561,1594,5.375,1595,3.561,1596,7.81,1597,7.81,1598,7.214,1599,3.561,1600,4.19,1601,3.561]],["t/230",[5,0.488,7,0.53,14,0.756,17,1.286,20,3.048,41,1.052,43,0.603,44,1.687,76,1.573,89,2.312,104,0.668,108,4.068,115,1.121,116,1.527,117,0.488,130,0.947,207,2.186,232,2.462,238,3.926,240,1.751,241,2.549,258,2.759,303,3.297,314,2.891,327,1.573,357,2.549,359,5.253,368,3.048,444,2.137,458,2.462,463,2.13,464,1.216,474,2.891,571,3.223,800,3.509,813,3.513,852,2.647,1090,3.509,1167,3.202,1173,2.424,1328,6.152,1346,3.048,1365,1.821,1539,2.74,1540,2.74,1556,3.414,1561,3.245,1575,2.647,1591,2.312,1602,6.781,1603,3.91,1604,3.245,1605,3.509,1606,7.556,1607,3.91,1608,3.91,1609,3.91,1610,3.91,1611,3.91,1612,3.91,1613,3.91,1614,3.91,1615,3.91,1616,5.764,1617,5.764,1618,5.764,1619,7.556,1620,3.91,1621,3.91,1622,3.91,1623,3.91,1624,3.91,1625,3.91,1626,3.91,1627,3.91,1628,3.91,1629,3.91,1630,3.91,1631,3.91,1632,3.91,1633,3.91,1634,3.91,1635,3.91,1636,3.91,1637,3.91,1638,3.91,1639,3.91,1640,3.91]],["t/232",[12,4.008,43,1.192,72,2.695,73,4.105,107,3.527,327,3.108,524,2.616,911,6.933,1556,4.205,1558,3.598]],["t/234",[0,2.984,4,0.649,5,0.718,7,0.628,9,1.523,14,0.754,21,2.495,34,0.745,37,1.542,45,1.682,51,1.976,52,0.97,53,1.007,75,2.179,76,1.568,77,1.891,81,1.595,84,3.223,109,2.541,116,1.032,117,1.088,129,1.046,174,2.881,222,2.304,228,1.815,234,2.375,248,2.071,250,1.933,265,1.933,286,5.161,293,1.229,294,2.75,297,3.498,311,2.541,312,1.852,313,3.498,325,2.304,327,3.503,341,3.505,421,3.038,424,2.454,432,2.639,438,2.845,442,1.713,444,1.933,464,1.212,465,3.4,490,2.541,524,1.32,531,2.239,547,1.976,581,2.071,593,3.038,606,3.038,826,3.235,847,3.235,931,3.038,966,2.375,997,2.541,1036,3.215,1167,1.652,1173,2.981,1207,2.541,1259,2.639,1260,2.179,1328,2.75,1349,2.639,1360,3.038,1376,3.235,1458,2.881,1527,2.75,1556,2.896,1560,4.303,1576,2.75,1587,2.75,1641,2.881,1642,3.498,1643,3.897,1644,3.498,1645,3.897,1646,3.038,1647,5.161,1648,3.498,1649,6.133,1650,3.498,1651,3.498,1652,3.498,1653,3.498,1654,3.235,1655,3.498,1656,3.498,1657,5.672,1658,3.498,1659,3.498,1660,3.498,1661,3.498,1662,3.498,1663,3.498,1664,4.483,1665,3.235,1666,3.498,1667,3.498,1668,5.161,1669,3.235,1670,3.498,1671,3.498,1672,3.498,1673,3.498,1674,3.498,1675,3.038,1676,3.498,1677,3.498,1678,3.038,1679,3.235]],["t/236",[45,2.676,51,2.132,75,3.468,76,2.495,84,3.033,117,0.775,174,4.585,327,2.495,421,4.835,424,3.905,432,4.199,438,3.299,464,1.929,524,2.1,547,3.145,606,4.835,966,3.78,1167,2.628,1173,2.805,1207,4.043,1360,4.835,1376,5.148,1560,4.988,1647,5.566,1648,5.566,1649,7.835,1650,5.566,1651,5.566,1652,5.566,1653,5.566,1654,5.148,1655,5.566,1656,5.566,1657,6.576,1658,5.566,1659,5.566,1660,5.566,1661,5.566,1662,5.566,1663,5.566,1664,4.835,1665,5.148,1666,5.566,1667,5.566]],["t/238",[51,2.325,81,2.768,84,3.477,109,4.409,116,1.792,117,1.045,222,3.999,228,3.15,265,3.354,327,2.721,465,4.947,490,4.409,531,3.886,826,5.614,1036,3.782,1173,3.217,1328,4.774,1657,5.614,1664,5.273,1668,6.07,1669,5.614,1670,6.07,1671,6.07,1672,6.07,1673,6.07,1674,6.07,1675,5.273,1676,6.07,1677,6.07]],["t/241",[4,1.06,7,0.74,14,0.867,16,1.803,19,1.246,25,1.319,31,1.251,32,1.636,41,1.074,43,0.692,45,1.934,52,1.073,53,1.114,69,0.946,84,1.716,85,2.272,86,3.218,104,1.087,117,0.924,129,1.203,162,2.252,255,3.135,293,2.681,294,3.163,303,2.603,318,3.301,327,3.735,328,3.72,341,2.732,524,2.155,559,3.72,628,3.931,672,3.034,818,3.034,1080,2.441,1556,1.899,1591,3.762,1680,4.482,1681,4.482,1682,4.482,1683,3.72,1684,4.509,1685,5.221,1686,4.482,1687,4.482,1688,4.482,1689,4.482,1690,4.022,1691,6.362,1692,4.482]],["t/243",[4,1.355,19,1.268,21,2.363,41,1.075,43,0.998,69,1.718,104,1.105,105,2.742,107,2.955,116,1.714,117,0.808,293,2.04,303,2.648,318,3.357,327,3.274,335,2.898,544,3.944,1556,2.742,1558,3.014,1591,3.826,1684,3.944,1685,4.567,1693,4.784,1694,4.567,1695,5.808]],["t/245",[7,0.559,19,1.19,34,1.161,41,1.068,67,2.949,76,2.444,104,1.038,116,2.071,117,0.977,142,3.081,205,3.826,231,4.737,298,2.83,303,2.486,327,3.145,367,2.774,444,2.445,868,4.114,885,4.834,1167,3.313,1173,2.769,1365,3.642,1572,6.102,1573,5.043,1575,4.114,1576,4.288,1578,3.397,1591,3.593]],["t/247",[4,1.394,5,0.71,7,0.796,9,2.217,14,0.742,16,2.286,21,2.075,22,1.597,34,0.733,41,0.818,42,2.758,43,1.045,44,1.655,51,1.318,52,0.958,53,1.185,54,2.267,55,2.414,56,2.038,69,1.687,76,2.286,84,1.468,89,3.36,98,1.902,102,2.706,106,1.655,107,1.751,115,1.099,116,1.016,130,0.929,187,2.089,188,1.358,189,2.337,192,1.597,202,2.267,204,2.835,225,1.944,226,2.337,233,1.861,249,3.712,266,1.685,290,2.089,298,1.786,305,3.704,326,2.596,327,2.286,331,3.704,345,2.596,392,2.038,439,1.786,440,1.717,465,3.36,471,1.655,481,1.597,547,2.881,571,2.144,572,2.989,638,2.596,670,1.944,672,2.596,702,3.357,912,2.414,927,3.183,995,2.337,1009,2.267,1010,2.267,1173,1.358,1208,2.5,1364,2.337,1535,2.5,1556,3.172,1558,3.153,1572,6.413,1577,2.835,1578,2.144,1694,2.706,1696,6.212,1697,3.835,1698,5.682,1699,3.835,1700,4.777,1701,3.183,1702,2.596,1703,3.442,1704,3.442,1705,3.835,1706,5.1,1707,3.442,1708,3.442,1709,3.442,1710,3.442,1711,3.835,1712,3.442,1713,3.183,1714,2.835,1715,3.183,1716,3.442,1717,3.183,1718,3.183,1719,2.835,1720,3.183,1721,3.183,1722,3.183,1723,2.835,1724,2.835]],["t/249",[4,1.108,7,0.611,21,3.291,34,1.271,69,1.404,77,3.228,105,2.818,107,3.78,117,0.831,130,1.611,189,4.054,207,3.719,222,4.895,249,3.298,327,3.33,335,2.979,430,5.185,444,1.881,494,2.631,793,4.336,912,4.187,982,4.895,1028,5.185,1111,4.503,1223,4.336,1642,5.969,1700,4.694,1725,6.651,1726,5.52,1727,6.651,1728,6.651,1729,6.651]],["t/251",[0,0.832,1,1.357,4,1.107,5,0.2,7,0.696,12,0.832,16,1.793,17,0.527,19,0.548,21,2.428,22,0.667,26,1.823,28,1.448,30,1.654,31,1.244,34,1.323,38,1.045,41,0.996,43,1.026,45,2.397,52,0.853,53,0.886,62,1.733,69,1.262,75,0.896,81,0.656,84,0.614,85,1.418,90,0.705,93,3.763,98,1.845,104,0.274,105,1.889,115,1.066,116,0.986,117,1.06,129,1.196,131,1.705,142,0.813,147,0.948,150,1.564,187,2.027,195,0.948,197,1.185,202,0.948,203,1.131,204,4.108,205,3.184,206,0.977,207,0.896,210,0.604,222,3.285,229,3.224,234,2.268,236,0.832,249,4.296,250,1.845,255,0.679,265,2.508,295,1.387,298,0.747,305,1.823,307,1.277,327,2.881,358,3.569,374,0.948,382,2.99,391,3.295,420,2.828,425,1.185,430,2.901,438,1.165,439,0.747,444,0.453,464,0.498,470,1.131,472,0.948,481,0.667,490,1.045,494,1.106,529,0.977,541,1.045,542,1.185,547,1.887,562,1.33,588,1.009,593,2.18,603,0.948,628,2.368,646,1.085,699,1.25,709,1.185,793,1.045,797,1.185,841,1.085,843,1.085,847,1.33,848,1.25,870,1.131,872,0.813,886,0.921,925,0.813,927,1.33,951,1.045,969,1.131,982,0.948,993,1.25,996,1.185,997,1.045,1010,2.2,1036,0.896,1066,1.439,1111,1.085,1167,3.125,1168,1.33,1172,2.08,1173,3.267,1223,1.045,1253,1.25,1273,1.25,1327,1.25,1340,3.088,1364,4.053,1365,3.855,1436,2.901,1474,1.185,1513,1.25,1527,1.131,1554,1.33,1556,3.206,1557,1.439,1558,2.952,1560,1.761,1564,1.33,1576,1.974,1577,1.185,1584,1.33,1587,1.131,1641,1.185,1675,2.901,1694,3.569,1702,3.424,1703,4,1704,1.439,1730,1.603,1731,1.33,1732,1.603,1733,2.797,1734,1.603,1735,3.721,1736,2.797,1737,1.603,1738,1.603,1739,1.603,1740,1.603,1741,1.603,1742,1.603,1743,4.987,1744,3.942,1745,5.968,1746,5.688,1747,5.688,1748,4.987,1749,4.987,1750,4.987,1751,1.603,1752,1.603,1753,2.797,1754,5.556,1755,1.603,1756,1.603,1757,1.603,1758,1.603,1759,1.603,1760,1.439,1761,1.603,1762,2.51,1763,1.603,1764,1.603,1765,1.603,1766,1.25,1767,1.33]],["t/254",[4,1.139,21,3.333,41,1.001,45,2.952,69,1.444,76,2.752,129,2.261,249,3.392,311,4.46,327,2.752,420,3.825,869,6.14,1641,7.234,1767,5.678,1768,6.841,1769,5.678,1770,6.841,1771,6.14,1772,9.13,1773,5.678]],["t/256",[4,0.615,7,0.759,12,1.916,14,0.714,17,1.215,19,1.082,21,3.014,41,0.921,69,0.779,76,2.222,77,2.681,104,0.631,116,1.463,117,0.461,129,0.991,187,2.012,192,2.3,233,3.566,269,3.174,270,2.801,298,1.72,300,3.314,327,1.485,335,1.654,374,2.183,428,3.367,442,1.623,444,1.044,459,2.879,464,1.148,465,2.183,470,2.606,482,3.818,529,2.251,544,4.478,571,2.065,607,2.606,621,2.73,740,2.5,817,5.185,886,2.122,912,2.325,969,2.606,1026,3.367,1036,2.065,1138,2.606,1167,3.498,1260,2.065,1261,2.879,1331,4.585,1333,3.065,1340,6.529,1345,3.065,1349,3.74,1368,4.585,1450,3.065,1474,2.73,1527,2.606,1553,2.879,1589,3.314,1665,3.065,1679,3.065,1690,3.314,1695,4.958,1702,6.758,1769,3.065,1774,7.06,1775,3.693,1776,5.524,1777,4.307,1778,5.524,1779,3.693,1780,3.693,1781,7.347,1782,7.347,1783,3.693,1784,3.693,1785,3.693,1786,3.693,1787,3.693,1788,3.693,1789,3.693,1790,3.693,1791,3.693,1792,3.693,1793,3.693,1794,3.693,1795,2.879,1796,3.314,1797,3.693,1798,5.524,1799,3.693,1800,3.693,1801,3.693,1802,3.693,1803,3.314]],["t/258",[4,0.855,7,0.785,16,2.066,21,3.366,26,3.349,32,1.875,41,0.716,52,0.866,53,0.899,69,1.084,76,2.066,77,2.493,93,3.234,116,1.36,172,4.004,199,3.349,210,1.935,211,3.478,236,2.665,270,3.547,298,2.392,312,2.441,335,3.133,343,4.937,385,2.729,455,3.797,511,4.404,544,4.264,588,3.234,625,3.234,628,2.729,817,6.507,872,2.604,886,2.951,935,4.263,1026,4.264,1028,4.004,1035,4.263,1167,2.964,1207,4.561,1273,4.004,1349,4.736,1578,2.872,1693,3.797,1701,7.417,1702,6.243,1774,6.278,1804,5.136,1805,5.136,1806,5.136,1807,4.263,1808,7.955,1809,5.136,1810,5.136,1811,5.136,1812,4.004]],["t/261",[4,0.859,5,0.644,7,0.645,21,2.911,22,2.148,41,0.997,51,1.773,69,1.089,72,1.799,84,1.975,85,2.616,90,2.267,104,0.881,106,2.226,117,0.877,130,1.249,131,3.144,187,2.81,222,3.05,239,3.641,311,3.363,327,2.075,341,3.144,358,3.641,367,2.355,381,3.493,412,3.814,425,3.814,438,2.921,444,1.459,456,2.884,470,3.641,544,4.276,872,2.616,1009,3.05,1026,4.276,1167,2.973,1173,2.823,1207,3.363,1260,2.884,1295,3.814,1349,4.75,1357,4.281,1364,3.144,1365,2.402,1458,3.814,1527,3.641,1556,2.186,1558,3.268,1641,3.814,1644,4.63,1669,4.281,1693,3.814,1694,3.641,1700,3.641,1702,4.75,1766,4.021,1777,5.469,1795,4.021,1796,4.63,1807,5.823,1812,4.021,1813,5.158,1814,4.281,1815,4.63,1816,4.281,1817,5.158]],["t/263",[7,0.576,19,1.228,21,3.481,22,2.609,23,5.625,117,1.096,192,2.609,199,4.086,311,4.086,327,2.521,444,1.772,482,3.871,614,4.086,618,4.886,803,5.202,817,6.517,872,3.178,931,4.886,935,6.62,1025,5.202,1207,5.2,1260,3.504,1345,5.202,1349,5.4,1467,5.625,1548,5.202,1641,4.633,1701,6.62,1702,5.4,1773,5.202,1818,6.267,1819,6.267,1820,6.267,1821,6.267]],["t/265",[6,1.659,7,0.679,19,1.091,21,2.696,41,1.058,43,0.859,77,2.702,90,2.447,104,1.261,116,1.475,117,1.103,130,1.348,131,3.393,142,4.475,233,2.702,327,3.333,438,2.318,445,2.542,447,3.292,448,3.292,456,4.129,603,3.292,685,4.34,885,3.112,912,3.505,1167,2.359,1173,1.971,1295,4.115,1297,4.62,1320,3.292,1365,2.593,1539,2.646,1540,2.646,1567,3.292,1572,5.212,1574,4.34,1575,5,1576,3.929,1578,3.112,1591,3.292,1646,4.34,1762,4.996,1822,5.567]],["t/267",[3,4.313,7,0.491,14,1.034,15,1.086,19,1.047,21,2.623,34,1.373,41,1.053,43,0.824,52,0.901,53,0.936,62,2.488,72,1.864,76,2.149,85,2.709,87,2.623,104,1.227,115,2.326,117,0.668,130,1.294,188,1.892,192,2.224,222,3.159,238,4.219,293,1.685,326,4.864,327,3.265,356,3.617,357,4.684,358,3.771,420,2.987,439,2.488,444,1.511,458,3.364,465,3.159,944,3.95,948,3.95,1004,4.434,1198,4.864,1320,3.159,1539,2.539,1540,2.539,1556,3.44,1567,3.159,1591,3.159,1602,4.795,1766,4.165,1823,5.343]],["t/270",[14,1.503,15,1.223,19,1.522,25,1.771,41,1.092,43,0.928,104,1.469,117,0.971,130,1.457,293,1.897,303,2.461,318,3.121,327,3.125,439,2.801,1320,3.557,1539,2.859,1540,2.859,1567,3.557,1591,4.593,1684,3.666,1685,4.245]],["t/272",[7,0.496,9,1.428,14,1.758,15,1.096,19,1.416,25,1.587,41,1.087,43,0.832,69,1.525,94,3.286,104,1.393,117,0.903,130,1.306,236,2.797,293,1.7,303,2.206,318,2.797,327,2.908,439,2.511,544,3.286,670,2.733,1026,3.286,1167,2.285,1320,3.188,1539,2.562,1540,2.562,1558,2.511,1567,3.188,1591,4.274,1684,3.286,1685,3.805,1693,3.986,1694,3.805,1700,3.805,1777,4.203,1795,4.203,1812,4.203,1816,4.474]],["t/274",[6,1.093,7,0.447,14,1.304,15,0.989,19,1.32,21,2.46,25,1.432,34,1.595,41,1.082,43,0.751,67,2.361,69,1.422,77,3.271,104,1.321,116,1.289,117,0.966,130,1.178,142,4.232,293,1.534,303,1.99,318,2.524,325,2.876,327,3.11,447,2.876,448,2.876,456,2.72,685,3.792,702,2.412,819,4.037,820,3.792,849,4.756,925,2.466,1167,2.061,1173,1.723,1331,4.037,1365,2.266,1472,3.433,1539,2.312,1540,2.312,1574,3.792,1575,4.563,1576,3.433,1578,2.72,1591,3.985,1646,3.792,1684,2.965,1685,3.433,1700,3.433,1824,4.865,1825,4.865,1826,4.865]],["t/276",[4,0.791,7,0.437,14,1.282,15,0.966,19,1.495,21,2.42,25,1.398,28,2.97,41,1.083,43,0.733,69,1.611,104,1.304,117,0.828,130,1.15,249,2.355,293,1.497,303,1.943,305,3.096,318,2.464,327,3.62,374,2.808,392,2.523,542,3.511,544,2.894,547,2.408,601,3.215,702,2.355,819,3.941,820,3.702,1026,2.894,1167,2.012,1173,1.682,1364,2.894,1497,3.941,1539,2.257,1540,2.257,1556,2.808,1558,4.192,1583,4.262,1584,5.5,1591,3.918,1684,2.894,1685,3.351,1693,3.511,1694,3.351,1700,3.351,1716,4.262,1777,3.702,1795,3.702,1812,3.702,1816,3.941]],["t/278",[7,0.751,19,1.275,43,1.004,101,2.617,104,1.111,117,1.169,203,4.592,207,3.638,209,3.092,219,3.738,249,3.226,350,3.457,444,1.84,465,4.829,524,3.023,598,4.81,813,3.966,886,4.692,1167,2.757,1168,5.4,1173,3.161,1260,4.566,1365,3.03,1366,4.405,1517,5.839,1556,3.782,1600,5.072,1827,6.506,1828,6.506]],["t/280",[4,1.274,7,0.761,14,0.922,15,0.969,16,1.918,19,1.302,41,1.081,43,1.025,52,0.804,53,0.835,69,1.837,104,1.413,117,0.596,130,1.155,192,1.985,209,2.266,249,2.364,255,2.02,303,1.951,307,2.177,310,4.051,318,2.474,439,2.22,456,2.666,464,1.482,465,2.819,524,2.802,667,3.525,739,3.365,740,3.228,813,2.906,886,2.739,1167,2.02,1173,2.353,1198,3.228,1320,2.819,1365,3.563,1366,3.228,1436,3.717,1539,2.266,1540,2.266,1556,3.819,1567,2.819,1578,3.716,1600,3.717,1829,3.957,1830,2.819,1831,5.516]],["t/282",[7,0.73,21,3.362,41,1.024,64,2.291,67,2.482,209,4.559,229,4.721,232,3.22,249,3.936,270,2.593,335,2.291,350,2.718,426,6.26,466,3.024,641,4.547,886,4.007,1172,5.363,1333,4.245,1366,6.041,1831,5.789,1832,5.114,1833,5.114,1834,5.114,1835,7.938,1836,7.938,1837,5.114,1838,5.114,1839,7.938,1840,5.114,1841,5.114,1842,4.59]],["t/284",[5,0.726,19,1.138,41,1.079,76,2.337,104,0.992,108,4.101,117,0.726,130,1.407,205,4.782,209,4.022,210,2.189,212,3.934,214,2.602,229,2.706,249,3.766,303,2.377,494,2.298,524,1.968,740,3.934,886,4.862,1167,2.462,1173,2.057,1365,4.179,1366,3.934,1538,4.822,1539,2.762,1540,2.762,1578,3.249,1831,6.304,1843,7.595,1844,7.595]],["t/287",[7,0.579,21,2.3,28,3.114,41,1.073,43,0.972,209,4.18,249,4.361,868,4.266,886,3.62,1173,2.834,1198,4.266,1365,4.096,1578,3.523,1587,4.447,1596,7.182,1597,7.182,1845,7.182,1846,6.3,1847,7.182,1848,6.3,1849,6.3]],["t/289",[41,1.014,43,1.184,444,2.171,813,5.504,886,4.41,993,5.984,1167,3.827,1365,4.205]],["t/291",[41,1.079,43,1.14,248,3.927,1315,5.216,1365,4.112,1554,6.134,1847,7.925]],["t/293",[41,1.047,43,1.184,209,3.648,249,3.806,1173,2.718,1850,9.03,1851,7.676,1852,7.676]],["t/295",[41,1.059,43,1.192,209,3.672,249,3.831,1167,3.274,1173,2.736,1600,6.022]],["t/297",[7,0.474,16,3.442,39,4.237,41,1.018,43,0.796,52,0.87,84,1.975,98,2.558,105,2.186,106,2.226,155,3.814,209,4.067,219,2.964,226,3.144,229,3.713,236,2.676,249,3.479,270,2.616,382,3.05,458,3.248,529,3.144,602,5.894,627,4.021,793,5.198,906,3.641,946,3.363,1009,3.05,1010,4.714,1173,3.594,1368,4.281,1845,4.63,1853,7.679,1854,6.297,1855,5.469,1856,7.973,1857,7.973,1858,5.158,1859,5.158,1860,5.158,1861,5.158,1862,5.158]],["t/299",[]],["t/301",[5,0.591,7,0.758,16,1.903,26,4.308,34,0.904,38,3.084,41,0.92,43,0.73,93,4.161,104,1.129,117,0.952,229,3.078,233,2.295,265,2.345,270,3.351,303,1.935,362,3.351,382,3.908,439,3.078,443,4.474,444,2.154,481,1.969,579,2.718,618,3.687,646,3.202,818,3.202,905,3.926,993,5.152,1010,4.504,1026,2.883,1172,3.695,1173,3.467,1364,4.028,1365,3.548,1556,3.228,1558,3.078,1559,5.931,1675,3.687,1726,3.926,1743,5.931,1744,5.938,1745,5.931,1746,5.931,1747,5.931,1748,5.931,1749,5.931,1750,5.931,1853,4.245,1863,4.73,1864,8.247,1865,4.245,1866,4.73,1867,5.931,1868,4.245,1869,4.245,1870,4.73]],["t/303",[4,0.664,5,0.498,7,0.637,14,0.772,16,2.353,17,1.312,21,1.456,26,4.973,30,2.358,34,0.762,41,0.979,43,0.615,52,0.673,69,1.61,84,1.527,101,2.353,105,1.69,116,1.549,117,0.731,130,0.966,190,2.511,209,1.896,210,1.503,229,4.19,231,3.109,233,1.936,253,2.815,254,2.119,265,3.783,303,1.632,311,3.813,335,2.62,336,3.31,370,2.23,455,2.948,464,1.819,481,3.746,628,3.108,641,2.6,709,2.948,905,5.748,925,2.022,1010,4.51,1035,3.31,1172,2.23,1173,3.555,1223,3.813,1364,5.174,1365,4.085,1366,2.7,1556,1.69,1558,1.857,1566,7.281,1744,3.109,1842,5.249,1865,6.216,1868,5.249,1869,3.579,1871,3.988,1872,3.579,1873,3.988,1874,3.579,1875,3.988,1876,3.988,1877,3.988,1878,3.579,1879,6.926]],["t/305",[7,0.57,19,1.215,26,4.043,41,1.068,52,1.046,53,1.086,67,3.01,69,1.309,76,2.495,116,2.099,117,0.775,142,3.145,205,3.905,231,4.835,298,2.889,303,2.538,444,2.469,868,4.199,885,4.881,1167,3.357,1173,2.805,1365,3.69,1558,2.889,1572,6.161,1573,5.148,1578,4.43]],["t/307",[4,1.302,7,0.795,14,1.176,15,1.235,16,2.444,19,1.19,41,1.071,43,0.938,52,1.025,53,1.064,69,1.65,104,1.477,117,0.759,130,1.472,192,2.53,255,2.575,307,2.774,439,2.83,667,4.492,670,3.081,739,4.288,1198,4.114,1320,3.593,1539,2.888,1540,2.888,1556,3.664,1558,4.027,1567,3.593,1830,3.593]],["t/309",[4,1.313,5,0.864,7,0.817,9,2.353,14,0.977,34,0.965,41,0.868,42,3.356,43,1.217,44,2.179,51,1.735,52,1.166,53,1.381,54,2.986,55,3.179,56,2.683,69,1.066,76,2.781,89,4.088,102,3.564,107,2.306,115,1.447,187,2.751,189,3.078,202,2.986,225,2.56,233,2.451,266,2.219,290,2.751,326,3.419,331,3.292,345,3.419,392,2.683,439,2.352,465,4.088,547,2.56,638,3.419,670,2.56,702,3.91,995,3.078,1208,3.292,1535,3.292,1556,3.342,1558,2.352,1572,5.985,1578,2.823,1706,6.206,1707,4.532,1708,4.532,1709,4.532,1710,4.532,1712,4.532,1713,4.191,1714,3.733,1717,4.191,1718,4.191,1719,3.733,1721,4.191,1722,4.191,1723,3.733,1724,3.733,1880,5.049,1881,5.049,1882,5.049]],["t/312",[7,0.69,14,1.451,15,1.159,19,1.469,25,1.678,41,1.09,43,0.879,69,1.769,104,1.432,117,0.712,130,1.38,303,2.332,318,2.957,439,2.654,1010,4.957,1173,2.018,1320,3.37,1535,4.89,1539,2.709,1540,2.709,1556,3.178,1558,3.493,1565,6.225,1566,4.73,1567,3.37]],["t/314",[14,1.484,15,1.199,19,1.502,25,1.736,41,1.091,43,0.91,69,1.244,104,1.455,117,0.737,130,1.428,303,2.413,318,3.059,439,2.746,456,3.297,1320,3.486,1539,2.802,1540,2.802,1558,3.571,1565,6.365,1567,3.486,1872,5.292,1883,5.896,1884,5.896,1885,5.896,1886,5.896,1887,5.896]],["t/316",[4,1.012,7,0.559,14,1.176,15,1.235,19,1.19,31,1.696,41,1.071,43,0.938,69,1.282,77,3.795,104,1.038,117,0.759,130,1.472,142,3.081,195,3.593,219,3.491,439,2.83,464,2.431,628,3.229,925,3.081,1172,3.397,1173,2.152,1320,3.593,1364,3.704,1365,4.251,1539,2.888,1540,2.888,1556,3.313,1558,2.83,1567,3.593,1744,4.737,1867,5.453,1888,6.076]],["t/319",[5,0.84,7,0.618,52,1.134,53,1.178,86,2.382,89,3.977,240,3.012,293,2.121,302,4.385,309,5.582,369,3.197,371,4.385,376,3.197,384,2.956,385,3.574,401,4.747,528,4.1,531,3.864,591,5.582,637,4.747,795,3.864,797,2.85,1148,8.132,1731,5.582,1889,6.726,1890,6.036,1891,9.061,1892,6.726,1893,6.726,1894,4.972,1895,6.726,1896,6.726]],["t/321",[0,3.286,7,0.738,28,3.43,31,1.768,41,0.822,52,1.068,53,1.109,60,4.233,63,5.936,64,2.837,66,3.745,70,4.129,129,1.7,130,1.534,201,4.682,228,2.95,538,4.937,585,3.861,635,3.541,813,4.894,851,4.937,872,3.211,1260,3.541,1773,5.257,1897,6.872,1898,6.334,1899,7.206,1900,7.206,1901,4.937,1902,6.664,1903,5.684,1904,5.684,1905,5.684]],["t/323",[4,1.108,7,0.829,26,4.336,28,3.221,36,4.917,45,3.572,60,3.78,63,4.917,129,1.785,188,2.355,192,2.769,250,3.298,338,3.932,388,5.185,440,2.979,489,2.631,585,5.047,635,4.629,985,4.917,1149,4.694,1484,5.843,1899,8.091,1906,6.651,1907,8.279,1908,6.651,1909,6.651,1910,6.651]],["t/325",[4,1.083,5,0.813,6,1.461,49,3.738,62,3.03,89,4.829,109,4.241,173,3.376,189,4.978,193,4.592,207,4.566,382,4.829,458,4.096,535,5.763,579,3.738,793,4.241,836,3.966,1044,3.638,1191,6.037,1223,5.324,1471,4.81,1537,5.839,1890,5.839,1911,5.839,1912,7.297,1913,5.142,1914,5.072,1915,5.839,1916,5.839,1917,6.506,1918,6.506]],["t/327",[4,1.038,7,0.573,31,2.218,38,4.065,41,0.814,45,2.69,104,1.065,117,1.093,129,1.673,130,2.12,160,5.175,162,1.651,225,3.161,229,2.904,232,5.005,233,3.026,238,2.904,252,4.221,254,3.313,270,3.161,293,1.966,298,2.904,384,2.74,528,3.8,628,3.313,629,3.925,861,5.595,1044,4.444,1191,4.609,1274,4.221,1304,5.595,1771,5.595,1912,6.822,1916,5.595,1919,5.595,1920,5.595,1921,6.235,1922,6.235,1923,6.235,1924,6.235]],["t/329",[1,2.033,4,0.431,5,0.323,7,0.385,14,1.288,15,1.073,17,2.19,18,2.836,22,1.078,31,2.093,32,1.926,39,2.226,43,0.814,45,1.807,51,1.813,64,1.16,69,0.884,72,0.903,76,1.041,86,0.917,87,1.529,91,1.827,93,1.63,98,1.284,99,1.284,106,1.807,116,1.606,117,0.89,129,1.416,131,2.553,138,4.191,142,3.073,162,1.397,166,1.688,170,1.807,173,2.737,176,2.282,184,1.206,193,1.827,210,0.975,211,2.836,222,1.531,229,1.206,235,4.481,238,1.206,255,1.097,257,2.982,265,1.284,290,2.282,295,2.077,301,3.119,302,5.09,305,2.731,312,1.23,319,2.173,322,3.302,331,1.688,335,2.715,338,1.531,359,1.688,371,1.688,384,1.841,385,2.226,389,2.149,392,1.376,393,5.031,420,4.193,466,1.531,467,1.343,474,1.914,481,1.078,482,1.256,484,1.343,496,1.117,511,2.637,524,2.412,528,1.578,571,1.447,579,2.407,582,1.313,592,2.95,598,1.914,600,1.753,601,1.753,604,3.723,614,1.688,620,2.324,628,1.376,638,1.753,709,3.097,790,3.216,793,1.688,795,2.407,854,2.149,870,2.956,872,1.313,893,1.688,966,1.578,985,1.914,1036,1.447,1100,1.914,1138,1.827,1191,1.914,1274,2.836,1306,1.827,1471,1.914,1484,1.827,1513,2.018,1548,4.379,1553,2.018,1556,4.073,1760,3.759,1830,1.531,1912,6.732,1913,4.915,1914,2.018,1915,2.324,1919,2.324,1925,2.324,1926,2.589,1927,2.589,1928,6.657,1929,2.589,1930,2.324,1931,5.275,1932,2.589,1933,1.914,1934,2.589,1935,2.324,1936,5.275,1937,2.589,1938,2.589,1939,2.589,1940,2.589,1941,2.589,1942,2.589,1943,2.589,1944,4.379,1945,2.324,1946,2.324,1947,2.589,1948,2.589,1949,2.589,1950,2.018,1951,2.589,1952,2.589,1953,2.589,1954,2.018,1955,2.589,1956,2.324,1957,2.589,1958,4.189,1959,2.589,1960,3.759,1961,2.018,1962,2.324]],["t/331",[5,0.686,6,1.233,7,0.757,12,4.27,17,1.806,31,1.532,34,1.049,38,3.579,51,1.887,62,2.557,84,2.102,89,3.246,95,3.717,109,3.579,117,1.142,130,1.33,150,3.07,162,1.454,173,2.848,189,3.346,233,3.551,301,4.326,303,2.246,325,3.246,376,2.609,442,2.413,444,2.482,464,3.031,531,3.154,541,4.77,578,3.457,581,3.888,770,4.927,797,3.101,836,3.346,995,3.346,1025,4.557,1044,3.07,1167,2.327,1173,1.944,1223,3.579,1327,4.28,1912,4.28,1944,4.557,1963,6.194,1964,4.927,1965,4.927,1966,4.927,1967,4.557,1968,5.49]],["t/333",[5,1.011,6,1.817,635,5.206,1969,9.311]],["t/335",[5,1.083,7,0.797,17,2.359,32,2.618,51,2.464,62,3.339,87,2.618,101,2.884,188,2.539,193,5.06,382,4.239,489,2.836,635,4.008,790,4.37,836,5.284,982,5.126,1582,5.95,1911,6.434,1970,5.06,1971,7.169,1972,6.434]],["t/337",[5,0.856,7,0.458,17,2.577,22,2.076,28,1.94,31,1.392,32,1.821,33,3.039,34,0.953,51,2.356,69,1.052,75,2.788,117,0.623,166,3.251,170,2.152,233,2.42,257,2.233,266,2.192,287,2.233,293,2.66,294,3.519,322,2.716,350,2.65,371,3.251,375,3.734,376,2.37,384,3.708,390,3.251,418,4.139,420,3.833,421,3.887,442,3.013,444,1.939,463,2.716,464,2.436,473,4.835,481,2.076,489,1.972,496,2.958,524,1.689,604,3.519,610,4.641,635,2.788,805,3.519,807,3.887,893,3.251,939,3.251,1044,2.788,1172,4.945,1294,3.887,1425,4.139,1431,4.475,1874,4.475,1945,4.475,1973,4.986,1974,4.986,1975,4.986,1976,4.986,1977,4.986,1978,4.986,1979,4.986,1980,4.986,1981,3.887,1982,3.686,1983,4.986,1984,4.475,1985,4.475,1986,4.986,1987,4.475]],["t/340",[5,0.864,7,0.566,14,1.444,15,0.666,16,1.318,17,1.078,19,1.462,22,1.365,29,1.832,31,1.717,41,1.074,43,0.779,61,5.171,73,1.742,81,2.065,117,0.864,129,0.879,138,3.874,139,1.832,170,2.655,188,2.447,229,2.35,262,2.555,266,1.441,289,3.971,302,3.29,303,1.341,318,1.7,335,1.468,367,2.304,370,1.832,375,2.749,382,2.984,444,0.927,446,2.899,463,1.785,464,1.569,466,1.938,473,3.784,481,2.101,489,2.734,524,2.084,525,1.742,571,1.832,635,1.832,672,4.166,790,3.751,805,2.313,902,2.423,1044,4.592,1172,3.864,1481,2.941,1484,2.313,1556,2.139,1830,1.938,1914,2.555,1920,4.529,1925,2.941,1963,2.313,1985,2.941,1988,2.313,1989,3.277,1990,5.046,1991,3.277,1992,5.046,1993,3.277,1994,5.046,1995,4.166,1996,2.941,1997,3.277,1998,3.277,1999,3.277,2000,3.277,2001,3.277,2002,5.736,2003,6.153,2004,5.107,2005,3.277,2006,3.277,2007,3.277,2008,3.277,2009,3.277,2010,3.277,2011,3.277,2012,3.277,2013,3.277,2014,3.277,2015,5.523,2016,2.219,2017,3.277]],["t/342",[5,0.981,7,0.46,14,1.714,17,1.647,19,1.347,31,1.919,32,2.51,37,1.981,41,1.044,61,3.153,67,2.43,69,1.057,92,3.052,98,2.483,104,0.855,116,1.821,142,2.539,188,1.773,202,2.961,228,2.332,254,2.661,257,2.243,259,4.494,287,2.243,289,4.511,293,1.579,294,3.534,302,4.482,386,2.014,390,3.264,424,4.328,473,2.539,489,1.981,524,1.696,525,2.661,603,2.961,1172,2.8,1913,4.943,1944,4.156,1950,3.903,1967,4.156,1988,3.534,1995,3.39,2002,6.516,2018,4.655,2019,5.007,2020,5.007,2021,5.541,2022,5.007,2023,6.875,2024,3.903,2025,5.007,2026,5.007,2027,6.875,2028,5.007,2029,5.007,2030,5.007,2031,5.007,2032,5.007]],["t/344",[5,0.854,9,1.523,14,1.46,17,1.282,19,1.478,31,1.088,32,1.423,41,1.084,61,2.454,64,1.745,69,1.592,87,1.423,104,0.666,105,2.437,117,0.487,130,0.944,139,2.179,144,3.235,170,1.682,188,1.38,214,1.745,226,4.904,262,3.038,289,2.239,358,2.75,367,2.626,424,2.454,467,2.022,489,2.275,579,2.239,604,2.75,785,4.251,878,3.235,887,6.988,925,1.976,1026,2.375,1830,3.4,1913,2.454,1933,4.251,1988,2.75,2002,3.235,2004,6.678,2015,6.133,2016,3.893,2018,5.448,2033,3.897,2034,3.897,2035,5.75,2036,3.897,2037,3.897,2038,3.897,2039,3.897,2040,5.75,2041,3.897,2042,5.161,2043,5.75,2044,3.897,2045,3.897,2046,3.897,2047,3.235,2048,3.897,2049,3.897,2050,3.897,2051,3.897,2052,3.897,2053,5.75,2054,3.498,2055,3.038,2056,3.897,2057,3.897,2058,3.897]],["t/346",[5,0.6,6,1.079,7,0.614,41,1.069,61,3.026,69,1.014,117,0.96,130,1.164,150,3.736,188,1.702,289,4.414,293,2.107,420,4.295,446,2.761,464,2.389,466,2.842,493,3.392,581,2.554,710,3.553,804,3.746,823,3.553,1044,3.736,1080,3.64,1167,2.037,1172,3.736,1173,1.702,1575,3.254,1769,3.989,1830,2.842,1913,3.026,1963,5.422,1967,3.989,1982,3.553,1995,3.254,2004,5.546,2016,3.254,2018,3.254,2021,3.392,2024,3.746,2059,5.998,2060,6.683,2061,3.553,2062,6.683,2063,6.683,2064,4.313,2065,6.683,2066,4.313,2067,4.806,2068,4.806,2069,6.683,2070,6.683,2071,6.683,2072,6.683,2073,4.806,2074,4.806,2075,4.806]],["t/348",[1,2.583,13,1.71,18,3.604,28,1.021,31,0.732,41,1.086,46,5.058,61,3.351,69,1.289,98,1.301,101,1.055,116,1.618,117,0.529,142,1.33,162,1.898,170,3.092,173,2.196,176,2.899,229,3.337,235,5.298,236,1.361,255,1.794,262,6.485,265,2.639,289,3.851,293,0.827,302,2.76,319,2.196,322,2.899,335,1.175,367,1.198,400,2.177,418,2.177,420,4.386,435,2.177,473,2.146,489,2.651,524,1.434,571,1.467,604,1.851,710,1.939,790,3.723,813,3.244,841,1.776,843,1.776,923,1.851,1172,2.367,1436,3.3,1484,2.988,1556,2.588,1830,2.503,1913,3.351,1930,4.777,1933,3.935,1935,2.354,1946,2.354,1956,2.354,1961,4.149,1984,2.354,1995,3.604,2016,4.537,2018,4.136,2021,3.756,2047,5.07,2055,3.3,2059,2.354,2061,3.935,2076,2.623,2077,2.623,2078,2.623,2079,2.623,2080,2.623,2081,2.623,2082,5.322,2083,4.233,2084,3.514,2085,4.233,2086,2.623,2087,4.233,2088,2.623,2089,2.623,2090,2.623,2091,2.623,2092,2.623,2093,2.623,2094,2.623,2095,2.623,2096,2.623,2097,3.3,2098,4.233,2099,4.233,2100,3.514,2101,2.623,2102,2.623,2103,2.623,2104,2.354,2105,2.177,2106,2.177,2107,2.177]],["t/350",[1,2.095,5,0.951,6,0.97,7,0.497,17,1.78,32,0.981,34,1.297,39,1.428,41,1.049,46,3.047,51,2.129,52,0.453,53,0.471,61,1.692,62,1.252,69,0.567,72,0.938,84,1.029,87,1.576,92,1.638,99,1.333,117,0.774,150,1.503,170,1.16,173,1.395,195,1.589,197,1.139,228,1.252,230,1.82,235,1.987,254,1.428,265,1.333,289,2.481,303,1.1,322,2.352,362,1.363,370,1.503,385,1.428,386,1.737,387,2.412,390,1.752,392,1.428,420,4.257,438,2.579,442,1.898,443,1.82,444,2.507,445,1.227,446,1.544,463,2.948,464,2.462,466,1.589,467,2.24,472,1.589,473,4.343,475,1.82,481,1.119,489,1.063,493,3.047,571,1.503,581,1.428,619,1.987,621,1.987,625,1.692,641,1.752,710,1.987,775,2.414,790,3.776,797,1.83,805,6.046,806,2.412,807,4.218,843,1.82,885,3.025,950,2.412,954,1.692,956,3.663,969,1.897,973,3.583,985,1.987,1172,1.503,1191,3.192,1207,1.752,1256,2.412,1259,1.82,1425,2.231,1465,2.412,1526,4.856,1527,3.047,1529,1.987,1562,2.412,1814,2.231,1829,2.231,1913,1.692,1914,2.095,1933,1.987,1961,2.095,1963,3.047,1982,1.987,1995,1.82,2016,4.594,2018,3.663,2021,4.372,2024,2.095,2055,2.095,2061,1.987,2084,2.231,2097,2.095,2100,3.583,2105,2.231,2106,2.231,2107,2.231,2108,2.688,2109,2.688,2110,2.688,2111,2.688,2112,3.875,2113,4.317,2114,4.317,2115,4.856,2116,2.412,2117,2.688,2118,2.688,2119,4.317,2120,4.317,2121,4.317,2122,2.688,2123,2.412,2124,2.412,2125,2.688,2126,2.688,2127,2.688,2128,2.688,2129,2.688,2130,2.688,2131,2.688,2132,2.688,2133,2.688,2134,5.411,2135,2.688,2136,2.688,2137,2.688]],["t/353",[5,0.791,17,2.082,34,0.85,41,1.077,46,4.467,51,1.529,61,2.801,64,1.992,69,0.939,101,1.789,107,2.031,116,1.178,129,1.698,130,1.077,170,1.919,173,2.308,202,2.63,232,2.801,234,2.711,235,3.289,265,3.653,289,3.636,303,1.82,312,2.114,322,3.448,420,3.538,442,1.955,444,2.083,464,2.637,472,2.63,474,3.289,481,1.852,489,1.76,790,3.858,837,3.692,923,3.139,1080,2.423,1471,3.289,1520,3.692,1913,2.801,1933,3.289,1950,4.934,1961,3.468,1963,3.139,1981,3.468,1982,3.289,1988,3.139,1995,3.012,2016,4.285,2018,3.012,2021,3.139,2024,3.468,2055,3.468,2061,3.289,2084,3.692,2097,3.468,2100,5.253,2104,3.992,2105,3.692,2106,3.692,2107,5.253,2123,3.992,2124,3.992,2138,6.329,2139,6.329,2140,4.448,2141,3.992,2142,4.448,2143,4.448,2144,4.448,2145,4.448]],["t/355",[1,1.912,4,0.4,5,1.107,6,1.302,7,0.632,14,0.465,15,0.488,17,1.907,19,0.47,34,1.791,35,1.993,39,1.276,40,2.203,41,0.999,51,2.497,61,3.154,62,1.119,69,1.057,72,1.748,87,0.877,91,1.695,95,1.626,107,1.097,117,0.8,129,0.644,138,2.481,173,1.246,189,1.464,195,1.42,197,1.67,219,1.38,236,1.246,245,1.776,248,1.276,250,2.484,289,1.38,298,2.7,307,1.097,310,1.464,329,2.781,331,1.566,369,1.141,370,1.343,371,1.566,379,2.402,384,1.056,389,4.811,390,4.173,420,3.241,422,1.993,424,1.512,438,2.086,444,2.39,445,1.799,456,2.203,464,2.442,466,3.428,467,3.008,472,2.33,473,1.218,476,2.913,481,1.64,482,1.166,489,2.532,490,1.566,493,1.695,494,0.95,524,0.813,529,1.464,546,1.566,577,1.695,603,1.42,609,2.156,619,1.776,621,2.913,637,4.091,646,1.626,686,1.872,702,1.954,772,1.695,775,2.203,790,3.901,797,1.018,805,3.536,816,2.402,837,1.993,841,1.626,843,1.626,872,1.218,900,1.872,936,2.913,954,5.089,956,2.962,995,3.054,997,1.566,1199,2.156,1208,1.566,1255,1.993,1297,1.993,1315,1.695,1327,1.872,1349,1.626,1449,4.497,1513,1.872,1529,4.732,1542,1.872,1571,2.156,1587,1.695,1684,2.402,1726,1.993,1807,3.27,1814,1.993,1913,3.65,1950,3.072,1963,4.091,1981,3.072,1982,1.776,1988,1.695,1995,3.392,2016,2.668,2018,2.668,2021,2.781,2054,4.497,2061,1.776,2064,2.156,2112,3.536,2115,2.156,2116,2.156,2141,2.156,2146,2.402,2147,3.94,2148,2.402,2149,2.402,2150,2.402,2151,2.402,2152,2.402,2153,2.402,2154,2.402,2155,2.402,2156,2.402,2157,2.402,2158,2.402,2159,2.402,2160,3.94,2161,2.402,2162,3.94,2163,3.94,2164,5.01,2165,2.402,2166,2.402,2167,2.402,2168,2.402,2169,2.156]],["t/359",[22,3.237,31,2.17,60,4.154,1897,6.061,2170,7.131,2171,6.979,2172,7.776,2173,7.776,2174,7.776]],["t/361",[5,0.991,7,0.729,17,2.609,107,3.621,129,2.128,200,6.582,412,5.863,2175,7.93,2176,7.117]],["t/364",[5,0.993,7,0.805,22,3.309,28,2.426,29,3.486,41,0.896,65,4.065,66,4.7,95,4.221,101,2.508,129,1.673,240,2.792,248,3.313,255,2.642,500,4.4,667,4.609,852,4.221,872,3.161,951,4.065,1460,5.175,1509,5.595,1830,3.686,2170,6.47,2177,6.235,2178,6.235,2179,5.595,2180,6.235,2181,5.175,2182,7.134,2183,7.949,2184,6.235,2185,6.235,2186,6.235,2187,6.235,2188,5.595,2189,6.235,2190,5.595,2191,6.235,2192,6.235]],["t/366",[5,0.977,7,0.719,17,1.634,22,4.073,53,1.475,60,3.121,63,5.053,66,4.042,95,4.628,96,6.135,98,2.462,106,2.949,173,2.576,187,2.705,209,2.36,240,3.061,295,2.462,301,2.936,524,1.682,600,3.362,740,3.362,805,3.505,844,2.639,862,3.505,960,2.853,971,4.121,996,3.671,999,3.126,1223,3.237,1356,5.053,1460,4.121,1512,4.457,1542,3.871,1830,4.042,1897,6.093,2170,7.042,2171,4.457,2176,4.457,2181,4.121,2188,4.457,2193,4.966,2194,6.835,2195,4.966,2196,6.835,2197,6.835,2198,6.135,2199,6.835,2200,7.817,2201,4.966,2202,4.966,2203,4.966,2204,6.835,2205,4.966,2206,4.966,2207,4.966,2208,4.966,2209,4.966]],["t/368",[7,0.827,17,2.509,28,3.5,60,3.482,69,1.61,446,4.382,524,2.583,579,4.382,1356,5.638,2170,5.638,2181,6.33,2210,6.845,2211,7.627]],["t/372",[1,3.577,3,2.626,4,0.823,5,0.851,7,0.556,8,1.221,10,1.113,28,1.923,30,2.922,32,1.165,41,0.754,43,0.492,51,1.698,52,1.514,53,1.572,62,1.486,72,1.724,86,2.413,87,1.165,98,2.451,99,1.582,104,1.033,117,0.399,129,0.856,162,1.805,173,2.564,177,4.102,202,1.886,236,1.655,238,3.914,240,3.051,241,2.08,265,2.451,266,2.659,267,2.251,270,1.617,293,1.907,295,1.582,305,2.08,319,3.139,322,3.296,338,2.922,350,1.695,356,3.346,357,4.442,359,2.08,361,2.358,368,2.487,371,4.806,375,2.692,376,1.516,379,4.753,384,2.172,442,2.659,445,1.457,451,2.648,467,1.655,471,2.61,489,1.262,496,1.376,511,2.008,513,2.08,592,2.763,602,2.358,628,1.695,644,2.08,711,2.487,836,1.944,956,3.577,961,3.222,982,1.886,988,2.251,995,3.687,999,2.008,1044,1.784,1050,2.008,1064,2.648,1080,1.738,1081,2.251,1149,3.488,1180,3.853,1260,1.784,1384,2.648,1472,3.488,1519,2.487,1605,4.435,1684,3.012,1731,2.648,1855,3.853,1987,2.863,2212,4.942,2213,3.19,2214,4.942,2215,4.942,2216,4.102,2217,6.05,2218,4.942,2219,4.942,2220,4.942,2221,4.942,2222,4.942,2223,4.942,2224,3.19,2225,2.863,2226,2.863,2227,2.863,2228,3.19,2229,3.19,2230,3.19,2231,3.19,2232,3.19,2233,3.19,2234,3.19,2235,3.19,2236,3.19,2237,3.19,2238,3.19,2239,4.942,2240,3.19]],["t/374",[4,1.044,6,1.408,7,0.733,28,2.439,38,4.086,41,0.641,51,2.154,52,1.345,53,1.397,162,2.113,216,3.601,218,4.243,228,2.919,257,2.807,270,3.178,376,4.169,452,5.625,467,3.252,471,3.441,496,3.441,511,3.946,528,3.82,541,4.086,614,4.086,891,4.861,956,3.706,1044,4.905,1050,3.946,1180,6.839,1260,3.504,1475,5.625,2241,6.267,2242,6.267,2243,6.267,2244,6.267,2245,6.267]],["t/376",[6,1.038,7,0.86,17,2.474,45,1.994,51,1.588,52,1.268,53,1.317,67,2.242,72,1.612,98,2.291,99,2.291,129,1.24,176,3.541,195,2.732,228,2.152,257,4.191,290,2.517,312,2.196,322,2.517,366,4.147,369,2.196,374,2.732,376,2.196,392,2.455,428,2.816,478,2.816,484,2.397,489,1.828,496,2.805,511,2.909,524,1.565,529,2.816,540,5.863,544,2.816,610,3.128,614,3.012,692,3.835,698,3.012,749,5.824,816,2.816,818,3.128,840,3.261,844,2.455,891,4.585,894,3.835,945,3.602,948,3.416,949,3.835,960,2.655,988,3.261,1028,3.602,1036,2.583,1254,3.261,1261,5.068,1298,3.835,1307,3.602,1422,6.706,1426,5.396,1427,5.834,1433,4.147,1434,4.147,1435,6.75,1437,3.835,1472,3.261,1496,4.147,1520,3.835,1542,3.602,1564,3.835,1767,3.835,1954,3.602,1960,4.147,1962,4.147,1964,4.147,2246,6.501,2247,4.147,2248,4.62,2249,4.147]],["t/379",[4,1.328,13,4.086,14,1.213,15,1.622,18,5.4,30,3.706,41,0.898,72,2.186,97,3.82,138,3.946,147,3.706,176,5.194,199,4.086,238,2.919,240,4.136,248,3.33,318,3.252,547,3.178,1298,5.202,1472,4.423,1519,4.886,2226,7.873,2227,7.873,2250,8.773,2251,8.773,2252,6.267,2253,6.267,2254,6.267,2255,6.267]],["t/382",[16,2.833,34,1.346,52,1.446,53,1.233,81,2.882,98,3.492,131,4.293,197,3.919,205,4.434,228,3.994,229,3.28,293,2.221,444,1.992,464,2.19,471,3.039,544,4.293,818,4.768,921,4.97,1173,3.408,1577,5.207,2225,6.321]],["t/384",[3,4.101,5,0.744,7,0.548,12,3.09,17,1.959,28,3.003,52,1.004,53,1.043,81,2.437,84,2.28,115,1.707,117,0.964,192,2.479,205,5.391,233,2.89,238,3.988,359,3.882,382,4.564,420,3.33,436,4.943,442,2.617,458,3.749,471,2.57,578,4.859,582,3.019,646,4.032,666,4.402,776,5.226,777,6.624,790,3.63,815,4.859,872,3.019,921,4.203,949,4.943,995,3.63,1004,4.943,1017,4.943,1483,5.345,1954,4.642,2256,5.955,2257,5.955,2258,5.955,2259,5.955,2260,5.955]],["t/386",[17,2.117,19,1.883,43,1.252,107,3.703,189,4.944,238,2.997,240,2.883,362,4.112,438,2.68,444,1.82,464,2.989,482,3.123,777,4.542,815,4.052,939,6.398,988,5.724,996,4.758,998,5.017,1173,2.872,1357,5.342,1519,6.323,1988,4.542,2261,6.436,2262,6.436]],["t/388",[3,4.132,4,1.295,17,2.558,62,3.621,72,2.712,238,3.621,325,4.598,356,5.264,362,3.942,787,6.16,836,4.739]],["t/390",[1,2.466,3,3.69,4,0.408,5,0.808,6,0.551,7,0.467,9,0.649,14,0.474,15,1.033,17,1.672,19,0.785,29,1.37,32,1.463,34,1.461,41,0.949,52,0.99,53,1.028,62,1.141,64,1.098,75,1.37,79,1.098,87,0.895,99,1.987,101,2.602,104,1.002,116,1.346,117,0.635,129,0.658,130,1.567,155,2.962,185,4.217,186,1.812,192,1.668,233,1.189,238,3.79,254,2.129,295,1.215,311,1.598,329,1.73,331,1.598,350,1.302,356,3.44,361,1.812,362,2.031,367,1.829,368,1.911,374,1.449,381,1.659,385,1.302,394,1.543,422,2.034,438,1.668,443,4.961,444,0.693,453,2.034,454,1.911,458,2.522,464,1.58,467,2.079,474,4.338,476,1.812,481,3.051,484,1.272,489,2.321,496,1.058,504,4.338,529,1.494,530,2.2,531,1.408,578,2.522,615,2.2,616,1.73,619,3.756,643,1.73,671,2.034,694,1.911,698,1.598,716,4.217,747,4.575,775,3.617,792,2.2,793,2.612,797,2.742,844,1.302,878,4.217,881,2.034,885,3.882,886,1.408,913,2.2,923,2.827,924,1.911,944,1.812,946,2.612,948,1.812,966,1.494,1032,2.2,1036,1.37,1097,3.123,1111,1.659,1163,1.911,1167,1.039,1173,0.868,1253,1.911,1254,1.73,1260,1.37,1276,1.911,1278,1.911,1281,2.034,1291,2.2,1328,4.142,1346,1.911,1422,6.628,1423,5.267,1437,2.034,1438,2.2,1439,4.56,1443,4.217,1472,1.73,1529,1.812,1546,1.812,1664,1.911,1766,1.911,1803,2.2,1854,2.2,1966,2.2,2042,2.2,2047,3.325,2066,2.2,2169,2.2,2182,2.2,2190,3.596,2198,5.267,2247,3.596,2263,2.451,2264,2.451,2265,2.451,2266,2.451,2267,2.451,2268,2.451,2269,2.451,2270,2.451,2271,2.451,2272,2.451,2273,2.451,2274,2.451,2275,2.451,2276,2.451,2277,2.451,2278,2.451,2279,2.451,2280,2.451,2281,2.451,2282,2.451,2283,2.451,2284,2.451,2285,2.451,2286,2.451,2287,2.451,2288,2.451,2289,2.451,2290,2.451,2291,2.451,2292,2.451,2293,2.451,2294,2.451,2295,2.451,2296,2.451,2297,2.451,2298,2.451,2299,2.451,2300,2.451,2301,4.006,2302,2.451,2303,2.451,2304,2.2,2305,2.451,2306,2.451,2307,2.451,2308,4.006,2309,2.451]],["t/392",[0,4.087,4,1.312,9,2.087,15,1.602,19,1.543,43,1.216,72,2.748,458,4.96,582,3.994,836,4.802]],["t/394",[4,0.963,5,0.491,6,0.537,7,0.79,8,1.503,10,1.37,15,0.486,16,0.962,17,1.903,28,3.051,29,1.337,31,1.096,32,1.434,37,1.976,39,1.271,41,0.986,42,1.906,43,0.892,44,4.241,45,3.129,46,1.688,49,4.351,50,3.571,51,1.988,52,1.158,53,1.413,54,2.954,55,3.641,56,2.087,60,1.092,66,2.322,67,2.425,69,0.829,72,1.37,89,1.414,98,1.186,104,0.409,105,1.664,129,1.714,130,1.401,139,1.337,162,1.323,173,1.241,190,1.506,255,1.014,256,2.772,266,3.017,267,1.688,269,2.256,270,1.213,290,1.303,293,0.754,301,1.414,319,1.241,328,1.985,345,2.659,367,1.092,369,3.036,375,4.125,379,1.458,384,1.051,385,1.271,392,1.271,401,1.688,402,2.147,411,1.985,424,1.506,463,1.303,471,1.695,475,1.62,496,1.032,513,2.56,524,1.33,541,2.56,546,2.56,560,3.915,561,1.865,574,2.147,578,1.506,579,1.374,582,1.213,585,2.394,592,3.838,629,1.506,823,1.768,849,1.688,891,1.458,925,1.213,945,1.865,951,1.559,956,2.954,960,2.256,961,3.77,964,2.147,971,1.985,976,3.26,982,1.414,1107,2.147,1108,2.147,1109,2.147,1161,2.659,1200,2.147,1201,2.147,1202,3.062,1208,1.559,1212,3.525,1274,1.62,1284,1.865,1324,3.26,1356,1.768,1560,1.506,1714,1.768,1723,2.903,1724,3.694,1829,1.985,1894,1.768,1954,1.865,2210,2.147,2310,2.392,2311,2.392,2312,2.392,2313,2.392,2314,2.392,2315,2.392,2316,2.392,2317,2.392,2318,3.525,2319,2.392,2320,2.392,2321,2.392,2322,1.985,2323,3.26,2324,3.26,2325,1.985,2326,2.392,2327,2.147,2328,3.927,2329,2.147,2330,2.392,2331,2.392,2332,2.392,2333,4.996,2334,2.392,2335,2.392,2336,2.392,2337,2.147,2338,2.392,2339,2.392,2340,2.392,2341,2.392,2342,2.392,2343,2.392,2344,3.927,2345,2.392,2346,3.927,2347,2.392]],["t/396",[0,2.249,5,0.542,6,0.974,7,0.399,9,1.148,15,0.881,28,2.418,32,1.583,41,0.444,42,2.104,43,0.959,44,4.044,45,1.871,46,6.794,49,3.57,50,4.061,51,1.49,52,1.338,53,1.576,54,2.563,55,4.573,56,2.304,57,3.891,58,5.577,64,1.942,65,2.826,66,3.674,67,2.104,72,2.167,84,1.66,104,1.24,105,1.837,130,1.05,139,2.424,162,1.148,187,2.362,219,2.491,240,1.942,266,2.731,267,3.06,290,2.362,345,2.935,375,2.362,392,2.304,513,2.826,582,2.198,602,3.205,702,2.15,841,2.935,956,2.563,961,2.826,976,5.157,1208,2.826,1284,4.844,1560,2.73,1678,3.38,1714,3.205,1719,4.594,1723,3.205,1724,5.369,1894,3.205,1970,4.385,1996,3.891,2216,3.598,2322,3.598,2323,3.598,2324,3.598,2325,3.598,2327,6.518,2329,6.518,2337,3.891,2348,4.335,2349,4.335,2350,4.335,2351,5.577,2352,5.577,2353,6.214,2354,4.335,2355,4.335,2356,4.335,2357,3.891]],["t/398",[4,1.321,28,3.086,52,1.337,53,1.389,60,3.621,72,2.766,307,3.621,2358,7.93,2359,7.93]],["t/400",[0,2.156,3,2.208,5,0.519,6,1.353,7,0.652,8,1.59,9,1.1,10,1.449,15,0.845,19,1.18,28,3.026,41,1.047,42,2.016,43,0.641,52,0.701,53,0.728,60,2.751,63,6.104,64,2.699,66,2.456,72,1.449,81,1.7,84,1.59,90,1.826,104,1.029,117,0.753,119,2.932,127,5.408,129,1.115,130,1.006,160,5.001,162,1.596,163,3.239,164,3.369,165,3.239,176,3.283,201,3.071,209,1.975,228,1.935,266,2.648,267,2.932,268,3.928,293,1.9,376,2.864,463,2.263,475,2.813,524,1.407,538,3.239,578,2.616,585,2.532,629,2.616,702,2.06,813,2.532,925,3.055,946,2.708,1002,3.448,1077,3.448,1138,2.932,1260,2.323,1558,1.935,1577,3.071,1719,3.071,1830,4.598,1894,3.071,1897,6.063,1900,3.729,1902,5.001,1903,3.729,1904,3.729,1905,3.729,2097,4.697,2351,3.729,2352,3.729,2360,4.154,2361,7.777,2362,6.026,2363,3.729,2364,4.154,2365,4.154,2366,4.154,2367,4.154,2368,4.154,2369,4.154,2370,4.154,2371,4.154,2372,4.154,2373,4.154]],["t/402",[5,0.947,17,2.493,60,3.46,72,2.644,84,2.901,90,3.331,240,3.394,442,3.331,456,4.237,983,6.802,1262,6.29,1830,4.481,2170,6.626,2374,7.578,2375,7.578]],["t/404",[7,0.68,28,2.876,37,2.924,51,3.035,188,2.617,192,3.077,524,2.503,851,5.762,892,5.216,961,4.818,1129,6.633,1222,6.633,1901,5.762,2376,7.391,2377,7.391,2378,7.391,2379,7.391,2380,7.391,2381,7.391]],["t/406",[14,1.287,15,1.683,28,2.588,51,2.845,52,1.396,53,1.45,60,3.037,64,2.979,106,2.87,188,2.932,204,4.917,367,3.037,394,4.187,489,2.631,906,4.694,1012,5.185,1284,5.185,1654,5.52,2382,6.651,2383,6.651,2384,6.651,2385,6.651,2386,7.431,2387,6.651,2388,6.651,2389,6.651,2390,6.651,2391,6.651,2392,6.651,2393,6.651,2394,6.651,2395,6.651]],["t/408",[15,1.399,28,3.29,51,3.281,52,1.544,53,1.205,64,3.787,115,2.423,307,3.142,446,3.953,489,2.722,524,3.1,669,4.856,784,5.087,892,4.856,1385,6.175,2386,7.588,2396,9.153,2397,6.88,2398,6.88]],["t/410",[51,2.725,52,1.337,53,1.389,129,2.128,312,3.769,338,4.689,836,4.834,1901,6.182,2399,7.93]],["t/412",[7,0.534,15,1.181,28,2.261,34,1.11,39,3.088,40,3.249,42,2.82,44,3.651,45,2.507,49,3.338,50,3.249,52,1.513,53,1.572,66,3.436,81,2.377,106,2.507,117,0.726,197,2.462,209,2.762,258,4.101,261,5.215,266,2.554,267,4.101,287,2.602,312,2.762,369,3.61,370,4.247,375,3.165,386,2.337,447,3.436,471,3.277,494,2.298,513,3.788,560,3.934,625,3.658,629,4.782,669,4.101,702,2.881,797,2.462,843,3.934,886,3.338,956,4.491,1050,4.782,1130,3.788,1163,4.529,1894,4.295,1970,5.361,2216,6.304]],["t/414",[8,2.412,10,2.198,41,0.819,43,0.972,44,2.719,50,4.474,51,2.165,52,1.483,53,1.62,54,3.725,55,3.967,56,3.348,67,3.058,104,1.076,105,2.67,106,2.719,117,0.787,139,4.474,188,2.834,266,2.769,290,3.432,345,4.266,392,3.348,489,2.492,902,4.658,906,4.447,1208,4.107,1276,4.911,1560,3.967,1714,4.658,1723,4.658,1724,4.658,1965,5.654,2322,5.229,2323,5.229,2324,5.229,2325,5.229,2357,5.654,2400,4.447]],["t/416",[4,0.655,5,1.009,6,1.124,7,0.761,9,1.042,14,0.761,15,0.487,16,0.964,29,1.34,34,1.5,37,1.979,40,3.237,41,0.847,44,3.132,50,4.516,52,1.362,53,1.414,56,3.397,60,1.796,64,1.762,66,1.417,72,0.836,73,2.09,77,1.163,79,2.864,81,2.616,84,1.506,85,1.215,90,1.729,97,1.461,101,0.964,104,0.672,106,1.697,107,2.919,115,0.687,117,0.491,122,1.377,129,1.343,130,0.953,138,1.509,162,1.325,164,1.34,170,2.759,183,1.244,188,3.045,189,2.398,197,3.076,202,1.417,209,1.139,210,1.885,212,1.623,214,1.074,216,2.26,225,2.537,236,1.244,240,1.074,250,1.189,256,2.776,257,1.074,264,1.509,266,1.053,287,2.241,290,2.143,293,2.016,295,2.871,307,1.796,312,1.139,319,1.244,331,2.565,342,1.989,350,1.274,367,2.644,369,1.87,384,2.199,386,2.013,401,2.776,424,1.509,425,1.772,432,1.623,439,1.832,440,1.074,445,3.137,466,1.417,473,1.215,475,1.623,481,0.998,489,1.979,494,1.556,496,1.034,524,1.694,527,1.989,528,1.461,547,1.215,614,2.565,698,1.563,702,2.871,797,1.016,839,2.565,842,2.908,844,2.659,885,2.199,893,3.775,903,1.623,906,1.692,925,1.215,960,2.875,982,1.417,1009,1.417,1010,1.417,1080,2.143,1094,1.868,1128,2.151,1130,4.732,1131,2.151,1132,2.151,1140,2.151,1161,2.663,1173,0.849,1257,2.151,1306,2.776,1307,3.067,1464,1.868,1474,2.908,1546,1.772,1547,3.531,1561,1.989,1717,1.989,1718,1.989,1719,1.772,1815,2.151,2179,2.151,2400,4.086,2401,2.397,2402,2.397,2403,2.397,2404,2.397,2405,2.397,2406,2.397,2407,3.531,2408,2.397,2409,2.397,2410,2.397,2411,2.397,2412,1.989,2413,2.397,2414,2.397,2415,2.397,2416,2.397,2417,2.397,2418,3.067,2419,3.531,2420,2.397,2421,1.989,2422,1.989,2423,1.989]],["t/418",[4,0.637,5,1.081,6,0.859,7,0.621,15,0.777,19,0.749,21,2.07,33,2.33,34,0.73,37,2.242,40,2.137,41,0.99,43,0.59,44,3.444,50,5.165,52,0.645,53,0.669,56,4.241,62,1.78,75,2.137,76,1.538,77,1.855,81,1.564,85,1.938,87,1.396,101,1.538,104,0.653,105,1.62,106,2.446,107,3.952,115,1.936,117,0.844,122,2.196,130,1.373,139,2.137,164,2.137,188,2.961,197,1.62,210,3.007,212,2.588,214,1.712,216,2.196,234,2.33,248,2.031,249,1.895,287,1.712,289,2.196,293,1.205,327,3.716,367,3.817,381,2.588,385,2.031,494,1.512,643,2.698,702,1.895,844,2.031,848,2.98,903,2.588,912,2.407,925,1.938,960,2.196,972,2.98,982,3.995,997,2.492,1009,2.26,1036,2.137,1094,2.98,1130,2.492,1458,2.826,1539,1.817,1540,1.817,1604,4.705,1683,3.173,1684,3.455,1696,3.173,1715,3.173,1720,3.173,2400,5.633,2412,3.173,2418,2.98,2421,3.173,2422,3.173,2423,3.173,2424,3.822,2425,3.431,2426,3.431,2427,3.431,2428,3.431]],["t/420",[5,0.817,7,0.753,21,2.388,33,3.987,41,0.839,44,2.823,50,4.581,56,3.476,75,3.657,77,3.175,87,2.388,101,2.631,105,2.772,107,2.987,139,3.657,188,2.316,210,2.464,249,3.244,327,3.773,367,2.987,494,2.588,643,4.617,848,5.1,912,4.119,972,5.1,982,3.868,997,4.265,1036,3.657,1683,5.429,1684,4.995,1696,5.429,1715,5.429,2400,4.617,2425,5.871]],["t/422",[5,1.048,15,1.001,19,0.965,37,1.948,40,2.753,41,1.018,43,0.76,44,3.621,50,5.315,56,4.459,76,1.981,81,2.015,85,2.497,104,0.841,106,2.125,107,4.157,115,1.948,117,0.615,122,2.829,130,1.193,164,2.753,188,3.118,197,2.087,210,3.161,212,3.334,214,2.206,216,2.829,289,2.829,327,2.734,367,4.02,381,3.334,702,2.442,844,2.617,903,3.334,925,2.497,982,2.912,1009,2.912,1094,3.839,1130,3.211,1539,2.341,1540,2.341,1604,5.641,1720,4.087,2400,5.922,2412,4.087,2418,3.839,2421,4.087,2422,4.087,2423,4.087,2426,4.42,2427,4.42,2428,4.42]],["t/424",[0,1.739,4,1.039,5,0.419,6,1.153,7,0.785,14,0.648,22,1.395,34,0.981,37,2.468,41,0.639,42,3.028,43,0.792,44,3.253,45,1.446,49,1.925,50,4.774,51,1.152,52,1.396,53,1.45,56,3.716,64,1.501,73,1.781,79,2.299,84,1.283,86,2.209,97,3.803,106,2.215,107,2.849,129,1.674,139,1.874,162,1.997,173,1.739,183,1.739,184,1.561,187,1.825,188,2.816,197,2.175,209,1.593,210,2.84,225,4.33,248,1.781,250,2.545,270,2.603,287,1.501,293,2.205,301,1.981,310,3.129,312,1.593,322,1.825,350,1.781,367,3.193,369,3.323,442,1.473,447,5.049,467,1.739,482,1.626,485,3.232,486,2.781,487,2.781,488,4.26,489,2.03,490,3.346,491,3.007,492,3.007,493,2.365,494,1.326,496,2.692,497,2.612,498,4.001,511,2.11,512,3.007,513,2.185,521,3.795,527,2.781,528,2.043,556,3.007,557,3.007,558,3.007,559,2.781,560,2.269,561,2.612,562,2.781,563,3.007,564,3.007,565,2.477,566,3.007,567,3.007,568,3.007,569,3.007,571,1.874,638,2.269,797,1.42,844,1.781,1077,2.781,1464,2.612,1546,4.612,1721,2.781,1722,2.781,2400,4.403,2418,2.612,2419,3.007,2429,3.351,2430,3.351,2431,3.351,2432,3.351,2433,3.351,2434,3.351,2435,3.351,2436,3.351]],["t/426",[0,3.015,4,1.265,5,0.726,6,1.305,15,1.181,28,2.955,34,1.11,44,3.277,45,3.277,49,3.338,50,3.249,52,1.427,53,1.33,64,2.602,66,3.436,72,2.649,99,2.881,102,4.101,129,2.038,130,1.407,188,2.057,238,2.706,253,4.101,257,2.602,287,2.602,310,3.542,312,3.61,314,5.615,369,2.762,375,3.165,386,2.337,428,4.63,444,1.643,446,4.364,463,3.165,464,1.807,471,2.507,565,4.295,804,4.529,960,3.338,961,3.788,1202,4.529,1306,4.101,1464,4.529,1546,4.295,1878,5.215,2407,5.215,2437,5.81,2438,5.81,2439,5.215,2440,5.81]],["t/428",[1,2.949,2,4.737,4,1.44,5,0.759,6,1.365,7,0.559,15,1.235,29,3.397,34,1.494,37,2.403,43,1.207,44,2.622,52,1.025,53,1.064,60,3.57,72,2.727,73,4.155,84,2.993,88,4.737,89,3.593,100,5.453,129,1.63,130,1.472,131,3.704,166,3.961,190,3.826,199,3.961,219,3.491,234,3.704,307,2.774,312,2.888,326,4.114,327,2.444,382,3.593,388,4.737,442,2.671,464,1.889,945,4.737,1248,6.49,1260,3.397,1458,4.492,1582,5.043,1972,5.453,2441,6.076,2442,6.076,2443,6.076]],["t/430",[4,0.798,5,1.036,6,1.8,7,0.705,9,0.812,12,1.591,13,2,16,1.234,21,1.12,33,1.87,34,1.805,37,1.896,40,1.715,42,2.864,44,1.323,51,1.054,52,0.808,53,1.033,54,1.814,60,1.401,64,2.147,65,2,70,2,75,3.299,81,1.255,84,1.174,85,1.555,86,1.086,87,1.12,90,2.932,91,2.165,92,2.922,93,1.931,117,0.904,166,2,168,2.546,178,2.546,195,2.834,197,3.251,203,2.165,207,1.715,238,1.428,240,2.988,249,1.521,250,1.521,287,1.374,288,2.165,293,1.511,304,2.753,327,1.928,329,2.165,338,1.814,343,2.165,353,1.458,370,1.715,374,1.814,375,1.671,376,1.458,379,1.87,383,2.753,384,2.593,386,1.234,391,2.268,393,2.546,408,2.753,428,1.87,438,2.777,439,1.428,444,1.886,445,3.305,446,1.762,447,3.489,448,2.834,449,3.125,456,1.715,463,1.671,464,1.49,473,1.555,511,1.931,524,1.039,545,2.268,578,3.018,579,1.762,581,1.63,592,1.715,596,2.546,603,1.814,617,2.753,627,2.391,637,4.164,660,2.546,690,2.391,691,2.268,702,1.521,773,2.391,774,2.165,776,2.077,777,2.165,778,2.391,779,2.391,780,2.268,781,2.268,782,2.165,783,2.268,784,2.268,785,2.268,786,2.753,787,2.077,788,2.753,789,2.391,795,1.762,797,2.031,816,1.87,872,2.43,891,1.87,893,2,903,2.077,946,2,961,2,984,2.753,997,3.125,1013,4.302,1026,1.87,1036,1.715,1044,1.715,1097,2.391,1111,2.077,1130,2,1149,2.165,1190,2.546,1195,2.546,1207,2,1260,2.68,1274,2.077,1294,2.391,1461,2.753,1463,2.753,1544,2.753,1560,3.018,1646,2.391,1678,2.391,1679,2.546,1713,2.546,1855,2.391,1901,2.391,1970,2.165,2304,2.753,2444,3.067,2445,4.793,2446,3.067,2447,3.067,2448,3.067,2449,3.067,2450,3.067,2451,3.067,2452,3.067,2453,3.067,2454,3.067,2455,3.067]],["t/432",[4,1.548,5,1.207,6,1.94,16,3.475,17,2.842,34,1.362,84,3.307,129,1.912,312,3.387,386,2.867,442,3.132,444,2.015,464,2.216,489,2.819,610,4.825,1855,5.556,2456,7.127]],["t/434",[4,1.346,5,1.224,6,1.816,34,1.545,40,3.579,43,0.988,45,2.762,51,2.2,81,2.619,87,2.337,104,1.38,117,1.01,130,1.55,233,3.107,257,2.867,376,3.043,438,3.874,442,2.814,444,1.81,473,4.099,481,2.665,531,3.678,691,4.733,702,3.174,739,4.518,795,3.678,797,2.713,1097,4.99,1130,4.173,1452,5.745,2457,5.745]],["t/436",[4,1.216,6,2.11,34,1.395,42,3.543,43,1.127,87,2.666,104,1.247,117,0.912,197,3.094,257,3.27,301,4.317,438,3.04,440,3.27,441,6.552,442,3.209,444,2.065,445,3.334,531,4.195,795,4.195,2457,6.552]],["t/438",[64,3.674,72,2.861,1678,6.394,1970,5.789]],["t/440",[60,3.771,72,2.881,836,5.034]],["t/442",[4,1.375,72,2.881,836,5.034]],["t/444",[4,1.379,15,1.352,67,3.228,81,2.721,87,2.428,98,3.298,101,2.675,105,2.818,130,1.611,131,4.054,162,1.762,187,3.623,197,2.818,238,3.097,260,5.52,359,4.336,370,3.719,428,5.495,440,2.979,496,2.87,528,4.054,546,5.877,547,3.372,840,4.694,893,4.336,1306,5.843,1471,4.917,1981,5.185,2249,5.969,2439,5.969,2458,6.651,2459,6.651]],["t/446",[1,3.849,2,6.182,3,4.891,4,1.321,62,3.693,188,2.808,319,4.115,476,5.863]],["t/448",[102,5.749,635,4.555,946,5.311,1970,5.749,2363,7.311]],["t/450",[2460,8.375]],["t/453",[1,2.995,4,1.028,7,0.567,14,1.194,21,2.253,31,1.722,39,3.279,44,2.662,52,1.332,53,1.383,54,3.648,55,3.885,62,2.874,192,2.569,201,4.562,254,3.279,412,5.838,463,3.361,466,3.648,489,2.441,494,2.441,546,4.023,561,4.81,628,3.279,813,5.308,849,5.573,885,4.415,887,5.121,946,4.023,951,4.023,969,4.355,985,4.562,1273,4.81,1560,3.885,1702,5.896,2461,6.17,2462,6.17,2463,6.17,2464,6.17,2465,6.17,2466,6.17,2467,6.17,2468,6.17]],["t/455",[7,0.605,28,3.199,41,0.673,44,4.367,45,3.548,49,5.154,52,1.585,53,1.646,54,3.889,55,4.141,104,1.123,312,3.126,392,3.495,471,2.838,565,4.863,590,6.41,1283,5.903,1346,5.128,1356,6.079,2318,5.903,2469,6.578]],["t/457",[7,0.697,52,1.278,53,1.327,60,3.46,200,6.29,201,6.626,290,4.128,585,4.619,590,6.986,849,5.349,870,5.349,1080,4.128,1902,6.29,2470,7.578]]],"invertedIndex":[["",{"_index":41,"t":{"4":{"position":[[624,1],[751,3],[984,1],[986,3],[990,1],[992,3],[1291,1],[1320,1],[2544,1],[2546,1],[2596,3],[2608,1],[2774,1],[2776,1],[2778,1],[2951,1],[2992,1],[4057,1],[4118,1],[4216,1],[4248,2],[4319,2],[4340,1],[4389,2],[4403,1],[4405,1],[4502,1],[4652,1],[4654,1],[4656,2],[4670,1],[4672,1],[4736,1],[4795,1],[4797,1],[4799,2],[4814,1],[4816,1],[4937,1],[4973,1],[4975,2],[4978,1],[5161,1],[5196,1],[5198,1],[5200,1],[5202,1]]},"8":{"position":[[522,1],[524,1],[585,1],[696,1],[698,1],[700,1],[958,1],[960,1],[1021,1],[1170,1],[1172,1],[1174,1],[1596,1],[1646,1]]},"12":{"position":[[146,2]]},"14":{"position":[[991,1],[1002,1],[1016,1],[1062,1],[1064,2],[1067,2],[1070,3],[1074,1],[1740,1],[1751,1],[1761,1],[1807,1],[1809,2],[1812,2],[1815,3],[1819,1],[2359,1],[2370,1],[2384,1],[2449,1],[2451,2],[2454,2],[2457,3],[2461,1],[2937,1],[2948,1],[2962,1],[3008,1],[3010,2],[3013,2],[3016,3],[3020,1],[3228,1],[3230,3],[3234,1],[3785,1],[3796,1],[3810,1],[3877,1],[3879,2],[3882,2],[3885,3],[3889,1]]},"16":{"position":[[468,1],[500,6],[507,2],[510,3],[514,1]]},"22":{"position":[[356,1],[369,1],[371,5],[377,2],[391,1],[393,5],[399,2],[414,1],[416,1],[517,2],[520,1],[570,5],[576,2],[579,1],[622,5],[628,2],[631,5],[637,1],[639,1],[821,1],[958,1],[994,1],[996,1],[1174,1],[1356,1],[1391,1],[1393,1],[1554,1],[1701,2],[1866,1]]},"28":{"position":[[25,1],[40,1],[48,1],[57,1],[67,1],[77,1]]},"33":{"position":[[1027,1],[1029,1],[1090,1],[1092,2],[1095,3],[1099,2],[1113,1],[1115,2],[1157,2],[1160,2],[1250,2],[1362,1],[1364,2],[1367,1]]},"35":{"position":[[248,2],[659,2]]},"37":{"position":[[247,1],[249,1],[308,1],[416,1],[418,1],[420,1],[525,1],[538,1],[540,1],[599,1],[707,2],[726,1],[728,1],[730,1]]},"41":{"position":[[446,1],[448,1],[525,1],[674,1],[676,1],[678,1],[783,1],[796,1],[798,1],[875,1],[1024,2],[1044,1],[1046,1],[1048,1]]},"45":{"position":[[269,1],[271,1],[346,1],[458,1],[460,1],[462,1],[567,1],[580,1],[582,1],[657,1],[769,2],[795,1],[797,1],[799,1]]},"47":{"position":[[382,1]]},"49":{"position":[[190,1],[192,1],[270,1],[329,1],[331,1],[333,1],[438,1],[451,1],[453,1],[531,1],[590,2],[610,1],[612,1],[614,1]]},"56":{"position":[[701,1],[703,1],[765,1],[845,1],[847,1],[849,1],[954,1],[967,1],[969,1],[1031,1],[1111,2],[1132,1],[1134,1],[1136,1]]},"60":{"position":[[127,1],[151,1]]},"63":{"position":[[837,1],[839,1],[892,1],[966,1],[968,1],[970,1],[1075,1],[1088,1],[1090,1],[1143,1],[1217,2],[1237,1],[1239,1],[1241,1]]},"67":{"position":[[23,1],[43,1],[66,2],[87,1],[204,2],[225,1],[368,2],[427,1],[440,1],[442,1],[532,2],[553,1],[579,2],[600,1],[743,2],[802,1],[815,1],[817,1],[907,2],[921,1],[923,1],[999,1],[1073,2],[1087,1],[1113,2],[1174,1],[1176,2],[1179,1],[1255,1],[1289,2],[1420,1],[1422,2],[1425,1],[1501,1],[1586,2],[1679,1],[1681,2],[1684,1],[1757,1],[1849,1],[1851,2],[1854,1],[1927,1],[2020,2],[2145,1],[2147,2],[2150,1],[2189,2],[2284,1],[2377,1],[2379,2],[2382,1],[2425,2],[2520,1],[2645,1],[2647,2],[2650,1],[2731,1],[2816,1],[2818,2],[2821,1],[2900,1],[3037,5],[3043,1],[3045,2],[3048,1],[3135,1],[3156,1],[3158,1],[3160,2],[3174,1],[3176,1],[3226,1],[3289,1],[3291,2],[3294,1],[3344,1],[3407,1],[3409,2],[3412,1],[3462,1],[3525,1],[3527,2],[3530,1],[3577,1],[3682,1],[3684,1],[3686,1],[3688,1]]},"69":{"position":[[24,1],[26,1],[28,2],[163,1],[236,1],[238,2],[241,1],[298,1],[371,1],[373,2],[376,1],[433,1],[517,1],[519,2],[522,1],[545,1],[547,1],[604,1],[696,1],[698,2],[701,1],[758,1],[882,1],[884,2],[887,1],[918,1],[1011,1],[1013,1],[1015,1],[1042,1],[1044,1],[1075,1],[1200,1],[1202,1],[1204,1],[1230,1],[1232,1],[1292,1],[1429,5],[1435,1],[1437,1],[1439,1],[1468,1],[1470,1],[1535,1],[1557,1],[1559,1],[1561,1],[1586,1],[1588,1],[1620,1],[1683,1],[1685,2],[1688,1],[1720,1],[1783,1],[1785,2],[1788,1],[1820,1],[1883,1],[1885,1],[1887,1],[1912,1],[1914,1],[1943,1],[2048,1],[2050,1],[2052,1]]},"73":{"position":[[121,1],[123,1],[125,1],[127,1],[151,1],[153,1],[155,1],[157,1],[200,1],[202,1],[204,1],[206,1],[232,1],[234,1],[236,1],[238,1],[265,1],[267,1],[269,1],[271,1],[296,1],[298,1],[300,1],[302,1],[325,1],[327,1],[329,1],[331,1],[354,1],[356,1],[358,1],[360,1],[385,1],[387,1],[389,1],[391,1],[428,1],[430,1],[432,1],[434,1],[464,1],[466,1],[468,1],[470,1],[512,1],[514,1],[516,1],[518,1],[542,1],[544,1],[546,1],[548,1],[573,1],[575,1],[577,1],[579,1],[623,1],[625,1],[627,1],[629,1],[657,1],[659,1],[661,1],[663,1],[686,1],[688,1],[690,1],[692,1],[717,1],[719,1],[721,1],[723,1],[749,1],[751,1],[753,1],[755,1],[798,1],[800,1],[802,1],[804,1],[829,1],[831,1],[833,1],[835,1],[866,1],[868,1],[870,1],[872,1],[894,1],[896,1],[898,1],[900,1],[935,1],[937,1],[939,1],[941,1],[972,1],[974,1],[976,1],[978,1]]},"80":{"position":[[197,1],[280,1],[282,2],[285,3],[289,2],[292,1],[331,3]]},"82":{"position":[[394,1],[404,1],[406,2],[409,3],[413,2],[427,1],[451,1],[469,2],[535,2],[602,1],[604,1],[606,1]]},"84":{"position":[[679,1],[689,1],[691,2],[694,3],[698,2],[712,1],[714,2],[762,2],[833,1],[835,1]]},"86":{"position":[[319,1],[724,2],[756,2],[834,2],[932,2],[1344,1],[1354,1],[1356,2],[1359,3],[1363,2],[1377,1],[1379,2],[1427,2],[1498,1],[1500,2]]},"88":{"position":[[376,1],[378,1],[442,1],[554,1],[556,1],[558,1],[647,1],[660,1],[662,1],[726,1],[838,1],[840,1],[842,1],[844,1]]},"92":{"position":[[402,4],[787,1]]},"94":{"position":[[153,1],[155,1],[205,3],[217,1],[350,1],[352,1],[354,1],[443,1],[456,1],[458,1],[508,3],[520,1],[652,2],[672,1],[674,1],[676,1]]},"96":{"position":[[291,1],[293,1],[323,1],[357,2],[371,1],[410,1],[412,1],[414,1]]},"98":{"position":[[1308,3],[1404,3],[2289,1],[2291,1],[2341,1],[2343,2],[2468,2],[2471,1],[2473,1],[2821,1],[2823,1],[2873,1],[2875,2],[3055,2],[3058,1],[3060,1],[3480,1],[3482,1],[3532,1],[3534,5],[3540,2],[3554,1],[3575,1],[3577,1],[3579,1]]},"100":{"position":[[664,1],[666,1],[694,1],[718,3],[744,3],[767,3],[790,2],[793,1],[795,1],[797,1],[894,1],[907,1],[909,1],[937,1],[961,3],[987,3],[1010,3],[1033,2],[1036,2],[1060,1],[1062,1],[1064,1]]},"102":{"position":[[1302,1],[1304,1],[1347,1],[1425,1],[1427,1],[1429,1]]},"104":{"position":[[126,1],[128,1],[171,1],[209,1],[211,1],[213,1],[310,1],[323,1],[325,1],[368,1],[406,2],[427,1],[429,1],[431,1]]},"106":{"position":[[142,1],[153,1]]},"108":{"position":[[135,2],[184,2]]},"110":{"position":[[328,1],[330,1],[376,1],[441,1],[443,1],[445,1],[550,1],[563,1],[565,1],[611,1],[676,2],[696,1],[698,1],[700,1]]},"112":{"position":[[139,1],[151,1]]},"114":{"position":[[133,2],[182,2]]},"116":{"position":[[253,1],[255,1],[299,1],[388,1],[390,1],[392,1],[497,1],[510,1],[512,1],[556,1],[645,2],[663,1],[665,1],[667,1]]},"118":{"position":[[666,1],[668,1],[727,1],[835,1],[837,1],[839,1],[944,1],[957,1],[959,1],[1018,1],[1126,2],[1145,1],[1147,1],[1149,1]]},"124":{"position":[[333,1],[335,1],[378,1],[397,1],[399,1],[401,1],[506,1],[519,1],[521,1],[564,1],[583,2],[608,1],[610,1],[612,1]]},"128":{"position":[[286,1],[288,1],[365,1],[514,1],[516,1],[518,1],[623,1],[636,1],[638,1],[715,1],[864,2],[884,1],[886,1],[888,1]]},"130":{"position":[[121,1],[139,1],[152,1],[225,1],[380,1],[2148,1],[2150,1],[2201,3],[2213,1],[2311,2],[2616,2],[2630,1],[2680,1],[2682,1],[2684,1],[2773,1],[2786,1],[2788,1],[2839,3],[2851,1],[2963,1],[2991,2],[3008,1],[3024,2],[3043,1],[3055,2],[3074,1],[3090,2],[3111,1],[3125,2],[3146,1],[3159,2],[3195,1],[3211,2],[3236,2],[3250,1],[3300,2],[3322,1],[3324,1],[3326,1]]},"138":{"position":[[411,1],[413,1],[455,1],[476,1],[478,1],[480,1],[585,1],[598,1],[600,1],[642,1],[663,2],[687,1],[689,1],[691,1]]},"142":{"position":[[307,1],[309,1],[384,1],[496,1],[498,1],[500,1],[605,1],[618,1],[620,1],[695,1],[807,2],[833,1],[835,1],[837,1]]},"146":{"position":[[284,1],[286,1],[364,1],[423,1],[425,1],[427,1],[532,1],[545,1],[547,1],[625,1],[684,2],[704,1],[706,1],[708,1]]},"148":{"position":[[490,2],[539,2],[883,1],[900,1]]},"150":{"position":[[350,1],[383,1]]},"152":{"position":[[353,1],[400,1]]},"154":{"position":[[80,1],[82,1],[128,1],[166,3],[186,3],[208,2],[211,1],[213,1],[215,1],[320,1],[333,1],[335,1],[381,1],[419,3],[439,3],[461,2],[464,2],[484,1],[486,1],[488,1]]},"156":{"position":[[151,1]]},"158":{"position":[[157,1],[159,1],[202,1],[259,2],[273,1],[301,1],[303,1],[305,1],[410,1],[423,1],[425,1],[468,1],[525,2],[539,1],[567,2],[584,1],[586,1],[588,1]]},"162":{"position":[[379,1],[381,1],[425,1],[440,1],[455,2],[471,1],[483,1],[485,1],[487,1],[489,1],[594,1],[607,1],[609,1],[653,1],[668,1],[683,2],[699,1],[711,1],[713,2],[732,1],[734,1],[736,1]]},"164":{"position":[[177,1],[191,1]]},"166":{"position":[[200,1],[202,1],[270,1],[328,1],[330,1],[332,1],[437,1],[450,1],[452,1],[520,1],[578,1],[580,1],[582,1],[584,1]]},"168":{"position":[[1059,1],[2270,1],[2272,1],[2322,3],[2334,1],[2404,1],[2432,2],[2449,1],[2465,2],[2484,1],[2496,2],[2515,1],[2531,2],[2552,1],[2566,2],[2587,1],[2600,1],[2602,2],[2616,1],[2696,1],[2698,1],[2700,1],[2805,1],[2818,1],[2820,1],[2870,3],[2882,1],[2952,1],[2980,2],[2997,1],[3013,2],[3032,1],[3044,2],[3063,1],[3079,2],[3100,1],[3114,2],[3135,1],[3148,1],[3150,2],[3164,1],[3244,2],[3262,1],[3264,1],[3266,1]]},"174":{"position":[[476,1],[478,1],[540,1],[620,1],[622,1],[624,1],[729,1],[742,1],[744,1],[806,1],[886,2],[907,1],[909,1],[911,1]]},"178":{"position":[[247,1],[249,1],[299,3],[311,1],[477,1],[479,1],[481,1],[586,1],[599,1],[601,1],[651,3],[663,1],[829,2],[850,1],[852,1],[854,1]]},"182":{"position":[[214,1],[216,1],[264,1],[369,1],[382,1],[384,1],[386,1],[388,1],[493,1],[506,1],[508,1],[556,1],[661,1],[674,1],[676,2],[698,1],[700,1],[702,1]]},"190":{"position":[[831,1],[833,1],[892,1],[993,1],[995,1],[997,1],[1040,1],[1042,1],[1101,1],[1201,1],[1203,1],[1205,1],[1270,1],[1272,1],[1331,1],[1443,1],[1445,1],[1447,1],[1735,1],[1737,1],[1796,1],[1887,1],[1896,2],[1914,1],[1926,1],[1928,1],[1930,1],[1932,1],[2037,1],[2050,1],[2052,1],[2111,1],[2202,1],[2211,2],[2229,1],[2241,1],[2243,2],[2263,1],[2265,1],[2267,1]]},"192":{"position":[[108,1],[221,1],[352,1],[371,1],[390,1],[402,1],[1589,1],[1591,1],[1634,1],[1636,2],[1639,3],[1643,2],[1657,1],[1679,1],[1681,2],[1741,2],[1823,2],[1826,2],[1918,1],[1920,1],[1922,1],[2353,1],[2355,1],[2398,1],[2400,2],[2403,3],[2407,2],[2421,1],[2447,1],[2449,1],[2451,1]]},"194":{"position":[[158,1],[160,1],[203,1],[253,1],[255,1],[257,1],[362,1],[375,1],[377,1],[420,1],[470,2],[487,1],[489,1],[491,1]]},"198":{"position":[[179,1],[181,1],[213,1],[231,2],[242,1],[260,1],[262,2],[265,1],[297,1],[315,2],[326,1],[344,1],[346,1],[348,1]]},"202":{"position":[[377,1],[379,1],[415,1],[456,3],[473,2],[476,1],[478,1],[480,1],[585,1],[598,1],[600,1],[636,1],[677,3],[694,2],[697,2],[723,1],[725,1],[727,1]]},"206":{"position":[[160,1],[162,1],[208,1],[233,1],[235,1],[237,1],[342,1],[355,1],[357,1],[403,1],[428,2],[451,1],[453,1],[455,1]]},"208":{"position":[[1024,1],[1086,1],[1135,7],[1143,2],[1157,1],[1205,1],[1207,1],[2161,1],[2571,1],[2633,1],[2733,2],[2747,1],[2795,1],[2797,1],[2918,3],[2937,3],[3800,1],[3862,1],[4036,2],[4050,1],[4098,1],[4100,1],[4524,1]]},"210":{"position":[[387,1],[389,1],[439,3],[451,1],[500,8],[590,2],[604,1],[622,1],[624,1],[626,1],[731,1],[744,1],[746,1],[796,3],[808,1],[857,8],[947,2],[961,1],[979,2],[1000,1],[1002,1],[1004,1]]},"216":{"position":[[379,1],[381,1],[452,1],[454,2],[457,3],[461,2],[475,1],[494,1],[510,3],[514,3],[518,4],[534,3],[538,3],[542,4],[562,3],[566,3],[570,3],[574,1],[576,1],[578,1],[580,1]]},"218":{"position":[[1307,1],[1309,1],[1331,2],[1334,3],[1349,1],[1368,1],[1381,1],[1383,1],[1398,3],[1402,3],[1406,4],[1411,2],[1463,3],[1467,3],[1471,4],[1476,2],[1555,1],[1557,2],[1560,1],[1562,1],[1564,1],[1566,1]]},"220":{"position":[[655,1],[674,2],[715,1]]},"222":{"position":[[481,1],[483,2],[486,3],[506,1],[508,1],[571,1],[573,2],[643,1],[645,3],[649,2],[652,2],[740,1],[742,1],[744,1],[746,1],[789,1],[791,1],[823,1],[825,2],[828,3],[832,4],[848,1],[867,1],[883,1],[885,1],[904,2],[973,1],[975,1],[977,1],[979,1],[981,1],[983,1],[1131,1],[1133,2],[1136,3],[1156,1],[1158,1],[1216,1],[1232,1],[1234,3],[1238,2],[1273,1],[1275,2],[1278,1],[1331,1],[1333,2],[1421,1],[1423,1],[1425,1],[1427,1],[1470,1],[1472,1],[1504,1],[1506,2],[1509,3],[1513,4],[1529,1],[1548,1],[1564,1],[1566,1],[1610,1],[1612,1],[1614,1],[1616,1],[1618,1],[1620,1],[1653,1],[1655,1],[1682,1],[1684,2],[1687,3],[1691,4],[1707,1],[1726,1],[1742,1],[1744,1],[1783,1],[1785,1],[1787,1],[1789,1],[1791,1],[1793,1],[1966,1],[1968,2],[1971,3],[1991,1],[1993,1],[2056,1],[2058,2],[2128,1],[2130,3],[2134,2],[2137,2],[2225,1],[2227,1],[2229,1],[2231,1],[2274,1],[2276,1],[2308,1],[2310,2],[2313,3],[2317,4],[2333,1],[2352,1],[2368,1],[2370,1],[2420,2],[2499,1],[2501,1],[2503,1],[2505,1],[2507,1],[2509,1]]},"224":{"position":[[175,1],[195,2],[198,3],[218,2],[273,1],[283,3],[287,3],[291,4],[296,2],[362,2],[365,3],[369,2],[372,2],[397,2],[463,2],[524,2],[602,2],[675,1]]},"226":{"position":[[917,2],[920,3],[935,1],[954,1],[970,1],[972,1],[974,2],[1020,2],[1102,2],[1105,1],[1144,1],[1146,1],[1148,1],[1150,1],[1198,2],[1201,3],[1216,1],[1235,1],[1251,1],[1253,1],[1255,2],[1311,2],[1462,2],[1465,1],[1504,1],[1506,1],[1508,1],[1510,1]]},"228":{"position":[[484,1],[494,1],[522,2],[598,2],[656,1],[658,1],[660,1],[670,1],[672,1],[700,2],[776,2],[834,2],[837,2],[843,1],[873,2],[950,2],[999,1],[1001,1],[1003,1],[1198,1],[1200,2],[1233,2],[1275,1],[1291,1],[1293,1],[1321,1],[1323,1],[1352,1],[1354,1],[1356,1],[1358,2],[1361,1],[1363,1],[1412,1],[1414,2],[1441,2],[1444,2],[1480,2],[1559,1],[1575,1],[1606,1],[1616,1],[1618,1],[1647,1],[1649,1],[1651,2],[1654,1],[1656,1],[1658,1]]},"230":{"position":[[138,2],[162,1],[279,2],[303,1],[357,1],[386,10],[408,1],[427,1],[443,10],[466,1],[468,1],[470,1],[666,1],[766,1],[791,1],[841,1],[883,1],[930,1],[938,1],[990,1],[992,1],[1045,1],[1047,1],[1101,1],[1103,1],[1156,1],[1158,1]]},"241":{"position":[[217,1],[219,2],[222,3],[242,1],[244,1],[293,1],[303,1],[305,1],[341,1],[343,1],[345,2],[348,1],[350,1],[352,1],[786,1],[788,2],[791,3],[811,1],[813,1],[862,1],[872,1],[874,1],[910,2],[969,2],[972,2],[993,1],[1071,1],[1073,1],[1075,2],[1078,1],[1080,1],[1082,1]]},"243":{"position":[[137,1],[139,2],[142,3],[162,1],[164,1],[213,1],[223,1],[225,1],[261,1],[263,2],[278,1],[379,1],[381,2],[384,1],[386,1],[388,1]]},"245":{"position":[[125,1],[165,2],[168,3],[188,2],[243,1],[253,3],[257,3],[261,4],[266,2],[332,2],[335,3],[339,2],[342,2],[359,2],[415,2],[458,1]]},"247":{"position":[[1011,1],[1323,1],[1522,1],[1717,1],[1820,1]]},"251":{"position":[[551,2],[554,3],[570,1],[572,2],[670,2],[766,1],[1735,1],[1815,1],[1837,1],[1933,1],[2031,1],[2597,2],[2600,3],[2616,1],[2618,2],[2668,1],[2711,1],[3505,1],[3585,1],[3621,1],[3853,1],[3967,1],[3998,2],[4001,3],[4017,1],[4019,2],[4022,3],[4059,1],[4372,1],[4471,1],[4483,1],[4491,1],[4592,1],[4674,1],[4705,2],[4708,3],[4724,1],[4726,2],[4729,3],[4765,1],[5854,2],[5857,3],[5873,1],[5875,2],[5878,3],[5913,1]]},"254":{"position":[[210,1],[212,2],[215,3],[231,2],[283,1]]},"256":{"position":[[1338,1],[1340,5],[1925,2],[1928,3],[1944,1],[1946,2],[1949,3],[1979,2],[2052,1]]},"258":{"position":[[809,1],[811,5]]},"261":{"position":[[377,1],[379,2],[461,2],[561,2],[622,1],[773,1],[775,2],[828,2],[886,1]]},"265":{"position":[[396,1],[398,1],[430,1],[432,2],[435,3],[439,4],[455,1],[474,1],[490,1],[492,1],[619,1],[621,1],[623,1],[625,1],[627,1],[629,1]]},"267":{"position":[[579,1],[581,1],[613,1],[615,2],[618,3],[622,4],[638,1],[657,1],[687,1],[689,1],[730,1],[732,1],[734,1],[736,1],[738,1],[740,1]]},"270":{"position":[[37,1],[39,2],[42,3],[62,1],[64,1],[113,1],[123,1],[125,1],[161,1],[163,1],[165,2],[168,1],[170,1],[172,1],[215,1],[217,1],[249,1],[251,2],[254,3],[258,4],[274,1],[293,1],[309,1],[311,1],[351,1],[353,1],[355,1],[357,1],[359,1],[361,1]]},"272":{"position":[[125,1],[127,2],[130,3],[150,1],[152,1],[201,1],[211,1],[213,1],[249,1],[251,1],[253,2],[268,1],[438,1],[440,1],[442,1],[444,1],[487,1],[489,1],[521,1],[523,2],[526,3],[530,4],[546,1],[565,1],[581,1],[583,1],[623,1],[625,1],[627,1],[629,1],[631,1],[633,1]]},"274":{"position":[[314,1],[316,2],[319,3],[339,1],[341,1],[390,1],[400,1],[402,1],[438,1],[440,1],[442,2],[457,1],[459,2],[501,1],[503,1],[505,1],[507,1],[550,1],[552,1],[584,1],[586,2],[589,3],[593,4],[609,1],[628,1],[644,1],[646,1],[773,2],[817,1],[819,1],[821,1],[823,1],[825,1],[827,1]]},"276":{"position":[[222,1],[224,2],[227,3],[247,1],[249,1],[298,1],[308,1],[310,1],[346,1],[348,1],[350,2],[365,1],[536,1],[538,1],[540,1],[542,1],[585,1],[587,1],[619,1],[621,2],[624,3],[628,4],[644,1],[663,1],[679,1],[681,1],[683,2],[739,2],[890,2],[893,1],[912,1],[914,1],[916,1],[918,1],[920,1],[922,1]]},"280":{"position":[[190,1],[192,2],[195,3],[215,1],[217,1],[269,1],[280,1],[300,2],[314,1],[334,1],[336,1],[338,1],[340,1],[342,1],[611,1],[613,1],[645,1],[647,2],[650,3],[654,4],[670,1],[689,1],[705,1],[707,1],[725,2],[794,1],[796,2],[842,1],[844,1],[846,1],[848,1],[850,1],[852,1],[854,1]]},"282":{"position":[[147,2],[293,2],[451,1],[481,2],[546,2],[584,1],[623,2],[657,1],[687,2],[773,2],[815,1],[851,2]]},"284":{"position":[[74,1],[76,1],[131,1],[133,2],[136,3],[140,2],[154,1],[173,1],[205,1],[207,1],[218,1],[220,2],[263,1],[265,2],[370,1],[372,1],[374,1],[376,2],[379,1],[381,1],[383,1],[385,1]]},"287":{"position":[[48,2],[81,2],[117,2],[170,2],[173,2],[218,1],[229,1],[231,1],[296,3],[308,1],[310,1],[339,1],[341,1],[343,2],[401,2],[404,1]]},"289":{"position":[[68,1],[79,1],[99,1],[101,1]]},"291":{"position":[[8,1],[21,1],[36,1],[47,1],[66,1],[68,2],[83,1],[94,1],[113,1],[115,2],[118,2],[121,1]]},"293":{"position":[[8,1],[21,1],[23,1],[73,1],[75,1],[77,1]]},"295":{"position":[[8,1],[19,1],[21,1],[63,2],[66,1],[68,1],[70,1]]},"297":{"position":[[176,1],[192,1],[270,3],[563,1],[579,1],[664,1],[677,1],[679,1],[742,1],[744,1],[746,1]]},"301":{"position":[[384,1],[733,1],[813,1],[835,1],[867,1],[965,1]]},"303":{"position":[[187,2],[190,1],[192,1],[194,1],[665,1],[688,1],[1495,2],[1557,2],[1618,2],[1670,2],[1699,2],[1702,2]]},"305":{"position":[[126,1],[146,2],[149,3],[169,2],[224,1],[234,3],[238,3],[242,4],[247,2],[313,2],[316,3],[320,2],[323,2],[340,2],[383,1]]},"307":{"position":[[279,1],[281,1],[313,1],[315,2],[318,3],[322,4],[338,1],[357,1],[373,1],[375,1],[395,2],[457,1],[459,1],[461,1],[463,1],[465,1],[467,1]]},"309":{"position":[[266,1],[572,1],[839,1],[937,1]]},"312":{"position":[[37,1],[39,2],[42,3],[62,1],[64,1],[127,1],[129,2],[199,1],[201,3],[205,2],[208,2],[296,1],[298,1],[300,1],[302,1],[345,1],[347,1],[379,1],[381,2],[384,3],[388,4],[404,1],[423,1],[439,1],[441,1],[491,1],[493,1],[495,1],[497,1],[499,1],[501,1]]},"314":{"position":[[37,1],[39,2],[42,3],[62,1],[64,1],[127,1],[146,1],[170,1],[186,1],[193,1],[195,1],[197,1],[199,1],[201,1],[244,1],[246,1],[278,1],[280,2],[283,3],[287,4],[303,1],[322,1],[338,1],[340,1],[390,1],[392,1],[394,1],[396,1],[398,1],[400,1]]},"316":{"position":[[277,1],[279,1],[311,1],[313,2],[316,3],[320,4],[336,1],[355,1],[371,1],[373,1],[408,2],[431,1],[433,1],[435,1],[437,1],[439,1],[441,1]]},"321":{"position":[[311,1],[340,1]]},"327":{"position":[[175,1],[221,1]]},"340":{"position":[[234,1],[251,1],[281,1],[320,1],[341,2],[440,2],[537,1],[539,2],[582,3],[586,1],[658,1],[670,1],[678,1],[687,1],[689,1],[737,1],[739,2],[756,3],[760,1],[808,1],[810,1],[847,1],[849,2],[868,1],[937,1],[966,1],[1042,1],[1044,2],[1150,1],[1285,1],[1337,1],[1363,2],[1366,3],[1377,1],[1429,1],[1480,1],[1502,2],[1505,3],[1509,1],[1563,1],[1588,2],[1591,3],[1595,1],[1764,1],[1776,2],[1779,3],[1783,1],[1838,1],[1840,1],[1853,2],[1856,3],[1873,2]]},"342":{"position":[[171,1],[196,1],[312,1],[330,1],[375,2],[498,1],[500,2],[711,1],[767,2],[824,1],[832,2],[919,1],[928,2],[1013,1],[1021,1],[1023,1]]},"344":{"position":[[294,2],[297,3],[308,1],[343,1],[412,1],[414,2],[417,3],[444,1],[487,1],[489,3],[493,2],[496,1],[498,2],[501,3],[505,2],[570,2],[648,1],[670,1],[672,2],[675,3],[697,2],[700,3],[739,1],[741,1],[804,1],[837,2],[842,3],[858,1],[1003,3],[1007,1],[1032,1],[1034,1],[1036,1],[1038,2],[1041,3],[1045,2],[1135,1],[1197,1],[1199,3],[1203,2],[1206,1],[1208,2],[1211,3],[1260,1],[1262,2],[1265,3],[1287,2],[1290,3],[1330,1],[1456,1],[1458,1],[1460,1]]},"346":{"position":[[213,1],[240,1],[292,1],[305,1],[395,1],[397,2],[400,3],[404,2],[451,2],[515,2],[664,1],[666,4],[682,1],[690,1],[746,1],[748,1],[762,1],[770,1],[831,2],[861,2],[932,2],[941,1],[964,1],[966,1],[968,1],[970,1]]},"348":{"position":[[330,1],[336,1],[350,2],[353,3],[416,1],[433,2],[436,3],[479,1],[494,1],[579,1],[611,3],[620,2],[632,3],[636,3],[640,1],[651,1],[661,1],[680,3],[684,4],[689,1],[704,1],[715,1],[729,1],[779,1],[788,1],[801,1],[809,1],[826,1],[828,1],[853,3],[862,2],[871,3],[885,2],[902,3],[915,2],[931,3],[935,4],[940,1],[986,1],[1000,3],[1009,2],[1020,3],[1034,2],[1053,3],[1066,2],[1084,3],[1088,4],[1093,1],[1141,1],[1147,1],[1162,1],[1210,1],[1222,1],[1292,1],[1338,2],[1394,1],[1396,1],[1550,1],[1566,1],[1610,2],[1613,3],[1676,1],[1678,2],[1681,3],[1735,1],[1744,1],[1757,1],[1763,1],[1776,1],[1836,2],[1968,2],[2023,1],[2035,1],[2046,1],[2048,1],[2050,1],[2188,1],[2204,1],[2248,2],[2251,3],[2314,1],[2316,2],[2319,3],[2340,1],[2348,2],[2351,2],[2354,1],[2360,1],[2373,1],[2486,1],[2498,1],[2500,2],[2624,1],[2626,1],[2628,1]]},"350":{"position":[[1577,1],[1632,1],[1677,2],[1680,3],[1743,1],[1745,2],[1748,3],[1817,1],[1819,4],[1846,1],[1874,1],[1876,3],[1884,1],[1886,2],[1943,1],[2054,1],[2062,1],[2077,2],[2128,2],[2183,1],[2185,1],[2210,1],[2218,1],[2220,2],[2234,3],[2238,1],[2240,1],[2242,1],[2250,2],[2329,1],[2331,1],[2423,2],[2426,2],[2544,1],[2556,1],[2567,1],[2569,2],[2615,2],[2663,2],[2784,1],[2818,2],[2905,2],[2981,1],[2983,1]]},"353":{"position":[[373,1],[387,1],[432,2],[435,3],[498,1],[515,3],[519,3],[523,1],[534,3],[538,4],[543,2],[546,3],[550,2],[627,1],[635,1],[637,2],[640,3],[673,1],[737,2],[740,1],[746,1],[759,1],[859,2],[920,2],[971,1],[978,1],[980,2],[983,1],[985,1],[1011,2],[1050,1],[1062,1],[1141,1],[1143,1],[1145,1]]},"355":{"position":[[831,1],[844,1],[875,2],[878,3],[941,1],[958,3],[962,3],[966,1],[977,3],[981,4],[986,2],[989,3],[993,2],[1109,1],[1131,1],[1133,1],[2859,1],[2890,1],[2892,2],[2975,2],[3068,1],[3097,1],[3099,1],[3537,1],[3568,1],[3601,1],[3630,2],[3704,1],[3706,1]]},"364":{"position":[[304,2],[362,2],[488,2]]},"372":{"position":[[385,1],[640,1],[985,1],[992,1],[2101,1]]},"374":{"position":[[637,1]]},"379":{"position":[[76,1],[164,1],[231,1]]},"390":{"position":[[1524,1],[1570,1],[1572,3],[1576,2],[1590,1],[1608,1],[1610,1],[1834,2],[1924,2],[2024,2],[2107,2],[2134,3],[2359,1],[2405,1],[2407,3],[2411,2],[2425,1],[2462,1],[2464,1]]},"394":{"position":[[471,1],[584,1],[604,1],[621,1],[639,1],[673,1],[692,1],[705,1],[791,1],[804,1],[890,1],[1052,1],[1117,1],[1158,1],[1232,1],[1357,1],[1443,1],[1841,3],[1963,1],[1965,3],[2306,3],[2408,1],[2410,3],[2812,3],[2936,1],[2938,3]]},"396":{"position":[[1052,1]]},"400":{"position":[[132,1],[161,1],[234,2],[553,1],[579,1],[609,1],[619,1],[662,1],[664,1],[916,1],[929,1],[931,1],[1014,1],[1115,1],[1117,1],[1119,2],[1133,1],[1135,1],[1183,1],[1242,1],[1244,1],[1246,2],[1249,1]]},"414":{"position":[[250,1],[400,1]]},"416":{"position":[[361,1],[427,1],[485,1],[2777,1],[2844,1],[3753,1],[3755,1],[3816,1],[3949,1],[3951,1],[3953,1]]},"418":{"position":[[543,1],[651,1],[1700,1],[1702,1],[1763,1],[1896,2],[1910,1],[1929,1],[1945,1],[1969,1],[1971,1],[1973,1],[1975,1],[1977,1]]},"420":{"position":[[276,1],[384,1]]},"422":{"position":[[917,1],[919,1],[980,1],[1113,2],[1127,1],[1146,1],[1162,1],[1186,1],[1188,1],[1190,1],[1192,1],[1194,1]]},"424":{"position":[[566,1],[1419,2],[1826,2]]},"455":{"position":[[178,3]]}}}],["0",{"_index":704,"t":{"67":{"position":[[63,2]]}}}],["0.0.0.0",{"_index":1051,"t":{"108":{"position":[[589,7]]},"110":{"position":[[385,10],[620,10]]},"114":{"position":[[581,7]]}}}],["02",{"_index":2227,"t":{"372":{"position":[[958,2]]},"379":{"position":[[50,2],[137,2],[204,2]]}}}],["029b081ba",{"_index":516,"t":{"37":{"position":[[319,10],[610,10]]},"45":{"position":[[357,10],[668,10]]},"118":{"position":[[738,10],[1029,10]]},"142":{"position":[[395,10],[706,10]]}}}],["0400",{"_index":2214,"t":{"372":{"position":[[374,5],[629,5]]}}}],["05",{"_index":1617,"t":{"230":{"position":[[894,3],[949,3]]}}}],["0500",{"_index":1609,"t":{"230":{"position":[[654,5]]}}}],["05:00",{"_index":2229,"t":{"372":{"position":[[973,5]]}}}],["06:00",{"_index":2251,"t":{"379":{"position":[[65,5],[152,5],[219,5]]}}}],["07",{"_index":2212,"t":{"372":{"position":[[354,2],[609,2]]}}}],["0845bdc965b4",{"_index":2001,"t":{"340":{"position":[[724,12]]}}}],["08:53:10.467",{"_index":1608,"t":{"230":{"position":[[640,12]]}}}],["0:48/3:56",{"_index":2129,"t":{"350":{"position":[[2187,9]]}}}],["1",{"_index":155,"t":{"4":{"position":[[4269,2],[4293,2],[4363,2]]},"67":{"position":[[201,2],[576,2]]},"88":{"position":[[552,1],[836,1]]},"297":{"position":[[737,4]]},"390":{"position":[[1776,2],[1949,1]]}}}],["1.5",{"_index":158,"t":{"4":{"position":[[4315,3],[4385,3]]},"67":{"position":[[363,4],[738,4]]}}}],["10",{"_index":177,"t":{"4":{"position":[[4970,2]]},"22":{"position":[[991,2]]},"372":{"position":[[357,2],[612,2]]}}}],["10,000",{"_index":1653,"t":{"234":{"position":[[733,7]]},"236":{"position":[[130,7]]}}}],["10.7",{"_index":1095,"t":{"130":{"position":[[23,4]]}}}],["100",{"_index":626,"t":{"51":{"position":[[1806,4]]}}}],["1000",{"_index":1213,"t":{"160":{"position":[[1571,4]]}}}],["1000:1000",{"_index":2350,"t":{"396":{"position":[[321,9]]}}}],["12",{"_index":1606,"t":{"230":{"position":[[634,2],[824,3],[917,3],[972,3]]}}}],["120",{"_index":727,"t":{"67":{"position":[[1581,4]]},"69":{"position":[[513,3]]}}}],["1234",{"_index":1166,"t":{"150":{"position":[[497,4]]},"168":{"position":[[2345,7],[2893,7]]}}}],["127.0.0.1",{"_index":1263,"t":{"176":{"position":[[1145,9],[1908,10]]},"196":{"position":[[348,9]]}}}],["127.0.0.1:5079",{"_index":1289,"t":{"176":{"position":[[3161,14]]}}}],["127.0.0.1:5079:8080",{"_index":1285,"t":{"176":{"position":[[2746,19]]}}}],["12:32:21.417",{"_index":2213,"t":{"372":{"position":[[360,12]]}}}],["12:32:21.418",{"_index":2224,"t":{"372":{"position":[[615,12]]}}}],["1673e4d57ce7",{"_index":1640,"t":{"230":{"position":[[1205,12]]}}}],["17",{"_index":1607,"t":{"230":{"position":[[637,2]]}}}],["192.168.0.100",{"_index":2216,"t":{"372":{"position":[[510,15],[721,15]]},"396":{"position":[[192,15]]},"412":{"position":[[203,13],[635,13]]}}}],["192.168.0.100:6600",{"_index":1187,"t":{"158":{"position":[[211,21],[477,21]]}}}],["192.168.0.101",{"_index":272,"t":{"12":{"position":[[620,13]]},"206":{"position":[[217,15],[412,15]]}}}],["192.168.0.101:3456",{"_index":1054,"t":{"108":{"position":[[863,18]]},"114":{"position":[[845,18]]},"148":{"position":[[1161,18]]}}}],["192.168.0.101:4000/my/subfold",{"_index":282,"t":{"12":{"position":[[978,31]]}}}],["192.168.0.233:32400",{"_index":732,"t":{"67":{"position":[[1799,22],[1969,22],[2326,22]]},"69":{"position":[[646,22],[800,22],[960,22]]}}}],["192.168.0.xxx",{"_index":1264,"t":{"176":{"position":[[1188,15]]}}}],["19t10:05:42",{"_index":2250,"t":{"379":{"position":[[53,11],[140,11],[207,11]]}}}],["1:50/2:40",{"_index":808,"t":{"76":{"position":[[803,11]]}}}],["1m:20",{"_index":809,"t":{"76":{"position":[[862,7]]}}}],["1psidts=sidt",{"_index":1440,"t":{"208":{"position":[[1108,13]]},"210":{"position":[[473,13],[830,13]]}}}],["1x",{"_index":82,"t":{"4":{"position":[[1571,2],[3254,2]]}}}],["2",{"_index":716,"t":{"67":{"position":[[1110,2]]},"176":{"position":[[3918,2]]},"390":{"position":[[1861,2],[2049,1],[3304,1]]}}}],["2.7",{"_index":1650,"t":{"234":{"position":[[674,3]]},"236":{"position":[[71,3]]}}}],["20",{"_index":830,"t":{"82":{"position":[[532,2],[568,3]]}}}],["200",{"_index":421,"t":{"24":{"position":[[124,3]]},"234":{"position":[[703,3]]},"236":{"position":[[100,3]]},"337":{"position":[[268,3]]}}}],["2023",{"_index":2226,"t":{"372":{"position":[[953,4]]},"379":{"position":[[45,4],[132,4],[199,4]]}}}],["2025",{"_index":1605,"t":{"230":{"position":[[628,5]]},"372":{"position":[[348,5],[603,5]]}}}],["22t11:16:12",{"_index":2228,"t":{"372":{"position":[[961,11]]}}}],["25",{"_index":1447,"t":{"208":{"position":[[1365,3]]}}}],["28c1b7b7",{"_index":1625,"t":{"230":{"position":[[1064,8]]}}}],["2x",{"_index":78,"t":{"4":{"position":[[1532,2],[3215,2]]}}}],["3",{"_index":185,"t":{"4":{"position":[[5171,2]]},"22":{"position":[[1366,2]]},"390":{"position":[[1951,2],[2132,1],[3306,1]]}}}],["3.7",{"_index":2173,"t":{"359":{"position":[[80,5]]}}}],["30",{"_index":151,"t":{"4":{"position":[[4230,3]]}}}],["343b",{"_index":1638,"t":{"230":{"position":[[1195,4]]}}}],["355a",{"_index":1626,"t":{"230":{"position":[[1073,4]]}}}],["36759a8a",{"_index":1620,"t":{"230":{"position":[[1008,8]]}}}],["37",{"_index":1648,"t":{"234":{"position":[[637,2]]},"236":{"position":[[34,2]]}}}],["3be671f5ea2b",{"_index":520,"t":{"37":{"position":[[345,14],[636,14]]},"45":{"position":[[383,14],[694,14]]},"118":{"position":[[764,14],[1055,14]]},"142":{"position":[[421,14],[732,14]]}}}],["3papisid=3axsxpy0mkgu75qb/akisxgqonsdn1jekn",{"_index":751,"t":{"67":{"position":[[2922,44]]},"69":{"position":[[1314,44]]}}}],["3rd",{"_index":615,"t":{"51":{"position":[[1412,3]]},"390":{"position":[[2759,3]]}}}],["3x",{"_index":80,"t":{"4":{"position":[[1550,2],[3233,2]]}}}],["4",{"_index":186,"t":{"4":{"position":[[5182,2]]},"22":{"position":[[1377,2]]},"82":{"position":[[220,2]]},"176":{"position":[[2995,1]]},"390":{"position":[[2051,2]]}}}],["40",{"_index":829,"t":{"82":{"position":[[465,3],[502,2]]}}}],["401",{"_index":2246,"t":{"376":{"position":[[58,3],[142,3]]}}}],["403",{"_index":1960,"t":{"329":{"position":[[3282,3],[3294,3]]},"376":{"position":[[65,3]]}}}],["4676",{"_index":1632,"t":{"230":{"position":[[1133,4]]}}}],["47da",{"_index":1622,"t":{"230":{"position":[[1022,4]]}}}],["48",{"_index":2128,"t":{"350":{"position":[[2179,2]]}}}],["48b1",{"_index":1627,"t":{"230":{"position":[[1078,4]]}}}],["49d7",{"_index":1999,"t":{"340":{"position":[[714,4]]}}}],["4dhe",{"_index":683,"t":{"63":{"position":[[955,4],[1206,4]]},"190":{"position":[[955,4],[1164,4],[1394,4],[1859,4],[2174,4]]}}}],["4pe7",{"_index":518,"t":{"37":{"position":[[335,4],[626,4]]},"45":{"position":[[373,4],[684,4]]},"118":{"position":[[754,4],[1045,4]]},"142":{"position":[[411,4],[722,4]]}}}],["5",{"_index":174,"t":{"4":{"position":[[4947,2],[5194,1]]},"22":{"position":[[968,2],[1389,1]]},"31":{"position":[[126,1]]},"234":{"position":[[656,1]]},"236":{"position":[[53,1]]}}}],["50",{"_index":153,"t":{"4":{"position":[[4245,2]]},"82":{"position":[[155,4]]}}}],["500",{"_index":423,"t":{"24":{"position":[[161,3],[327,3],[451,3],[609,3],[708,3]]}}}],["5353/udp",{"_index":958,"t":{"98":{"position":[[955,9]]}}}],["6",{"_index":2285,"t":{"390":{"position":[[1859,1]]}}}],["60",{"_index":125,"t":{"4":{"position":[[2771,2]]},"178":{"position":[[474,2],[826,2]]}}}],["60f84fdc0cab",{"_index":1624,"t":{"230":{"position":[[1032,12]]}}}],["6600",{"_index":1181,"t":{"156":{"position":[[188,6]]}}}],["6644",{"_index":1214,"t":{"160":{"position":[[1594,5]]}}}],["6680",{"_index":1153,"t":{"148":{"position":[[902,4]]}}}],["6969",{"_index":1984,"t":{"337":{"position":[[673,4]]},"348":{"position":[[653,7]]}}}],["7",{"_index":175,"t":{"4":{"position":[[4958,2]]},"22":{"position":[[979,2]]}}}],["75b8eb8080ef",{"_index":1629,"t":{"230":{"position":[[1088,12]]}}}],["7905",{"_index":1226,"t":{"164":{"position":[[416,5]]}}}],["7cdr86vis3mpq5b1pi01md0hkm7ykzzxjy81r",{"_index":654,"t":{"56":{"position":[[774,40],[1040,40]]}}}],["7ef1",{"_index":1631,"t":{"230":{"position":[[1128,4]]}}}],["846b",{"_index":2000,"t":{"340":{"position":[[719,4]]}}}],["882e",{"_index":1633,"t":{"230":{"position":[[1138,4]]}}}],["88e5",{"_index":519,"t":{"37":{"position":[[340,4],[631,4]]},"45":{"position":[[378,4],[689,4]]},"118":{"position":[[759,4],[1050,4]]},"142":{"position":[[416,4],[727,4]]}}}],["8910....6jqupl.apps.googleusercontent.com",{"_index":1468,"t":{"208":{"position":[[2647,44],[3876,44]]}}}],["891098404....apps.googleusercontent.com",{"_index":1507,"t":{"210":{"position":[[521,42],[878,42]]}}}],["8dcc73a59",{"_index":2233,"t":{"372":{"position":[[1082,10]]}}}],["90",{"_index":1772,"t":{"254":{"position":[[206,3],[228,2],[253,2]]}}}],["9078",{"_index":267,"t":{"12":{"position":[[301,4]]},"372":{"position":[[2259,4]]},"394":{"position":[[2231,5]]},"396":{"position":[[144,4]]},"400":{"position":[[1306,5]]},"412":{"position":[[161,4]]}}}],["9078:9078",{"_index":1724,"t":{"247":{"position":[[1935,11]]},"309":{"position":[[1052,11]]},"394":{"position":[[1433,9],[2313,9],[2423,11]]},"396":{"position":[[633,9],[788,9],[1432,11]]},"414":{"position":[[496,11]]}}}],["9156",{"_index":517,"t":{"37":{"position":[[330,4],[621,4]]},"45":{"position":[[368,4],[679,4]]},"118":{"position":[[749,4],[1040,4]]},"142":{"position":[[406,4],[717,4]]}}}],["9390",{"_index":1639,"t":{"230":{"position":[[1200,4]]}}}],["__secur",{"_index":750,"t":{"67":{"position":[[2912,9]]},"69":{"position":[[1304,9]]},"208":{"position":[[1098,9]]},"210":{"position":[[463,9],[820,9]]}}}],["_transforms=musicbrainz",{"_index":1705,"t":{"247":{"position":[[855,24]]}}}],["_transforms=n",{"_index":1880,"t":{"309":{"position":[[115,19]]}}}],["a0d51240",{"_index":1630,"t":{"230":{"position":[[1119,8]]}}}],["a236",{"_index":1623,"t":{"230":{"position":[[1027,4]]}}}],["a89cba1569901a0671d5a9875fed4be1",{"_index":119,"t":{"4":{"position":[[2622,35],[4516,35]]},"8":{"position":[[1033,35]]},"41":{"position":[[537,35],[887,35]]},"128":{"position":[[377,35],[727,35]]},"178":{"position":[[325,35],[677,35]]},"400":{"position":[[1026,35]]}}}],["abcc",{"_index":1637,"t":{"230":{"position":[[1190,4]]}}}],["abcd",{"_index":396,"t":{"22":{"position":[[510,6]]}}}],["abil",{"_index":1255,"t":{"176":{"position":[[355,7]]},"212":{"position":[[36,7]]},"355":{"position":[[2008,7]]}}}],["abov",{"_index":187,"t":{"6":{"position":[[28,5]]},"114":{"position":[[487,6]]},"164":{"position":[[330,6]]},"216":{"position":[[33,5]]},"226":{"position":[[824,5]]},"247":{"position":[[32,5]]},"251":{"position":[[724,5],[1135,5],[2249,5]]},"256":{"position":[[1164,5]]},"261":{"position":[[822,5]]},"309":{"position":[[32,5]]},"366":{"position":[[1036,5]]},"396":{"position":[[878,5]]},"424":{"position":[[1947,5]]},"444":{"position":[[377,5]]}}}],["above...aft",{"_index":2402,"t":{"416":{"position":[[772,13]]}}}],["absolut",{"_index":2187,"t":{"364":{"position":[[369,8]]}}}],["abstract",{"_index":1915,"t":{"325":{"position":[[325,8]]},"329":{"position":[[27,8]]}}}],["abstractcompon",{"_index":1925,"t":{"329":{"position":[[48,18]]},"340":{"position":[[1924,17]]}}}],["abstractsourc",{"_index":2054,"t":{"344":{"position":[[1230,15]]},"355":{"position":[[2702,14],[2844,14],[3522,14]]}}}],["abstractsource'",{"_index":2155,"t":{"355":{"position":[[1970,16]]}}}],["accept",{"_index":525,"t":{"39":{"position":[[103,6]]},"43":{"position":[[110,6]]},"120":{"position":[[39,6]]},"122":{"position":[[69,6]]},"124":{"position":[[268,9]]},"126":{"position":[[168,6]]},"132":{"position":[[39,6]]},"134":{"position":[[69,6]]},"138":{"position":[[348,9]]},"140":{"position":[[209,6]]},"164":{"position":[[42,6]]},"176":{"position":[[668,6]]},"192":{"position":[[1453,7]]},"340":{"position":[[1948,7]]},"342":{"position":[[82,6]]}}}],["access",{"_index":496,"t":{"35":{"position":[[523,6],[570,10],[1626,10]]},"51":{"position":[[938,9]]},"58":{"position":[[1016,9]]},"65":{"position":[[418,6]]},"76":{"position":[[461,10]]},"86":{"position":[[633,6]]},"90":{"position":[[47,6]]},"160":{"position":[[201,6],[429,6],[1056,6],[1377,6]]},"168":{"position":[[327,9]]},"172":{"position":[[66,6]]},"176":{"position":[[505,6],[1049,6],[1820,10]]},"186":{"position":[[66,6]]},"192":{"position":[[521,10],[607,11]]},"196":{"position":[[564,10],[655,9]]},"208":{"position":[[1420,6],[4516,6]]},"329":{"position":[[1869,10]]},"337":{"position":[[656,8],[770,8]]},"372":{"position":[[2012,6]]},"374":{"position":[[155,6],[222,10]]},"376":{"position":[[784,6],[827,6]]},"390":{"position":[[506,6]]},"394":{"position":[[2117,6]]},"416":{"position":[[516,6]]},"424":{"position":[[1690,6],[1737,10],[2334,10]]},"444":{"position":[[323,8]]}}}],["accesstoken",{"_index":723,"t":{"67":{"position":[[1503,14]]},"69":{"position":[[435,14]]}}}],["accident",{"_index":1809,"t":{"258":{"position":[[637,12]]}}}],["accordingli",{"_index":2465,"t":{"453":{"position":[[336,12]]}}}],["account",{"_index":79,"t":{"4":{"position":[[1540,9],[1561,9],[3223,9],[3244,9]]},"35":{"position":[[60,7]]},"37":{"position":[[122,7]]},"39":{"position":[[66,7],[229,7]]},"41":{"position":[[123,7],[177,7]]},"43":{"position":[[68,7],[296,7]]},"51":{"position":[[674,8]]},"53":{"position":[[24,7],[168,7]]},"56":{"position":[[108,7],[165,8],[206,7],[558,7]]},"58":{"position":[[756,8]]},"60":{"position":[[26,8]]},"63":{"position":[[200,7],[257,8],[297,7],[706,7]]},"65":{"position":[[147,7],[253,7],[312,7]]},"90":{"position":[[286,8]]},"120":{"position":[[228,8]]},"132":{"position":[[248,8]]},"140":{"position":[[395,7]]},"176":{"position":[[656,7]]},"196":{"position":[[88,8]]},"208":{"position":[[1810,8]]},"390":{"position":[[2633,7]]},"416":{"position":[[1243,8],[3324,7],[3428,7],[3707,7],[4140,8]]},"424":{"position":[[915,7],[1019,7]]}}}],["account'",{"_index":1079,"t":{"118":{"position":[[29,9]]},"140":{"position":[[36,9]]}}}],["accur",{"_index":1253,"t":{"176":{"position":[[122,10]]},"180":{"position":[[520,8]]},"251":{"position":[[5568,8]]},"390":{"position":[[59,10]]}}}],["accuraci",{"_index":1256,"t":{"176":{"position":[[411,8]]},"350":{"position":[[479,8]]}}}],["achiev",{"_index":1585,"t":{"226":{"position":[[424,7]]}}}],["action",{"_index":296,"t":{"14":{"position":[[123,7]]},"84":{"position":[[376,6]]},"86":{"position":[[1060,6]]}}}],["activ",{"_index":287,"t":{"14":{"position":[[28,10],[150,10]]},"33":{"position":[[606,7],[723,6]]},"35":{"position":[[38,8]]},"39":{"position":[[39,8]]},"43":{"position":[[39,8]]},"51":{"position":[[38,8]]},"58":{"position":[[38,8]]},"73":{"position":[[105,6],[112,8],[136,6],[184,6],[191,8],[216,6],[223,8],[249,6],[256,8],[280,6],[287,8],[309,6],[316,8],[339,6],[370,6],[449,6],[527,6],[557,6],[564,8],[607,6],[614,8],[641,6],[648,8],[670,6],[677,8],[702,6],[733,6],[740,8],[782,6],[789,8],[814,6],[878,6],[885,8],[919,6],[926,8],[957,6]]},"76":{"position":[[168,6],[302,8],[644,8],[948,8]]},"78":{"position":[[164,8]]},"82":{"position":[[23,6]]},"98":{"position":[[1635,8]]},"120":{"position":[[201,8]]},"126":{"position":[[72,8]]},"132":{"position":[[216,8]]},"337":{"position":[[848,8]]},"342":{"position":[[969,8]]},"412":{"position":[[373,8]]},"416":{"position":[[86,9],[536,8],[3121,8]]},"418":{"position":[[45,8]]},"424":{"position":[[87,8]]},"426":{"position":[[624,8]]},"430":{"position":[[1623,8]]}}}],["actual",{"_index":529,"t":{"39":{"position":[[263,8]]},"176":{"position":[[251,6]]},"190":{"position":[[244,6]]},"224":{"position":[[681,6]]},"251":{"position":[[5772,8]]},"256":{"position":[[1716,6]]},"297":{"position":[[34,8]]},"355":{"position":[[3940,8]]},"376":{"position":[[658,6]]},"390":{"position":[[3142,8]]}}}],["ad",{"_index":341,"t":{"14":{"position":[[3062,6],[3131,5],[3236,6]]},"84":{"position":[[592,6]]},"86":{"position":[[1257,6]]},"152":{"position":[[196,6]]},"196":{"position":[[271,6]]},"218":{"position":[[485,6]]},"226":{"position":[[192,5]]},"234":{"position":[[438,6],[508,6]]},"241":{"position":[[442,5]]},"261":{"position":[[633,6]]}}}],["adapt",{"_index":630,"t":{"53":{"position":[[62,7]]}}}],["add",{"_index":367,"t":{"16":{"position":[[430,3]]},"47":{"position":[[209,3],[503,3]]},"86":{"position":[[446,3]]},"160":{"position":[[1675,3]]},"176":{"position":[[4127,3]]},"196":{"position":[[97,3]]},"208":{"position":[[959,3],[2082,3],[3228,3],[3712,3]]},"212":{"position":[[501,4]]},"214":{"position":[[385,4],[804,4]]},"245":{"position":[[418,4]]},"261":{"position":[[778,3]]},"340":{"position":[[1152,3],[1633,3]]},"344":{"position":[[220,3],[578,3]]},"348":{"position":[[257,3]]},"390":{"position":[[1166,4],[1487,3]]},"394":{"position":[[1249,3]]},"406":{"position":[[172,3]]},"416":{"position":[[216,3],[813,3],[2220,4],[2592,3]]},"418":{"position":[[433,3],[936,3],[1079,3],[1221,3],[1359,3],[1567,3]]},"420":{"position":[[166,3]]},"422":{"position":[[153,3],[296,3],[438,3],[576,3],[784,3]]},"424":{"position":[[393,3],[690,3],[1070,3],[1984,3]]}}}],["add/substitut",{"_index":2433,"t":{"424":{"position":[[1925,14]]}}}],["addit",{"_index":628,"t":{"51":{"position":[[1851,10]]},"84":{"position":[[280,10]]},"98":{"position":[[1449,10],[1523,10]]},"102":{"position":[[1052,10]]},"130":{"position":[[721,10]]},"160":{"position":[[1118,10]]},"241":{"position":[[354,10],[395,11],[975,10]]},"251":{"position":[[2307,10],[2633,10],[3053,10],[4267,10]]},"258":{"position":[[31,10]]},"303":{"position":[[144,8],[734,10]]},"316":{"position":[[160,10]]},"327":{"position":[[496,10]]},"329":{"position":[[859,10]]},"372":{"position":[[1572,10]]},"453":{"position":[[84,10]]}}}],["addition",{"_index":843,"t":{"84":{"position":[[498,13]]},"86":{"position":[[1182,13]]},"251":{"position":[[4876,12]]},"348":{"position":[[213,13]]},"350":{"position":[[984,12]]},"355":{"position":[[3106,12]]},"412":{"position":[[604,13]]}}}],["additionalallowedlibrarytyp",{"_index":1103,"t":{"130":{"position":[[906,29],[2543,32],[3162,32]]}}}],["additionalconfig",{"_index":2039,"t":{"344":{"position":[[452,19]]}}}],["additon",{"_index":1491,"t":{"208":{"position":[[5044,7]]}}}],["address",{"_index":1180,"t":{"156":{"position":[[175,7]]},"176":{"position":[[1134,7]]},"372":{"position":[[484,8],[1830,7]]},"374":{"position":[[130,7],[388,9],[458,7]]}}}],["address/ip",{"_index":1290,"t":{"176":{"position":[[3185,10]]}}}],["addsourc",{"_index":2051,"t":{"344":{"position":[[1125,9]]}}}],["admin",{"_index":521,"t":{"37":{"position":[[372,8],[663,8]]},"47":{"position":[[255,5],[341,5]]},"118":{"position":[[791,8],[1082,8]]},"130":{"position":[[413,5]]},"424":{"position":[[439,5],[525,5]]}}}],["administr",{"_index":850,"t":{"86":{"position":[[303,14]]},"130":{"position":[[123,14]]}}}],["advanc",{"_index":88,"t":{"4":{"position":[[1746,8]]},"108":{"position":[[455,8]]},"180":{"position":[[248,8]]},"428":{"position":[[9,8]]}}}],["advantag",{"_index":2114,"t":{"350":{"position":[[932,9],[1253,9]]}}}],["affect",{"_index":252,"t":{"10":{"position":[[14,6]]},"33":{"position":[[400,7]]},"176":{"position":[[343,6],[400,6]]},"200":{"position":[[192,7],[232,6]]},"208":{"position":[[4220,7]]},"218":{"position":[[599,6]]},"327":{"position":[[476,6]]}}}],["after=network.target",{"_index":2389,"t":{"406":{"position":[[276,20]]}}}],["afterward",{"_index":366,"t":{"16":{"position":[[393,11]]},"376":{"position":[[1117,11]]}}}],["again",{"_index":671,"t":{"60":{"position":[[237,5]]},"208":{"position":[[4663,5]]},"390":{"position":[[3198,6]]}}}],["against",{"_index":621,"t":{"51":{"position":[[1618,7]]},"218":{"position":[[1547,7]]},"256":{"position":[[228,7]]},"350":{"position":[[802,7]]},"355":{"position":[[2446,7],[4001,7]]}}}],["agent",{"_index":1682,"t":{"241":{"position":[[89,5]]}}}],["aggreg",{"_index":427,"t":{"24":{"position":[[230,10],[388,10]]}}}],["aggress",{"_index":927,"t":{"96":{"position":[[246,12],[397,12],[464,12]]},"247":{"position":[[744,10]]},"251":{"position":[[3185,10]]}}}],["agnost",{"_index":587,"t":{"51":{"position":[[391,8]]},"58":{"position":[[473,8]]}}}],["agress",{"_index":1739,"t":{"251":{"position":[[1266,11]]}}}],["aio",{"_index":25,"t":{"4":{"position":[[310,3],[1969,3],[3097,3],[3499,3],[3623,3]]},"8":{"position":[[19,3]]},"14":{"position":[[846,3],[1603,3],[2227,3],[2584,3],[2715,3],[3562,3]]},"16":{"position":[[440,3]]},"22":{"position":[[218,3]]},"33":{"position":[[891,3],[984,3]]},"37":{"position":[[9,3],[486,3]]},"41":{"position":[[9,3],[744,3]]},"45":{"position":[[9,3],[528,3]]},"49":{"position":[[9,3],[399,3]]},"56":{"position":[[428,3],[915,3]]},"63":{"position":[[566,3],[1036,3]]},"82":{"position":[[369,3]]},"84":{"position":[[652,3]]},"86":{"position":[[1317,3]]},"88":{"position":[[9,3]]},"94":{"position":[[9,3]]},"100":{"position":[[9,3]]},"104":{"position":[[9,3]]},"110":{"position":[[9,3],[511,3]]},"116":{"position":[[9,3],[458,3]]},"118":{"position":[[396,3],[592,3],[905,3]]},"124":{"position":[[9,3],[467,3]]},"128":{"position":[[9,3],[209,3],[584,3]]},"130":{"position":[[1207,3]]},"138":{"position":[[9,3],[546,3]]},"142":{"position":[[9,3],[219,3],[566,3]]},"146":{"position":[[9,3],[208,3],[493,3]]},"154":{"position":[[9,3],[281,3]]},"158":{"position":[[9,3],[371,3]]},"162":{"position":[[9,3],[555,3]]},"166":{"position":[[9,3],[398,3]]},"168":{"position":[[1555,3],[2766,3]]},"174":{"position":[[198,3],[398,3],[690,3]]},"178":{"position":[[9,3],[547,3]]},"180":{"position":[[657,3]]},"182":{"position":[[9,3],[454,3]]},"190":{"position":[[1458,3],[1658,3],[1998,3]]},"194":{"position":[[9,3],[323,3]]},"202":{"position":[[9,3],[546,3]]},"206":{"position":[[9,3],[303,3]]},"210":{"position":[[9,3],[692,3]]},"222":{"position":[[40,3],[457,3],[1107,3],[1942,3]]},"241":{"position":[[193,3]]},"270":{"position":[[13,3]]},"272":{"position":[[101,3]]},"274":{"position":[[290,3]]},"276":{"position":[[198,3]]},"312":{"position":[[13,3]]},"314":{"position":[[13,3]]}}}],["airson",{"_index":690,"t":{"65":{"position":[[173,8]]},"71":{"position":[[167,9]]},"180":{"position":[[126,8],[239,8]]},"430":{"position":[[400,8]]}}}],["aka",{"_index":1797,"t":{"256":{"position":[[1104,3]]}}}],["album",{"_index":1167,"t":{"152":{"position":[[69,7],[118,5],[182,5],[212,5],[437,6]]},"192":{"position":[[1136,5],[1443,6]]},"212":{"position":[[150,5],[549,6]]},"224":{"position":[[148,5],[434,5],[448,8],[500,5]]},"228":{"position":[[580,8],[626,5],[758,8],[804,5],[923,8],[958,5],[1040,5]]},"230":{"position":[[853,5],[877,5],[932,5],[1001,6]]},"234":{"position":[[667,6]]},"236":{"position":[[64,6]]},"245":{"position":[[345,8],[396,5]]},"251":{"position":[[110,6],[416,5],[611,5],[661,8],[951,5],[1247,6],[2350,5],[2419,5],[2507,6],[2670,5],[2737,5],[4785,5]]},"256":{"position":[[302,7],[365,5],[408,6],[473,5],[530,5],[796,6]]},"258":{"position":[[922,7],[1000,9]]},"261":{"position":[[471,6],[534,9]]},"265":{"position":[[567,8]]},"272":{"position":[[344,9]]},"274":{"position":[[721,8]]},"276":{"position":[[441,9]]},"278":{"position":[[243,6]]},"280":{"position":[[282,7]]},"284":{"position":[[437,6]]},"289":{"position":[[19,6],[81,7]]},"295":{"position":[[10,8]]},"305":{"position":[[326,8],[377,5]]},"331":{"position":[[200,6]]},"346":{"position":[[795,6]]},"390":{"position":[[2910,5]]}}}],["albumartist",{"_index":1574,"t":{"224":{"position":[[375,15]]},"228":{"position":[[1046,11]]},"265":{"position":[[583,15]]},"274":{"position":[[737,15]]}}}],["albumblacklist",{"_index":1170,"t":{"152":{"position":[[355,17]]},"154":{"position":[[190,17],[443,17]]}}}],["albumnam",{"_index":2071,"t":{"346":{"position":[[715,10],[802,10]]}}}],["alice.bsky.soci",{"_index":642,"t":{"56":{"position":[[135,17],[825,19],[1091,19]]},"63":{"position":[[227,17],[908,20],[1159,20]]},"174":{"position":[[600,19],[866,19]]},"190":{"position":[[908,20],[1117,20],[1347,20],[1812,20],[2127,20]]}}}],["allow",{"_index":482,"t":{"33":{"position":[[1220,7]]},"35":{"position":[[1506,5]]},"51":{"position":[[224,5]]},"58":{"position":[[306,5]]},"98":{"position":[[928,5],[1974,5],[2061,7],[2175,5],[2351,5]]},"112":{"position":[[167,5]]},"130":{"position":[[623,7],[939,5],[2013,5]]},"150":{"position":[[32,5]]},"168":{"position":[[94,7],[398,5],[1338,7],[2130,5]]},"176":{"position":[[1081,6]]},"190":{"position":[[781,8],[1207,5]]},"220":{"position":[[166,6]]},"222":{"position":[[1037,8]]},"256":{"position":[[482,7],[1217,5],[1384,5],[1800,5],[1866,5]]},"263":{"position":[[55,5],[106,5]]},"329":{"position":[[351,5]]},"355":{"position":[[2587,8]]},"386":{"position":[[280,5]]},"424":{"position":[[2214,5]]}}}],["allowed/deni",{"_index":1332,"t":{"190":{"position":[[469,14]]}}}],["allowunknown",{"_index":1106,"t":{"130":{"position":[[1135,15],[2593,15],[3214,15]]}}}],["allowunknownmedia",{"_index":990,"t":{"98":{"position":[[2080,20],[2407,20]]}}}],["allowunknownmedia=fals",{"_index":2261,"t":{"386":{"position":[[231,24]]}}}],["along",{"_index":137,"t":{"4":{"position":[[3967,5]]},"220":{"position":[[605,5]]}}}],["alongsid",{"_index":1582,"t":{"226":{"position":[[230,9]]},"335":{"position":[[90,9]]},"428":{"position":[[261,9]]}}}],["alphabet",{"_index":477,"t":{"33":{"position":[[835,14]]}}}],["alpin",{"_index":968,"t":{"98":{"position":[[1120,7]]}}}],["alreadi",{"_index":250,"t":{"8":{"position":[[1893,7]]},"14":{"position":[[637,7],[1394,7]]},"35":{"position":[[129,7]]},"47":{"position":[[38,7]]},"56":{"position":[[284,7]]},"60":{"position":[[48,7]]},"63":{"position":[[379,7]]},"67":{"position":[[1651,7]]},"176":{"position":[[1523,7]]},"214":{"position":[[271,7],[414,8],[652,7],[838,7]]},"218":{"position":[[153,7],[389,7],[495,7]]},"234":{"position":[[393,7]]},"251":{"position":[[73,7],[165,7],[3376,7]]},"323":{"position":[[201,7]]},"355":{"position":[[472,7],[2366,7],[2454,7]]},"416":{"position":[[3056,7]]},"424":{"position":[[222,7],[1300,7]]},"430":{"position":[[2058,7]]}}}],["altern",{"_index":1273,"t":{"176":{"position":[[1779,14]]},"251":{"position":[[5441,11]]},"258":{"position":[[391,11]]},"453":{"position":[[442,14]]}}}],["alway",{"_index":298,"t":{"14":{"position":[[171,6]]},"84":{"position":[[732,6]]},"86":{"position":[[1397,6]]},"98":{"position":[[479,6],[1875,6],[2778,6],[2935,6]]},"118":{"position":[[525,6]]},"128":{"position":[[142,6]]},"142":{"position":[[152,6]]},"146":{"position":[[140,6]]},"174":{"position":[[331,6]]},"176":{"position":[[3760,6]]},"190":{"position":[[1591,6]]},"224":{"position":[[405,6],[471,6],[532,6],[610,6]]},"228":{"position":[[1417,6]]},"245":{"position":[[367,6]]},"247":{"position":[[147,6]]},"251":{"position":[[701,6]]},"256":{"position":[[334,6]]},"258":{"position":[[613,6]]},"305":{"position":[[348,6]]},"327":{"position":[[41,6]]},"355":{"position":[[231,6],[445,6],[695,6],[2619,8]]}}}],["ambplayobject",{"_index":1968,"t":{"331":{"position":[[750,13]]}}}],["amount",{"_index":826,"t":{"82":{"position":[[172,6]]},"234":{"position":[[1463,6]]},"238":{"position":[[367,6]]}}}],["and/or",{"_index":370,"t":{"18":{"position":[[33,6]]},"51":{"position":[[1640,6]]},"78":{"position":[[50,6]]},"134":{"position":[[804,6]]},"192":{"position":[[1436,6]]},"224":{"position":[[141,6]]},"303":{"position":[[394,6]]},"340":{"position":[[2133,6]]},"350":{"position":[[1078,6]]},"355":{"position":[[39,6]]},"412":{"position":[[344,6],[428,6]]},"430":{"position":[[1286,6]]},"444":{"position":[[260,6]]}}}],["android",{"_index":703,"t":{"65":{"position":[[908,7]]}}}],["anecdot",{"_index":1813,"t":{"261":{"position":[[164,12]]}}}],["annot",{"_index":1996,"t":{"340":{"position":[[554,10]]},"396":{"position":[[905,12]]}}}],["anoth",{"_index":602,"t":{"51":{"position":[[960,7]]},"58":{"position":[[1038,7]]},"297":{"position":[[194,7],[581,7],[644,7]]},"372":{"position":[[2288,7]]},"396":{"position":[[34,7]]}}}],["anotherbadterm",{"_index":1835,"t":{"282":{"position":[[463,17],[507,16],[595,14]]}}}],["anotherus",{"_index":1119,"t":{"130":{"position":[[2399,16],[3010,13]]},"168":{"position":[[2451,13],[2999,13]]}}}],["any/al",{"_index":1001,"t":{"98":{"position":[[3099,7]]}}}],["anyon",{"_index":1232,"t":{"168":{"position":[[311,6]]}}}],["anyth",{"_index":425,"t":{"24":{"position":[[190,8]]},"136":{"position":[[112,8]]},"251":{"position":[[4321,8]]},"261":{"position":[[408,8]]},"416":{"position":[[1939,9]]}}}],["anywher",{"_index":1549,"t":{"218":{"position":[[740,8]]}}}],["apassword",{"_index":1063,"t":{"110":{"position":[[429,11],[664,11]]}}}],["api",{"_index":293,"t":{"14":{"position":[[98,3],[289,3],[1821,3]]},"18":{"position":[[161,3]]},"35":{"position":[[167,3],[251,3],[1034,3]]},"37":{"position":[[98,3]]},"39":{"position":[[225,3]]},"41":{"position":[[101,3],[119,3],[173,3]]},"47":{"position":[[384,3],[533,3]]},"49":{"position":[[146,3]]},"53":{"position":[[240,3]]},"56":{"position":[[614,3]]},"67":{"position":[[1669,3]]},"73":{"position":[[777,4]]},"92":{"position":[[153,3]]},"130":{"position":[[49,3],[154,3],[302,3],[372,3],[618,4],[1389,3],[1416,3]]},"168":{"position":[[1740,3]]},"176":{"position":[[324,4]]},"180":{"position":[[73,3],[602,4]]},"182":{"position":[[165,3]]},"196":{"position":[[109,3],[376,3],[469,3]]},"198":{"position":[[103,3],[376,3],[458,3]]},"204":{"position":[[396,3]]},"208":{"position":[[1860,4],[3054,4],[3524,3]]},"222":{"position":[[407,3]]},"234":{"position":[[1666,3]]},"241":{"position":[[45,3],[295,7],[455,3],[560,3],[864,7]]},"243":{"position":[[215,7]]},"267":{"position":[[230,3]]},"270":{"position":[[115,7]]},"272":{"position":[[203,7]]},"274":{"position":[[392,7]]},"276":{"position":[[300,7]]},"319":{"position":[[317,3]]},"327":{"position":[[322,3]]},"337":{"position":[[187,4],[196,4],[763,3],[832,3]]},"342":{"position":[[996,3]]},"346":{"position":[[101,3],[596,3]]},"348":{"position":[[706,8]]},"372":{"position":[[393,5],[648,5],[832,3]]},"382":{"position":[[36,3]]},"394":{"position":[[1507,3]]},"400":{"position":[[568,3],[1284,3]]},"416":{"position":[[201,3],[429,3],[3320,3],[3462,3],[3703,3]]},"418":{"position":[[263,3]]},"424":{"position":[[568,3],[911,3],[1338,3],[1422,3]]},"430":{"position":[[389,4],[1398,4]]}}}],["api/health",{"_index":1978,"t":{"337":{"position":[[243,11]]}}}],["api/live/nowplaying/websocket",{"_index":855,"t":{"86":{"position":[[484,31]]}}}],["api/now",{"_index":1983,"t":{"337":{"position":[[492,8]]}}}],["api/rec",{"_index":1980,"t":{"337":{"position":[[414,11]]}}}],["apikey",{"_index":164,"t":{"4":{"position":[[4771,9]]},"8":{"position":[[587,9],[1023,9]]},"41":{"position":[[527,9],[877,9]]},"49":{"position":[[305,9],[566,9]]},"67":{"position":[[2572,9],[3266,9],[3384,9],[3502,9],[3579,9]]},"69":{"position":[[1127,9],[1660,9],[1760,9],[1860,9],[1945,9]]},"128":{"position":[[367,9],[717,9]]},"130":{"position":[[1471,6],[1579,6],[2265,9],[2903,9]]},"146":{"position":[[399,9],[660,9]]},"400":{"position":[[1016,9],[1218,9]]},"416":{"position":[[3818,9]]},"418":{"position":[[1765,9]]},"422":{"position":[[982,9]]}}}],["apis/listenbrainz",{"_index":501,"t":{"35":{"position":[[742,18]]}}}],["app",{"_index":240,"t":{"8":{"position":[[1598,5]]},"51":{"position":[[1061,3]]},"58":{"position":[[1139,3]]},"60":{"position":[[153,3],[180,3]]},"63":{"position":[[788,3]]},"65":{"position":[[922,3]]},"69":{"position":[[62,3]]},"98":{"position":[[640,3],[2368,3]]},"100":{"position":[[499,5],[602,5]]},"130":{"position":[[260,3]]},"134":{"position":[[381,4]]},"176":{"position":[[559,3],[757,3],[830,3],[1685,4],[4052,4]]},"230":{"position":[[668,5]]},"319":{"position":[[291,3]]},"364":{"position":[[105,3]]},"366":{"position":[[95,4],[1062,3]]},"372":{"position":[[105,3],[387,5],[642,5],[987,4]]},"379":{"position":[[78,5],[84,3],[166,5],[233,5]]},"386":{"position":[[17,3]]},"396":{"position":[[132,3]]},"402":{"position":[[98,3]]},"416":{"position":[[571,3]]},"430":{"position":[[13,3],[1113,4],[1300,3],[1490,4]]}}}],["app'",{"_index":1303,"t":{"176":{"position":[[4097,5]]}}}],["app.rockski",{"_index":599,"t":{"51":{"position":[[860,14]]}}}],["appear",{"_index":2272,"t":{"390":{"position":[[831,6]]}}}],["append",{"_index":600,"t":{"51":{"position":[[893,8]]},"56":{"position":[[377,6]]},"58":{"position":[[971,8]]},"63":{"position":[[515,6]]},"204":{"position":[[367,6]]},"329":{"position":[[615,6]]},"366":{"position":[[1005,6]]}}}],["appli",{"_index":1572,"t":{"224":{"position":[[41,5],[230,5],[309,5],[412,5],[478,5],[539,5],[617,5]]},"245":{"position":[[200,5],[279,5],[374,5]]},"247":{"position":[[337,6],[372,8],[470,7],[570,7],[643,7],[757,7],[914,5],[940,7],[1719,7]]},"265":{"position":[[13,5],[234,8]]},"305":{"position":[[181,5],[260,5],[355,5]]},"309":{"position":[[50,7],[169,5],[195,7],[841,7]]}}}],["applic",{"_index":440,"t":{"26":{"position":[[15,11]]},"39":{"position":[[133,12]]},"43":{"position":[[140,12]]},"51":{"position":[[240,12],[423,11],[554,11],[968,11]]},"58":{"position":[[322,12],[505,11],[636,11],[1046,11]]},"65":{"position":[[375,11]]},"67":{"position":[[1306,12],[1639,11]]},"92":{"position":[[374,12]]},"98":{"position":[[1715,11],[1834,11],[2214,12],[2246,11],[2539,11],[2598,11],[2748,11],[2889,12]]},"120":{"position":[[69,12]]},"126":{"position":[[198,12]]},"132":{"position":[[69,12]]},"134":{"position":[[315,11],[720,12]]},"138":{"position":[[287,11]]},"140":{"position":[[239,12]]},"180":{"position":[[32,11]]},"196":{"position":[[206,11]]},"208":{"position":[[2188,11],[2212,11]]},"247":{"position":[[198,12]]},"323":{"position":[[128,11]]},"416":{"position":[[790,11]]},"436":{"position":[[15,11]]},"444":{"position":[[395,10]]}}}],["apppassword",{"_index":680,"t":{"63":{"position":[[929,14],[1180,14]]},"190":{"position":[[929,14],[1138,14],[1368,14],[1833,14],[2148,14]]}}}],["appris",{"_index":408,"t":{"22":{"position":[[1395,8],[1564,10]]},"430":{"position":[[736,8]]}}}],["appriseconfig",{"_index":409,"t":{"22":{"position":[[1435,13]]}}}],["approach",{"_index":1293,"t":{"176":{"position":[[3443,8],[3889,9]]}}}],["appropri",{"_index":1467,"t":{"208":{"position":[[2553,11]]},"263":{"position":[[280,11]]}}}],["aqzi58fa.rfszbm",{"_index":404,"t":{"22":{"position":[[925,18]]}}}],["arch",{"_index":2381,"t":{"404":{"position":[[128,5]]}}}],["architectur",{"_index":2363,"t":{"400":{"position":[[365,12]]},"448":{"position":[[9,12]]}}}],["arg",{"_index":2185,"t":{"364":{"position":[[295,5]]}}}],["arl",{"_index":890,"t":{"92":{"position":[[4,3],[103,3],[270,3],[505,4],[718,3]]},"94":{"position":[[85,3],[219,6],[522,6]]},"96":{"position":[[325,6]]}}}],["arm64",{"_index":2313,"t":{"394":{"position":[[56,5]]}}}],["array",{"_index":108,"t":{"4":{"position":[[2392,5]]},"24":{"position":[[505,5]]},"102":{"position":[[1212,5]]},"228":{"position":[[1137,5]]},"230":{"position":[[210,5],[351,5]]},"284":{"position":[[21,5]]}}}],["artist",{"_index":1173,"t":{"152":{"position":[[478,7],[493,6],[565,7],[580,6]]},"180":{"position":[[172,7],[568,8]]},"192":{"position":[[1117,7],[1423,6],[1693,6],[1747,6]]},"212":{"position":[[137,8],[446,6],[531,6],[607,6]]},"220":{"position":[[296,7],[318,6]]},"222":{"position":[[728,11],[1261,11],[1361,7],[2213,11],[2478,11]]},"224":{"position":[[133,7],[262,10],[331,7],[440,7]]},"228":{"position":[[496,9],[543,6],[674,9],[721,6],[941,8],[984,8],[1032,7],[1210,6],[1325,9],[1450,6],[1519,9],[1595,10],[1620,9]]},"230":{"position":[[833,7],[859,8],[1056,7]]},"234":{"position":[[687,7],[1064,8],[1080,6],[1247,6],[1324,8],[1345,6]]},"236":{"position":[[84,7],[461,8]]},"238":{"position":[[151,6],[228,8],[249,6]]},"245":{"position":[[232,10],[301,7]]},"247":{"position":[[684,6]]},"251":{"position":[[101,8],[402,7],[600,7],[649,11],[1584,6],[1673,6],[1710,7],[1785,10],[1887,7],[1912,6],[1967,10],[2713,6],[2819,6],[2938,7],[2956,6],[3241,7],[3293,6],[3318,6],[3555,10],[3685,6],[3796,6],[3887,10],[4130,6],[4206,6],[4278,7],[4295,6],[4422,10],[4642,10],[4800,6],[5132,8],[5676,6]]},"261":{"position":[[258,6],[640,6],[720,7]]},"265":{"position":[[549,10]]},"274":{"position":[[703,10]]},"276":{"position":[[73,6]]},"278":{"position":[[292,7],[305,6],[361,6]]},"280":{"position":[[303,10],[325,8]]},"284":{"position":[[429,7]]},"287":{"position":[[87,6],[312,9]]},"293":{"position":[[10,10]]},"295":{"position":[[42,9]]},"297":{"position":[[17,6],[51,7],[145,6],[165,6],[181,6],[209,6],[220,7],[452,6],[466,6],[552,6],[568,6],[617,6],[632,6],[666,10]]},"301":{"position":[[60,7],[188,7],[259,7],[270,6],[315,7],[371,7],[442,6],[496,7],[561,7],[783,10],[901,10]]},"303":{"position":[[133,7],[278,8],[437,6],[580,8],[596,7],[667,11],[695,7],[745,7],[758,6],[815,7],[890,7],[941,7],[1120,7],[1173,6],[1281,7],[1369,7],[1508,7],[1536,11],[1606,11]]},"305":{"position":[[213,10],[282,7]]},"312":{"position":[[284,11]]},"316":{"position":[[42,7]]},"331":{"position":[[191,8]]},"346":{"position":[[772,8]]},"382":{"position":[[50,6],[141,8],[263,6],[281,6]]},"386":{"position":[[179,6],[328,6]]},"390":{"position":[[3008,7]]},"416":{"position":[[1504,7]]}}}],["artist(",{"_index":1735,"t":{"251":{"position":[[936,10],[1232,10],[2401,10]]}}}],["artist/album/track",{"_index":1029,"t":{"102":{"position":[[329,18]]}}}],["artist/title/album",{"_index":1557,"t":{"220":{"position":[[219,18],[432,18]]},"251":{"position":[[4978,19]]}}}],["artist/track",{"_index":1863,"t":{"301":{"position":[[78,12]]}}}],["artistnam",{"_index":2070,"t":{"346":{"position":[[703,11],[781,13]]}}}],["artists/album/titl",{"_index":1824,"t":{"274":{"position":[[53,21]]}}}],["artists/title/album",{"_index":1822,"t":{"265":{"position":[[146,19]]}}}],["artistsignor",{"_index":1872,"t":{"303":{"position":[[360,13]]},"314":{"position":[[129,16]]}}}],["artistsparsefrom",{"_index":1566,"t":{"222":{"position":[[708,19],[1241,19],[1391,19],[2193,19],[2458,19]]},"303":{"position":[[500,16],[916,16],[1424,16],[1516,19],[1586,19],[1640,19],[1679,19]]},"312":{"position":[[264,19]]}}}],["artistsparsemonolithiconli",{"_index":1875,"t":{"303":{"position":[[1001,26]]}}}],["ask",{"_index":1487,"t":{"208":{"position":[[4471,4]]}}}],["aspect",{"_index":1911,"t":{"325":{"position":[[41,7]]},"335":{"position":[[116,7]]}}}],["associ",{"_index":1331,"t":{"190":{"position":[[434,10]]},"256":{"position":[[29,10],[1587,10]]},"274":{"position":[[106,11]]}}}],["assum",{"_index":1080,"t":{"118":{"position":[[502,7]]},"128":{"position":[[117,7]]},"142":{"position":[[122,7]]},"146":{"position":[[116,7]]},"168":{"position":[[1071,9]]},"174":{"position":[[306,7]]},"190":{"position":[[1566,7]]},"224":{"position":[[987,7]]},"241":{"position":[[674,7]]},"346":{"position":[[834,8],[864,8]]},"353":{"position":[[862,8]]},"372":{"position":[[1674,6]]},"416":{"position":[[693,8],[2150,8]]},"457":{"position":[[0,8]]}}}],["assumpt",{"_index":1590,"t":{"226":{"position":[[830,11]]}}}],["async",{"_index":1933,"t":{"329":{"position":[[880,5]]},"344":{"position":[[446,5],[1137,5]]},"348":{"position":[[741,5],[1695,5],[2342,5]]},"350":{"position":[[1762,5]]},"353":{"position":[[675,5]]}}}],["asynchron",{"_index":620,"t":{"51":{"position":[[1576,14]]},"329":{"position":[[335,12]]}}}],["athent",{"_index":1501,"t":{"210":{"position":[[165,13],[224,13],[290,13]]}}}],["atproto",{"_index":639,"t":{"56":{"position":[[57,7],[530,7]]},"58":{"position":[[54,7],[188,7]]},"63":{"position":[[4,7],[131,7],[671,7]]},"184":{"position":[[29,7],[160,7]]}}}],["atproto.at",{"_index":665,"t":{"58":{"position":[[1579,10]]},"190":{"position":[[612,10]]}}}],["attempt",{"_index":709,"t":{"67":{"position":[[419,7],[794,7]]},"192":{"position":[[1098,7]]},"251":{"position":[[2910,7]]},"303":{"position":[[1101,7]]},"329":{"position":[[2835,7],[3302,7]]}}}],["attribut",{"_index":1774,"t":{"256":{"position":[[18,10],[164,10],[564,11],[582,10],[1170,10]]},"258":{"position":[[13,9],[267,9]]}}}],["attribute_nam",{"_index":1783,"t":{"256":{"position":[[593,15]]}}}],["attribute_name]allow",{"_index":1799,"t":{"256":{"position":[[1316,21]]}}}],["attribute_name]deni",{"_index":1800,"t":{"256":{"position":[[1346,20]]}}}],["attribute_name]prior",{"_index":1811,"t":{"258":{"position":[[784,24]]}}}],["audio",{"_index":1034,"t":{"102":{"position":[[1045,6]]},"130":{"position":[[1053,6]]}}}],["audiobook",{"_index":1105,"t":{"130":{"position":[[980,11]]}}}],["auser",{"_index":1062,"t":{"110":{"position":[[408,8],[643,8]]}}}],["auserw",{"_index":1394,"t":{"198":{"position":[[191,10],[357,7]]}}}],["auth",{"_index":302,"t":{"14":{"position":[[269,4],[1753,7]]},"176":{"position":[[4346,4]]},"208":{"position":[[4329,4],[5360,4]]},"319":{"position":[[179,4]]},"329":{"position":[[1946,5],[1969,4],[2192,4],[2314,4],[2602,4],[2626,4],[3095,4],[3334,4]]},"340":{"position":[[397,4],[629,4]]},"342":{"position":[[112,4],[877,4]]},"348":{"position":[[2057,5],[2090,4]]}}}],["authent",{"_index":257,"t":{"12":{"position":[[67,14]]},"14":{"position":[[1076,14]]},"24":{"position":[[574,14],[629,13]]},"41":{"position":[[261,15],[373,14]]},"106":{"position":[[230,14]]},"110":{"position":[[179,14],[245,13]]},"130":{"position":[[459,12],[595,13],[1367,12],[1435,14],[1540,12]]},"136":{"position":[[42,15]]},"138":{"position":[[233,15]]},"168":{"position":[[202,13],[602,13],[776,13],[978,13],[1090,13],[1268,13]]},"176":{"position":[[459,12],[1306,14],[2191,15],[2440,15],[2904,12],[3344,15]]},"196":{"position":[[727,14]]},"208":{"position":[[489,15],[750,14],[1225,14],[4650,12],[4777,14],[4881,14],[4926,12],[5002,14],[5145,14],[5225,14]]},"210":{"position":[[113,14]]},"329":{"position":[[2383,14],[2538,14],[2671,14],[2849,13],[2954,14]]},"337":{"position":[[311,13]]},"342":{"position":[[791,14]]},"374":{"position":[[269,14]]},"376":{"position":[[176,15],[234,15],[267,14],[440,15],[469,14],[563,15],[841,13],[1135,12]]},"416":{"position":[[652,14]]},"426":{"position":[[485,14]]},"434":{"position":[[322,12]]},"436":{"position":[[243,12]]}}}],["author",{"_index":893,"t":{"92":{"position":[[121,10]]},"176":{"position":[[957,14]]},"208":{"position":[[2015,10],[2101,10],[2257,13],[2296,10],[3199,10],[3739,10],[4121,10]]},"329":{"position":[[3205,13]]},"337":{"position":[[385,13]]},"416":{"position":[[1205,9],[1294,13],[4102,9],[4191,13]]},"430":{"position":[[1091,13]]},"444":{"position":[[242,9]]}}}],["auto",{"_index":2447,"t":{"430":{"position":[[1036,4]]}}}],["autom",{"_index":1509,"t":{"212":{"position":[[75,9]]},"364":{"position":[[43,9]]}}}],["automat",{"_index":307,"t":{"14":{"position":[[499,14],[1256,14]]},"31":{"position":[[193,13]]},"51":{"position":[[634,13]]},"56":{"position":[[363,13]]},"58":{"position":[[716,13]]},"63":{"position":[[501,13]]},"67":{"position":[[92,9]]},"84":{"position":[[205,14],[748,13],[796,13]]},"86":{"position":[[432,13],[1413,13],[1461,13],[1757,13],[1845,9]]},"98":{"position":[[812,13]]},"102":{"position":[[538,13],[608,9],[733,9],[1151,9],[1586,13]]},"168":{"position":[[142,13]]},"204":{"position":[[353,13]]},"208":{"position":[[4609,14]]},"251":{"position":[[1194,13],[2993,10]]},"280":{"position":[[453,13]]},"307":{"position":[[96,13]]},"355":{"position":[[2122,13]]},"398":{"position":[[70,13]]},"408":{"position":[[254,13]]},"416":{"position":[[1274,13],[4171,13]]},"428":{"position":[[418,13]]}}}],["automix",{"_index":1251,"t":{"176":{"position":[[12,7],[47,7]]}}}],["avahi",{"_index":962,"t":{"98":{"position":[[1038,5],[1167,5],[1205,5],[1250,5]]}}}],["avail",{"_index":190,"t":{"6":{"position":[[146,9],[204,9]]},"24":{"position":[[60,9]]},"84":{"position":[[31,9]]},"100":{"position":[[71,9]]},"160":{"position":[[1576,9]]},"208":{"position":[[5061,9],[5287,9]]},"303":{"position":[[0,9]]},"394":{"position":[[80,9]]},"428":{"position":[[231,9]]}}}],["avoid",{"_index":328,"t":{"14":{"position":[[1934,5]]},"241":{"position":[[3,5]]},"394":{"position":[[3287,5]]}}}],["await",{"_index":2055,"t":{"344":{"position":[[1332,5]]},"348":{"position":[[1778,5],[2375,5]]},"350":{"position":[[1945,5]]},"353":{"position":[[761,5]]}}}],["awar",{"_index":363,"t":{"16":{"position":[[231,5]]},"176":{"position":[[3538,6]]}}}],["az_stat",{"_index":874,"t":{"88":{"position":[[112,10]]}}}],["az_url",{"_index":871,"t":{"88":{"position":[[66,6]]}}}],["azura",{"_index":880,"t":{"88":{"position":[[425,8],[709,8]]}}}],["azura_l",{"_index":863,"t":{"86":{"position":[[1624,11]]},"88":{"position":[[169,10]]}}}],["azura_listeners_num",{"_index":866,"t":{"86":{"position":[[1674,20]]},"88":{"position":[[231,19]]}}}],["azuracast",{"_index":773,"t":{"73":{"position":[[95,9]]},"86":{"position":[[21,9],[222,9],[375,9]]},"88":{"position":[[77,9],[388,12],[672,12]]},"430":{"position":[[135,9]]}}}],["azuracast.json",{"_index":845,"t":{"84":{"position":[[664,14]]},"86":{"position":[[1329,14]]}}}],["b",{"_index":2183,"t":{"364":{"position":[[266,1],[360,1]]}}}],["b2c4",{"_index":1628,"t":{"230":{"position":[[1083,4]]}}}],["back",{"_index":1281,"t":{"176":{"position":[[2697,4]]},"208":{"position":[[4402,4]]},"390":{"position":[[3026,4]]}}}],["backend",{"_index":1148,"t":{"148":{"position":[[204,7]]},"319":{"position":[[68,7],[94,7],[328,7]]}}}],["background",{"_index":2359,"t":{"398":{"position":[[91,11]]}}}],["backlog",{"_index":2139,"t":{"353":{"position":[[266,11],[582,10]]}}}],["backslash",{"_index":1861,"t":{"297":{"position":[[511,9]]}}}],["bad",{"_index":1168,"t":{"152":{"position":[[178,3],[301,3]]},"251":{"position":[[1636,3]]},"278":{"position":[[172,3]]}}}],["bad/incomplet",{"_index":1005,"t":{"98":{"position":[[3218,14]]}}}],["bad\\w+/i",{"_index":1833,"t":{"282":{"position":[[246,11]]}}}],["badmus",{"_index":1124,"t":{"130":{"position":[[2529,13],[3148,10]]},"168":{"position":[[2589,10],[3137,10]]}}}],["badsometh",{"_index":1834,"t":{"282":{"position":[[267,12]]}}}],["badterm",{"_index":1831,"t":{"280":{"position":[[807,7],[832,9]]},"282":{"position":[[107,9],[126,7]]},"284":{"position":[[231,9],[252,10]]}}}],["balanc",{"_index":1689,"t":{"241":{"position":[[552,7]]}}}],["band",{"_index":1675,"t":{"234":{"position":[[1409,4]]},"238":{"position":[[313,4]]},"251":{"position":[[3614,6],[3675,4],[3949,6]]},"301":{"position":[[336,4]]}}}],["bandcamp",{"_index":1146,"t":{"148":{"position":[[123,9]]}}}],["bar",{"_index":905,"t":{"92":{"position":[[496,3]]},"301":{"position":[[323,3]]},"303":{"position":[[1455,4],[1574,5],[1635,4]]}}}],["barterm",{"_index":1844,"t":{"284":{"position":[[318,9],[360,9]]}}}],["base",{"_index":32,"t":{"4":{"position":[[456,5],[1418,5],[3101,5]]},"18":{"position":[[202,5]]},"33":{"position":[[799,5]]},"35":{"position":[[714,4],[856,4],[904,4],[968,4],[1008,4]]},"37":{"position":[[182,4]]},"39":{"position":[[424,4]]},"45":{"position":[[200,4]]},"49":{"position":[[97,4]]},"82":{"position":[[101,5],[265,5]]},"86":{"position":[[588,5],[1560,5],[1780,5]]},"96":{"position":[[188,5]]},"98":{"position":[[789,5],[2118,5],[2715,5]]},"100":{"position":[[94,5]]},"102":{"position":[[426,5],[870,5],[1085,5],[1169,5]]},"134":{"position":[[283,4]]},"182":{"position":[[139,4]]},"190":{"position":[[129,4]]},"192":{"position":[[1559,5]]},"196":{"position":[[427,5]]},"198":{"position":[[139,5]]},"204":{"position":[[515,4]]},"208":{"position":[[1730,5],[3316,4]]},"226":{"position":[[109,5]]},"241":{"position":[[593,4]]},"258":{"position":[[85,5]]},"329":{"position":[[36,4],[1165,4],[2002,5]]},"335":{"position":[[161,5]]},"337":{"position":[[54,5]]},"342":{"position":[[398,4],[538,4]]},"344":{"position":[[73,5]]},"350":{"position":[[1207,5]]},"372":{"position":[[26,5]]},"390":{"position":[[625,5],[2557,6]]},"394":{"position":[[2435,4],[2665,4]]},"396":{"position":[[215,4]]}}}],["base_url",{"_index":261,"t":{"12":{"position":[[184,8],[598,8],[832,8]]},"412":{"position":[[582,8]]}}}],["base_url:port/lastfm/callback",{"_index":271,"t":{"12":{"position":[[502,29]]}}}],["base_url=\"http://hostmachineip",{"_index":2340,"t":{"394":{"position":[[2819,31]]}}}],["base_url=192.168.0.100",{"_index":2353,"t":{"396":{"position":[[516,24],[760,24]]}}}],["base_url=http://192.168.0.100:9078",{"_index":2357,"t":{"396":{"position":[[1275,34]]},"414":{"position":[[365,34]]}}}],["base_url=http://192.168.0.101:9078",{"_index":2331,"t":{"394":{"position":[[1123,34]]}}}],["base_url=http://hostmachineip",{"_index":2341,"t":{"394":{"position":[[2957,29]]}}}],["base_url=http://myhostip:9078",{"_index":2332,"t":{"394":{"position":[[1161,29]]}}}],["baseurl",{"_index":262,"t":{"12":{"position":[[196,7]]},"340":{"position":[[852,8]]},"344":{"position":[[743,8]]},"348":{"position":[[162,7],[245,7],[418,9],[818,7],[991,8],[1012,7],[1045,7],[1257,8],[1266,12],[1327,10]]}}}],["baseurl.trim",{"_index":2090,"t":{"348":{"position":[[1069,14]]}}}],["bash",{"_index":2177,"t":{"364":{"position":[[14,4]]}}}],["basic",{"_index":91,"t":{"4":{"position":[[1822,5]]},"98":{"position":[[423,5]]},"176":{"position":[[4103,5]]},"329":{"position":[[3089,5]]},"355":{"position":[[1916,5]]},"430":{"position":[[935,5]]}}}],["baz",{"_index":1866,"t":{"301":{"position":[[332,3]]}}}],["be",{"_index":816,"t":{"78":{"position":[[85,5]]},"96":{"position":[[629,5]]},"126":{"position":[[407,5]]},"190":{"position":[[555,5]]},"192":{"position":[[1014,5]]},"208":{"position":[[259,5],[5055,5]]},"218":{"position":[[119,5],[357,5],[1436,5],[1532,5]]},"355":{"position":[[209,5],[2176,5]]},"376":{"position":[[1002,5]]},"430":{"position":[[1597,5]]}}}],["be9f354075cb",{"_index":1634,"t":{"230":{"position":[[1143,12]]}}}],["bearer",{"_index":1957,"t":{"329":{"position":[[3072,6]]}}}],["befor",{"_index":62,"t":{"4":{"position":[[1043,6]]},"31":{"position":[[158,6]]},"67":{"position":[[269,6],[463,6],[644,6],[838,6]]},"192":{"position":[[2222,6]]},"208":{"position":[[3046,7]]},"212":{"position":[[282,6],[823,6]]},"216":{"position":[[61,6]]},"218":{"position":[[203,6],[438,6]]},"251":{"position":[[0,6],[1124,6],[3455,6]]},"267":{"position":[[260,6]]},"325":{"position":[[461,6]]},"331":{"position":[[659,6]]},"335":{"position":[[191,6]]},"350":{"position":[[2908,6]]},"355":{"position":[[2930,6]]},"372":{"position":[[1386,6]]},"388":{"position":[[0,6]]},"390":{"position":[[3288,6]]},"418":{"position":[[142,6]]},"446":{"position":[[63,6]]},"453":{"position":[[424,6]]}}}],["begin",{"_index":1474,"t":{"208":{"position":[[3016,9],[5468,5]]},"214":{"position":[[83,9]]},"251":{"position":[[10,6]]},"256":{"position":[[1851,5]]},"416":{"position":[[1268,5],[4165,5]]}}}],["behavior",{"_index":254,"t":{"10":{"position":[[39,8]]},"33":{"position":[[214,8],[432,8],[948,8]]},"84":{"position":[[543,8]]},"86":{"position":[[979,9],[1208,8],[1551,8],[1953,9]]},"98":{"position":[[3272,8]]},"102":{"position":[[506,8],[688,8]]},"200":{"position":[[210,8],[261,8]]},"222":{"position":[[1084,9]]},"226":{"position":[[610,9]]},"303":{"position":[[1411,8]]},"327":{"position":[[483,9]]},"342":{"position":[[117,9]]},"350":{"position":[[259,8]]},"390":{"position":[[2182,9],[3078,8]]},"453":{"position":[[268,8]]}}}],["behind",{"_index":1136,"t":{"134":{"position":[[877,6]]},"176":{"position":[[1555,6],[1831,6]]},"204":{"position":[[442,6]]}}}],["bell",{"_index":1975,"t":{"337":{"position":[[136,5]]}}}],["belong",{"_index":1776,"t":{"256":{"position":[[93,7],[448,7]]}}}],["below",{"_index":106,"t":{"4":{"position":[[2360,5]]},"14":{"position":[[161,5],[811,5],[1568,5],[2192,5],[3254,5],[3423,6]]},"33":{"position":[[458,7]]},"35":{"position":[[450,5],[948,5]]},"47":{"position":[[586,6]]},"92":{"position":[[248,5]]},"98":{"position":[[3420,5]]},"106":{"position":[[334,6]]},"112":{"position":[[302,6]]},"126":{"position":[[475,6]]},"130":{"position":[[341,5],[2325,5]]},"168":{"position":[[485,5]]},"176":{"position":[[4228,5]]},"247":{"position":[[453,6]]},"261":{"position":[[791,5]]},"297":{"position":[[287,6]]},"329":{"position":[[281,5],[445,6]]},"366":{"position":[[38,5],[639,5]]},"406":{"position":[[185,5]]},"412":{"position":[[597,6]]},"414":{"position":[[433,5]]},"416":{"position":[[3297,6],[3629,5]]},"418":{"position":[[180,6],[1610,6]]},"422":{"position":[[827,6]]},"424":{"position":[[1621,5],[1843,5]]}}}],["benefit",{"_index":1646,"t":{"234":{"position":[[495,7]]},"265":{"position":[[205,7]]},"274":{"position":[[93,7]]},"430":{"position":[[2335,7]]}}}],["best",{"_index":1028,"t":{"102":{"position":[[315,4]]},"249":{"position":[[122,4]]},"258":{"position":[[577,4]]},"376":{"position":[[713,4]]}}}],["better",{"_index":23,"t":{"4":{"position":[[259,6]]},"263":{"position":[[422,6]]}}}],["between",{"_index":458,"t":{"31":{"position":[[304,7]]},"212":{"position":[[655,7]]},"230":{"position":[[506,7]]},"267":{"position":[[452,7]]},"297":{"position":[[432,7]]},"325":{"position":[[88,7]]},"384":{"position":[[230,7]]},"390":{"position":[[677,7],[934,7]]},"392":{"position":[[23,7]]}}}],["bidirection",{"_index":1210,"t":{"160":{"position":[[1451,15]]}}}],["bind",{"_index":2335,"t":{"394":{"position":[[1626,4]]}}}],["bind_to_address",{"_index":1178,"t":{"156":{"position":[[129,15]]}}}],["blacklist",{"_index":952,"t":{"98":{"position":[[626,9]]},"150":{"position":[[286,9]]},"162":{"position":[[334,9],[458,12],[686,12]]},"202":{"position":[[460,12],[681,12]]}}}],["blacklistedapp",{"_index":1022,"t":{"100":{"position":[[748,18],[991,18]]}}}],["blacklisteddevic",{"_index":1020,"t":{"100":{"position":[[696,21],[939,21]]}}}],["blank",{"_index":1462,"t":{"208":{"position":[[2290,5],[2396,5]]}}}],["block",{"_index":1563,"t":{"222":{"position":[[98,6]]}}}],["blueski",{"_index":580,"t":{"51":{"position":[[160,10],[666,7],[1089,7]]},"53":{"position":[[16,7],[160,7]]},"56":{"position":[[100,7],[157,7],[256,7],[550,7]]},"58":{"position":[[748,7],[1163,7]]},"60":{"position":[[0,8],[18,7]]},"63":{"position":[[192,7],[249,7],[347,7],[698,7]]},"170":{"position":[[135,10]]},"172":{"position":[[81,7]]},"186":{"position":[[81,7]]}}}],["bluesky/atproto",{"_index":677,"t":{"63":{"position":[[764,15]]}}}],["bodi",{"_index":2107,"t":{"348":{"position":[[2573,4]]},"350":{"position":[[2056,5]]},"353":{"position":[[881,4],[973,4]]}}}],["body.map(x",{"_index":2143,"t":{"353":{"position":[[1000,10]]}}}],["book",{"_index":1104,"t":{"130":{"position":[[971,4]]}}}],["boolean",{"_index":231,"t":{"8":{"position":[[1332,9]]},"245":{"position":[[29,8]]},"303":{"position":[[1030,7]]},"305":{"position":[[29,8]]}}}],["bootleg",{"_index":1778,"t":{"256":{"position":[[387,7],[706,8]]}}}],["both",{"_index":1223,"t":{"164":{"position":[[130,4]]},"216":{"position":[[146,4]]},"249":{"position":[[362,4]]},"251":{"position":[[4780,4]]},"303":{"position":[[613,5],[631,4]]},"325":{"position":[[96,5],[397,4]]},"331":{"position":[[490,4]]},"366":{"position":[[215,4]]}}}],["bottom",{"_index":486,"t":{"35":{"position":[[229,7]]},"192":{"position":[[129,6],[449,6]]},"424":{"position":[[1400,7]]}}}],["bowl",{"_index":1746,"t":{"251":{"position":[[1796,9],[1978,9],[3566,9],[3632,7],[3898,9],[4433,9],[4529,8],[4653,9]]},"301":{"position":[[794,9],[912,9]]}}}],["box",{"_index":1353,"t":{"192":{"position":[[427,3]]}}}],["boz",{"_index":1850,"t":{"293":{"position":[[35,4],[60,4]]}}}],["brainz",{"_index":1619,"t":{"230":{"position":[[994,6],[1049,6],[1105,6],[1160,6]]}}}],["brainzclient",{"_index":554,"t":{"45":{"position":[[281,15],[592,15]]}}}],["brainzsourc",{"_index":1144,"t":{"142":{"position":[[319,15],[630,15]]}}}],["branch",{"_index":2175,"t":{"361":{"position":[[8,6]]}}}],["brand",{"_index":1459,"t":{"208":{"position":[[1996,8]]}}}],["break",{"_index":887,"t":{"90":{"position":[[167,8]]},"344":{"position":[[704,6],[1009,6],[1025,6],[1294,6],[1433,6],[1449,6]]},"453":{"position":[[248,8]]}}}],["bridg",{"_index":2333,"t":{"394":{"position":[[1275,6],[2030,6],[2562,6]]}}}],["broadcast",{"_index":1031,"t":{"102":{"position":[[451,11]]},"214":{"position":[[427,10]]}}}],["broken",{"_index":791,"t":{"76":{"position":[[50,6]]}}}],["brows",{"_index":1437,"t":{"208":{"position":[[949,9]]},"376":{"position":[[121,7]]},"390":{"position":[[2971,7]]}}}],["browser",{"_index":891,"t":{"92":{"position":[[13,7]]},"94":{"position":[[122,7]]},"176":{"position":[[927,7],[2003,7],[2381,7],[2593,7]]},"192":{"position":[[579,7]]},"196":{"position":[[433,8],[487,8]]},"208":{"position":[[207,8],[804,8],[3117,7]]},"374":{"position":[[242,7],[349,7]]},"376":{"position":[[665,7],[692,8],[1109,7]]},"394":{"position":[[2762,8]]},"430":{"position":[[1268,7]]}}}],["bsky.soci",{"_index":648,"t":{"56":{"position":[[384,12]]},"63":{"position":[[522,12]]}}}],["bu",{"_index":974,"t":{"98":{"position":[[1238,3]]}}}],["build",{"_index":1830,"t":{"280":{"position":[[467,6]]},"307":{"position":[[110,6]]},"329":{"position":[[779,5]]},"340":{"position":[[377,5]]},"344":{"position":[[67,5],[123,5]]},"346":{"position":[[528,5]]},"348":{"position":[[76,5],[111,5]]},"364":{"position":[[84,8]]},"366":{"position":[[77,5],[617,5]]},"400":{"position":[[245,5],[272,5],[292,8],[438,6]]},"402":{"position":[[76,5]]}}}],["build/artifact",{"_index":2188,"t":{"364":{"position":[[432,16]]},"366":{"position":[[744,16]]}}}],["builder",{"_index":2171,"t":{"359":{"position":[[32,7]]},"366":{"position":[[789,7]]}}}],["buildsourcesfromconfig",{"_index":2038,"t":{"344":{"position":[[421,22]]}}}],["built",{"_index":579,"t":{"51":{"position":[[135,5]]},"98":{"position":[[1190,5]]},"170":{"position":[[110,5]]},"208":{"position":[[4758,5]]},"220":{"position":[[265,5]]},"301":{"position":[[22,5]]},"325":{"position":[[375,5]]},"329":{"position":[[121,5],[2470,5]]},"344":{"position":[[549,5]]},"368":{"position":[[3,5]]},"394":{"position":[[26,5]]},"430":{"position":[[618,5]]}}}],["bukem",{"_index":1615,"t":{"230":{"position":[[847,5]]}}}],["buserw",{"_index":1397,"t":{"198":{"position":[[275,10],[439,7]]}}}],["busi",{"_index":1664,"t":{"234":{"position":[[968,8],[1431,8]]},"236":{"position":[[365,8]]},"238":{"position":[[335,8]]},"390":{"position":[[2243,4]]}}}],["button",{"_index":940,"t":{"98":{"position":[[47,6]]},"130":{"position":[[227,6]]}}}],["bvki",{"_index":1494,"t":{"208":{"position":[[5129,5]]}}}],["c9fae8756fbf481ebd9c5bb56bd6540c",{"_index":743,"t":{"67":{"position":[[2582,35]]},"69":{"position":[[1137,35]]},"130":{"position":[[2275,35],[2913,35]]}}}],["cach",{"_index":286,"t":{"14":{"position":[[16,6],[178,6],[331,6],[735,5],[784,6],[930,5],[993,8],[1118,6],[1492,5],[1541,6],[1683,5],[1742,8],[1924,6],[2028,6],[2062,6],[2125,6],[2165,6],[2306,5],[2361,8],[2473,7],[2508,5],[2613,5],[2807,5],[2906,5],[2939,8],[3657,5],[3787,8]]},"234":{"position":[[1637,7],[1648,5]]}}}],["cache_auth",{"_index":323,"t":{"14":{"position":[[1660,10]]}}}],["cache_auth_conn",{"_index":324,"t":{"14":{"position":[[1701,15]]}}}],["cache_metadata",{"_index":332,"t":{"14":{"position":[[2284,14],[3627,14]]}}}],["cache_metadata_conn",{"_index":333,"t":{"14":{"position":[[2324,19],[3675,19]]}}}],["cache_scrobbl",{"_index":316,"t":{"14":{"position":[[903,14],[2780,14]]}}}],["cache_scrobble_conn",{"_index":317,"t":{"14":{"position":[[948,19],[2825,19]]}}}],["cachename].cach",{"_index":337,"t":{"14":{"position":[[2692,18]]}}}],["call",{"_index":294,"t":{"14":{"position":[[102,6],[293,5],[1825,5],[1895,5],[1950,5],[2013,5],[2069,5]]},"65":{"position":[[686,6]]},"234":{"position":[[1670,5]]},"241":{"position":[[564,6]]},"337":{"position":[[73,6]]},"342":{"position":[[29,6]]}}}],["callback",{"_index":528,"t":{"39":{"position":[[247,8]]},"176":{"position":[[2414,8]]},"178":{"position":[[201,8]]},"319":{"position":[[184,9]]},"327":{"position":[[307,8]]},"329":{"position":[[2344,8]]},"374":{"position":[[580,8]]},"416":{"position":[[3366,8]]},"424":{"position":[[957,8]]},"444":{"position":[[291,8]]}}}],["callback/redirect",{"_index":2241,"t":{"374":{"position":[[71,17]]}}}],["can...spotti",{"_index":718,"t":{"67":{"position":[[1161,12]]}}}],["cancel",{"_index":1779,"t":{"256":{"position":[[398,9]]}}}],["candid",{"_index":1554,"t":{"218":{"position":[[1385,12]]},"251":{"position":[[892,11]]},"291":{"position":[[23,12]]}}}],["capabl",{"_index":2140,"t":{"353":{"position":[[278,13]]}}}],["captur",{"_index":627,"t":{"51":{"position":[[1811,8]]},"192":{"position":[[1344,7]]},"297":{"position":[[328,7]]},"430":{"position":[[2346,9]]}}}],["card",{"_index":842,"t":{"84":{"position":[[492,5]]},"86":{"position":[[1176,5]]},"176":{"position":[[4328,4]]},"208":{"position":[[4309,4],[5400,4]]},"416":{"position":[[1197,4],[4094,4]]}}}],["care",{"_index":2116,"t":{"350":{"position":[[1170,4]]},"355":{"position":[[2742,4]]}}}],["case",{"_index":226,"t":{"8":{"position":[[1226,4]]},"86":{"position":[[97,4]]},"134":{"position":[[839,4]]},"150":{"position":[[324,4]]},"152":{"position":[[327,4]]},"192":{"position":[[2215,6]]},"204":{"position":[[163,4]]},"247":{"position":[[390,4]]},"297":{"position":[[374,5]]},"344":{"position":[[590,4],[679,4],[711,4],[1269,4],[1301,4]]}}}],["cast",{"_index":777,"t":{"73":{"position":[[166,4]]},"98":{"position":[[28,4],[162,4],[456,4],[654,5],[697,4],[738,4],[1584,4],[1773,4],[3062,4]]},"100":{"position":[[39,4],[198,4],[300,4],[411,4],[492,6],[595,6]]},"384":{"position":[[11,4],[92,7],[132,4],[463,4],[576,4]]},"386":{"position":[[36,4]]},"430":{"position":[[159,4]]}}}],["catalog",{"_index":624,"t":{"51":{"position":[[1657,9]]}}}],["catch",{"_index":1961,"t":{"329":{"position":[[3286,5]]},"348":{"position":[[1212,5],[2025,5],[2488,5]]},"350":{"position":[[2546,5]]},"353":{"position":[[1052,5]]}}}],["categori",{"_index":794,"t":{"76":{"position":[[71,11]]}}}],["caus",{"_index":923,"t":{"96":{"position":[[49,5]]},"208":{"position":[[332,5]]},"212":{"position":[[691,6]]},"348":{"position":[[1279,7]]},"353":{"position":[[1128,7]]},"390":{"position":[[1676,5],[2476,5]]}}}],["caveat",{"_index":223,"t":{"8":{"position":[[1176,7]]}}}],["cc_blacklist_app",{"_index":1018,"t":{"100":{"position":[[547,17]]}}}],["cc_blacklist_devic",{"_index":1015,"t":{"100":{"position":[[360,20]]}}}],["cc_enabl",{"_index":1007,"t":{"100":{"position":[[161,9]]}}}],["cc_whitelist_app",{"_index":1016,"t":{"100":{"position":[[446,17]]}}}],["cc_whitelist_devic",{"_index":1008,"t":{"100":{"position":[[251,20]]}}}],["cd",{"_index":1905,"t":{"321":{"position":[[313,2]]},"400":{"position":[[134,2]]}}}],["certain",{"_index":812,"t":{"76":{"position":[[994,7]]},"152":{"position":[[4,7]]}}}],["certificates/http",{"_index":1268,"t":{"176":{"position":[[1439,18]]}}}],["cf5b",{"_index":1998,"t":{"340":{"position":[[709,4]]}}}],["chanc",{"_index":1434,"t":{"208":{"position":[[903,6]]},"376":{"position":[[979,6]]}}}],["chang",{"_index":885,"t":{"90":{"position":[[123,6]]},"176":{"position":[[2492,8]]},"192":{"position":[[141,6],[472,7]]},"208":{"position":[[174,6],[4108,8]]},"210":{"position":[[342,7]]},"224":{"position":[[240,7],[315,7],[418,7],[484,7],[545,7],[623,7]]},"245":{"position":[[210,7],[285,7],[380,7]]},"265":{"position":[[135,6]]},"305":{"position":[[191,7],[266,7],[361,7]]},"350":{"position":[[1230,7],[2631,7],[2655,7]]},"390":{"position":[[646,7],[927,6],[1428,6],[1704,7],[1747,7],[2789,7]]},"416":{"position":[[1993,7],[2335,7]]},"453":{"position":[[257,7],[301,8]]}}}],["changem",{"_index":1381,"t":{"194":{"position":[[242,10],[459,10]]}}}],["charact",{"_index":1842,"t":{"282":{"position":[[983,11]]},"303":{"position":[[81,10],[226,10]]}}}],["check",{"_index":1,"t":{"2":{"position":[[4,5]]},"67":{"position":[[1612,5]]},"80":{"position":[[499,5]]},"84":{"position":[[64,5]]},"106":{"position":[[169,5],[245,7]]},"112":{"position":[[161,5]]},"150":{"position":[[183,5]]},"190":{"position":[[593,5],[714,5]]},"224":{"position":[[744,5]]},"251":{"position":[[29,6],[53,6]]},"329":{"position":[[1407,5],[1912,5]]},"348":{"position":[[137,5],[1398,5],[1445,5]]},"350":{"position":[[794,7],[2857,6]]},"355":{"position":[[2341,7],[3986,5]]},"372":{"position":[[1357,5],[1547,5],[1596,5],[2146,5],[2398,5]]},"390":{"position":[[697,7],[792,7],[946,6]]},"428":{"position":[[336,5]]},"446":{"position":[[49,5]]},"453":{"position":[[408,5]]}}}],["check/test",{"_index":1952,"t":{"329":{"position":[[2181,10]]}}}],["child",{"_index":1936,"t":{"329":{"position":[[1036,5],[1771,5],[3018,5]]}}}],["choic",{"_index":1808,"t":{"258":{"position":[[582,6],[668,7],[758,7]]}}}],["choos",{"_index":572,"t":{"47":{"position":[[571,6]]},"102":{"position":[[463,7]]},"208":{"position":[[2163,6]]},"247":{"position":[[418,6]]}}}],["chrome",{"_index":895,"t":{"92":{"position":[[288,6]]}}}],["chromecast",{"_index":778,"t":{"73":{"position":[[171,12]]},"98":{"position":[[2319,13],[2851,13],[3510,13]]},"100":{"position":[[1047,12]]},"430":{"position":[[164,12]]}}}],["chromecast.j",{"_index":2008,"t":{"340":{"position":[[1344,18]]}}}],["chromecast.json",{"_index":991,"t":{"98":{"position":[[2273,15],[2805,15],[3464,15]]}}}],["chromecastsourceaioconfig",{"_index":2006,"t":{"340":{"position":[[1287,26]]}}}],["chromecastsourceconfig",{"_index":2007,"t":{"340":{"position":[[1314,22]]}}}],["chromium",{"_index":1388,"t":{"196":{"position":[[418,8]]}}}],["circumv",{"_index":963,"t":{"98":{"position":[[1062,10]]}}}],["cjeb3egaevcd",{"_index":1441,"t":{"208":{"position":[[1122,12]]},"210":{"position":[[487,12],[844,12]]}}}],["class",{"_index":1913,"t":{"325":{"position":[[284,5],[334,5]]},"329":{"position":[[41,6],[1042,5],[1230,5],[1777,5],[2015,5],[2118,6],[3024,5],[3148,5]]},"342":{"position":[[403,5],[454,5],[543,5]]},"344":{"position":[[390,5]]},"346":{"position":[[351,5]]},"348":{"position":[[372,5],[1632,5],[2270,5]]},"350":{"position":[[1699,5]]},"353":{"position":[[454,5]]},"355":{"position":[[897,5],[1760,6],[2816,5],[3488,5]]}}}],["classifi",{"_index":987,"t":{"98":{"position":[[1882,10]]}}}],["claus",{"_index":1594,"t":{"228":{"position":[[327,6],[375,7]]}}}],["clean",{"_index":1512,"t":{"212":{"position":[[249,6]]},"366":{"position":[[994,5]]}}}],["click",{"_index":839,"t":{"84":{"position":[[420,8]]},"86":{"position":[[1104,8]]},"92":{"position":[[464,5],[747,5],[780,5]]},"130":{"position":[[219,5]]},"176":{"position":[[4290,5]]},"192":{"position":[[431,5]]},"208":{"position":[[4264,5],[5444,5]]},"416":{"position":[[1159,5],[4047,5]]}}}],["client",{"_index":6,"t":{"4":{"position":[[12,7],[593,6],[1619,6],[1715,7],[2585,10],[3302,6],[3398,7],[4442,10],[4659,10]]},"6":{"position":[[75,6],[175,7],[192,7]]},"8":{"position":[[567,9],[1003,9]]},"20":{"position":[[105,7]]},"22":{"position":[[163,6],[380,10]]},"26":{"position":[[2,6]]},"31":{"position":[[55,6]]},"33":{"position":[[90,7],[185,7],[408,7],[515,7],[756,6],[910,7],[1072,9]]},"37":{"position":[[266,8],[290,9],[527,10],[557,8],[581,9]]},"41":{"position":[[507,9],[785,10],[857,9]]},"45":{"position":[[328,9],[569,10],[639,9]]},"49":{"position":[[212,8],[252,9],[440,10],[473,8],[513,9]]},"51":{"position":[[1871,7]]},"56":{"position":[[747,9],[956,10],[1013,9]]},"63":{"position":[[874,9],[1077,10],[1125,9]]},"67":{"position":[[628,6],[964,10],[1220,10],[1466,10],[1722,10],[1892,10],[2201,7],[2268,7],[2437,7],[2504,7],[2696,10],[2865,10],[3100,10],[3163,10]]},"69":{"position":[[128,10],[263,10],[398,10],[569,10],[723,10],[1257,10],[1500,10]]},"80":{"position":[[15,7],[57,7],[147,7],[221,10],[302,7],[319,11],[414,8],[433,6],[579,6],[647,6]]},"94":{"position":[[194,10],[497,10]]},"118":{"position":[[110,8],[176,8],[199,8],[469,6],[545,6]]},"120":{"position":[[165,8]]},"126":{"position":[[95,8],[156,8],[378,8]]},"128":{"position":[[84,6],[162,6]]},"130":{"position":[[2190,10],[2828,10]]},"132":{"position":[[180,8]]},"136":{"position":[[18,7]]},"140":{"position":[[117,8],[197,8]]},"142":{"position":[[89,6],[172,6]]},"144":{"position":[[59,8],[83,8]]},"146":{"position":[[83,6],[160,6]]},"156":{"position":[[39,6]]},"168":{"position":[[2311,10],[2859,10]]},"170":{"position":[[52,8],[255,8],[323,8]]},"172":{"position":[[45,8]]},"174":{"position":[[16,8],[273,6],[351,6]]},"176":{"position":[[572,6],[3725,6],[4071,6],[4135,6]]},"178":{"position":[[288,10],[640,10]]},"184":{"position":[[59,8],[334,8],[402,8]]},"186":{"position":[[45,8]]},"188":{"position":[[16,8]]},"190":{"position":[[1533,6],[1611,6]]},"198":{"position":[[202,10],[286,10]]},"208":{"position":[[563,6],[1375,7],[2177,6],[2466,6],[2488,6],[2502,6],[2899,7],[2907,6],[2922,6],[3180,6],[3792,7],[4858,7]]},"210":{"position":[[145,6],[200,6],[428,10],[785,10]]},"212":{"position":[[311,6],[678,6]]},"214":{"position":[[474,7],[491,7],[551,6],[592,6],[739,6]]},"216":{"position":[[162,6],[358,8]]},"218":{"position":[[230,7],[242,8]]},"265":{"position":[[183,7],[272,6]]},"274":{"position":[[170,7]]},"325":{"position":[[64,7]]},"331":{"position":[[507,7]]},"333":{"position":[[32,6]]},"346":{"position":[[480,6]]},"350":{"position":[[903,7],[2929,7]]},"355":{"position":[[3014,7],[3373,7],[3669,7],[3973,7]]},"374":{"position":[[11,6]]},"376":{"position":[[433,6]]},"390":{"position":[[2769,7]]},"394":{"position":[[2480,6]]},"396":{"position":[[117,6]]},"400":{"position":[[953,10],[1122,10]]},"416":{"position":[[584,6],[3151,8],[3281,7]]},"418":{"position":[[172,7]]},"424":{"position":[[0,7],[135,7]]},"426":{"position":[[355,7]]},"428":{"position":[[253,7]]},"430":{"position":[[508,7],[698,7],[803,7],[989,6],[1700,6],[1883,7],[2253,7]]},"432":{"position":[[66,8],[224,7]]},"434":{"position":[[372,6],[476,8]]},"436":{"position":[[2,6],[158,6],[265,7]]}}}],["client/secret",{"_index":198,"t":{"8":{"position":[[184,14]]}}}],["client/sourc",{"_index":11,"t":{"4":{"position":[[72,13],[2337,13],[2414,14]]},"24":{"position":[[289,13],[373,14]]}}}],["client1maloja",{"_index":1395,"t":{"198":{"position":[[215,15]]}}}],["client2maloja",{"_index":1398,"t":{"198":{"position":[[299,15]]}}}],["clientconfig",{"_index":2052,"t":{"344":{"position":[[1143,14]]}}}],["clientdefault",{"_index":159,"t":{"4":{"position":[[4322,17]]},"67":{"position":[[535,17]]}}}],["clientid",{"_index":118,"t":{"4":{"position":[[2610,11],[4504,11]]},"67":{"position":[[1001,11],[1257,11]]},"69":{"position":[[165,11],[300,11]]},"178":{"position":[[313,11],[665,11]]},"208":{"position":[[2635,11],[3864,11]]},"210":{"position":[[509,11],[866,11]]}}}],["clients/sourc",{"_index":429,"t":{"24":{"position":[[255,15],[545,15]]}}}],["clientsecret",{"_index":120,"t":{"4":{"position":[[2658,15],[4552,15]]},"67":{"position":[[1033,15],[1380,15]]},"69":{"position":[[197,15],[332,15]]},"178":{"position":[[361,15],[713,15]]},"208":{"position":[[2692,15],[3921,15]]},"210":{"position":[[564,15],[921,15]]}}}],["clone",{"_index":1902,"t":{"321":{"position":[[179,5],[259,5]]},"400":{"position":[[0,5],[80,5]]},"457":{"position":[[67,6]]}}}],["close",{"_index":1767,"t":{"251":{"position":[[5809,6]]},"254":{"position":[[77,5]]},"376":{"position":[[1097,7]]}}}],["cloud",{"_index":1452,"t":{"208":{"position":[[1785,5],[4156,5]]},"434":{"position":[[145,5]]}}}],["clv",{"_index":1492,"t":{"208":{"position":[[5120,4]]}}}],["code",{"_index":1261,"t":{"176":{"position":[[997,4],[3667,4]]},"208":{"position":[[5115,4],[5258,4]]},"256":{"position":[[1061,4]]},"376":{"position":[[136,5],[302,5]]}}}],["cog",{"_index":567,"t":{"47":{"position":[[353,4]]},"424":{"position":[[537,4]]}}}],["collect",{"_index":1295,"t":{"176":{"position":[[3554,7]]},"190":{"position":[[679,10]]},"212":{"position":[[371,10]]},"261":{"position":[[742,10]]},"265":{"position":[[83,10]]}}}],["collid",{"_index":247,"t":{"8":{"position":[[1774,7]]}}}],["collis",{"_index":244,"t":{"8":{"position":[[1683,10]]}}}],["column",{"_index":915,"t":{"92":{"position":[[763,6]]}}}],["combin",{"_index":1577,"t":{"224":{"position":[[881,9]]},"247":{"position":[[400,8]]},"251":{"position":[[1697,8]]},"382":{"position":[[130,10]]},"400":{"position":[[384,11]]}}}],["come",{"_index":931,"t":{"96":{"position":[[428,5]]},"218":{"position":[[944,6]]},"234":{"position":[[305,6]]},"263":{"position":[[70,4]]}}}],["comma",{"_index":1009,"t":{"100":{"position":[[314,5],[425,5],[505,5],[608,5]]},"130":{"position":[[1623,5],[1713,5],[1814,5],[1889,5],[1976,5],[2062,5]]},"162":{"position":[[186,5],[263,5]]},"168":{"position":[[1764,5],[1846,5],[1939,5],[2010,5],[2093,5],[2175,5]]},"202":{"position":[[225,5],[314,5]]},"247":{"position":[[293,5]]},"261":{"position":[[845,7]]},"297":{"position":[[605,5]]},"416":{"position":[[2822,5]]},"418":{"position":[[1621,5]]},"422":{"position":[[838,5]]}}}],["command",{"_index":1356,"t":{"192":{"position":[[755,7],[945,7]]},"366":{"position":[[645,7],[1042,7]]},"368":{"position":[[90,7]]},"394":{"position":[[3452,8]]},"455":{"position":[[191,7],[218,7]]}}}],["commerci",{"_index":1660,"t":{"234":{"position":[[855,10]]},"236":{"position":[[252,10]]}}}],["commit",{"_index":200,"t":{"8":{"position":[[251,9]]},"361":{"position":[[22,6]]},"457":{"position":[[103,7]]}}}],["common",{"_index":382,"t":{"20":{"position":[[30,6]]},"98":{"position":[[415,7]]},"192":{"position":[[2170,6]]},"251":{"position":[[1490,6],[3255,6],[3277,6],[4106,6],[4502,6]]},"297":{"position":[[390,6]]},"301":{"position":[[290,6],[507,6]]},"325":{"position":[[308,6],[434,6]]},"335":{"position":[[236,6]]},"340":{"position":[[64,6],[415,6]]},"384":{"position":[[44,6],[353,6]]},"428":{"position":[[530,6]]}}}],["common.j",{"_index":1991,"t":{"340":{"position":[[258,15]]}}}],["common/errors/upstreamerror.j",{"_index":2099,"t":{"348":{"position":[[1573,36],[2211,36]]}}}],["common/infrastructure/atomic.j",{"_index":2024,"t":{"342":{"position":[[337,37]]},"346":{"position":[[247,37]]},"350":{"position":[[1639,37]]},"353":{"position":[[394,37]]}}}],["common/infrastructure/config/source/coolplayer.j",{"_index":2020,"t":{"342":{"position":[[203,55]]}}}],["commonclientconfig",{"_index":1921,"t":{"327":{"position":[[136,19]]}}}],["commonsourceconfig",{"_index":1920,"t":{"327":{"position":[[113,18]]},"340":{"position":[[283,19],[918,18]]}}}],["commonsourcedata",{"_index":1992,"t":{"340":{"position":[[303,16],[504,17]]}}}],["commun",{"_index":795,"t":{"76":{"position":[[86,13]]},"106":{"position":[[32,11]]},"112":{"position":[[32,11]]},"156":{"position":[[3,12]]},"160":{"position":[[34,13],[315,12],[382,13],[1473,13]]},"192":{"position":[[3,12]]},"208":{"position":[[8,13]]},"319":{"position":[[300,12]]},"329":{"position":[[1468,11],[2410,11]]},"430":{"position":[[1363,12]]},"434":{"position":[[307,11]]},"436":{"position":[[228,11]]}}}],["compar",{"_index":1315,"t":{"180":{"position":[[577,8]]},"214":{"position":[[218,8],[599,8]]},"216":{"position":[[76,8],[93,8],[116,8],[523,10]]},"218":{"position":[[69,7],[125,8],[307,7],[363,8],[675,7],[1007,7],[1024,7],[1370,10],[1442,8],[1538,8]]},"291":{"position":[[10,10]]},"355":{"position":[[2395,9]]}}}],["comparison",{"_index":1552,"t":{"218":{"position":[[1155,10],[1283,11]]}}}],["compat",{"_index":786,"t":{"73":{"position":[[766,10]]},"430":{"position":[[378,10]]}}}],["compens",{"_index":2268,"t":{"390":{"position":[[532,10]]}}}],["compil",{"_index":1781,"t":{"256":{"position":[[461,11],[899,12],[1470,12],[1516,15]]}}}],["complet",{"_index":614,"t":{"51":{"position":[[1402,9]]},"176":{"position":[[948,8],[1289,8],[2180,10],[3335,8]]},"208":{"position":[[5322,10]]},"263":{"position":[[481,10]]},"329":{"position":[[2305,8]]},"374":{"position":[[258,10]]},"376":{"position":[[257,9]]},"416":{"position":[[1311,9],[4208,9]]}}}],["complex",{"_index":103,"t":{"4":{"position":[[2276,7],[3901,7]]}}}],["complic",{"_index":2441,"t":{"428":{"position":[[187,11]]}}}],["compon",{"_index":1912,"t":{"325":{"position":[[145,10],[158,9],[263,9],[362,9]]},"327":{"position":[[24,9],[265,9],[427,9]]},"329":{"position":[[0,10],[108,9],[195,9],[726,9],[975,9],[1501,9],[1592,9],[1643,9],[1992,9],[2108,9],[2206,9],[2364,9]]},"331":{"position":[[552,9]]}}}],["compos",{"_index":49,"t":{"4":{"position":[[766,7]]},"8":{"position":[[792,7]]},"14":{"position":[[615,8],[1372,8],[3167,7]]},"47":{"position":[[311,7]]},"160":{"position":[[1093,7]]},"325":{"position":[[171,8]]},"394":{"position":[[1591,7],[1794,7],[1908,8],[2259,7],[2353,8],[2793,7],[2881,8],[3095,8]]},"396":{"position":[[56,7],[345,7]]},"412":{"position":[[84,8]]},"424":{"position":[[495,7]]},"426":{"position":[[237,7]]},"455":{"position":[[14,7],[271,7],[291,7]]}}}],["compose.yaml",{"_index":1203,"t":{"160":{"position":[[1144,12]]}}}],["compose.yml",{"_index":50,"t":{"4":{"position":[[781,11]]},"14":{"position":[[3189,11]]},"47":{"position":[[112,12],[145,11]]},"394":{"position":[[259,12],[344,11],[1924,11],[2369,11],[2897,11]]},"396":{"position":[[292,11],[859,11],[925,11]]},"412":{"position":[[264,11]]},"414":{"position":[[76,11],[123,11]]},"416":{"position":[[274,11],[315,11],[871,11],[912,11],[1845,11],[1886,11],[2232,11],[2650,11],[2691,11],[3598,11]]},"418":{"position":[[490,11],[531,11],[992,11],[1033,11],[1135,11],[1176,11],[1277,11],[1318,11],[1415,11],[1456,11]]},"420":{"position":[[223,11],[264,11]]},"422":{"position":[[209,11],[250,11],[352,11],[393,11],[494,11],[535,11],[632,11],[673,11]]},"424":{"position":[[296,12],[329,11],[748,11],[817,11],[1128,11],[1197,11],[2034,11],[2103,11]]},"426":{"position":[[168,11]]}}}],["compositeconfig",{"_index":2057,"t":{"344":{"position":[[1365,15]]}}}],["compris",{"_index":1727,"t":{"249":{"position":[[215,9]]}}}],["concern",{"_index":373,"t":{"18":{"position":[[74,8]]}}}],["concret",{"_index":1537,"t":{"216":{"position":[[259,8]]},"325":{"position":[[275,8]]}}}],["condit",{"_index":868,"t":{"86":{"position":[[1800,10]]},"224":{"position":[[898,9]]},"226":{"position":[[583,10]]},"228":{"position":[[1097,10],[1150,10],[1188,9],[1402,9]]},"245":{"position":[[114,10]]},"287":{"position":[[15,11]]},"305":{"position":[[114,11]]}}}],["config",{"_index":14,"t":{"4":{"position":[[100,6],[132,6],[633,6],[1322,7],[1973,6],[1995,7],[2505,6],[3503,6],[3627,6],[4019,6]]},"8":{"position":[[502,7]]},"14":{"position":[[585,8],[795,6],[971,7],[1052,9],[1342,8],[1552,6],[1720,7],[1797,9],[2176,6],[2588,7],[2848,7],[2998,9]]},"22":{"position":[[662,6],[1017,6],[1417,6]]},"33":{"position":[[902,7],[995,8],[1190,8]]},"35":{"position":[[1552,6]]},"37":{"position":[[17,6],[217,6],[490,6]]},"41":{"position":[[17,6],[415,6],[748,6]]},"45":{"position":[[17,6],[232,6],[532,6]]},"49":{"position":[[17,6],[159,6],[403,6]]},"56":{"position":[[436,6],[669,6],[919,6]]},"63":{"position":[[574,6],[806,6],[1040,6]]},"67":{"position":[[173,6],[337,6],[525,6],[712,6],[900,6]]},"69":{"position":[[100,7]]},"80":{"position":[[671,7]]},"82":{"position":[[373,7]]},"84":{"position":[[656,7]]},"86":{"position":[[717,6],[1321,7]]},"96":{"position":[[175,6]]},"98":{"position":[[3403,6]]},"100":{"position":[[100,7]]},"102":{"position":[[1226,6]]},"108":{"position":[[52,6],[666,6]]},"110":{"position":[[17,6],[293,6],[515,6]]},"114":{"position":[[50,6],[658,6]]},"116":{"position":[[17,6],[224,6],[462,6]]},"118":{"position":[[312,6],[328,6],[404,6],[476,6],[596,6],[636,6],[909,6]]},"124":{"position":[[17,6],[297,6],[471,6]]},"128":{"position":[[17,6],[91,6],[213,6],[255,6],[588,6]]},"138":{"position":[[17,6],[376,6],[550,6]]},"142":{"position":[[17,6],[96,6],[223,6],[270,6],[570,6]]},"144":{"position":[[196,6],[212,6]]},"146":{"position":[[17,6],[90,6],[212,6],[253,6],[497,6]]},"148":{"position":[[407,6],[967,6]]},"150":{"position":[[154,7]]},"154":{"position":[[17,6],[49,6],[285,6]]},"156":{"position":[[121,7]]},"158":{"position":[[17,6],[129,6],[375,6]]},"162":{"position":[[17,6],[349,6],[559,6]]},"166":{"position":[[17,6],[166,6],[402,6]]},"168":{"position":[[1563,6],[2241,6],[2770,6]]},"174":{"position":[[129,6],[145,6],[206,6],[280,6],[402,6],[444,6],[694,6]]},"178":{"position":[[17,6],[215,6],[551,6]]},"182":{"position":[[17,6],[181,6],[458,6]]},"188":{"position":[[130,6],[146,6]]},"190":{"position":[[1466,6],[1540,6],[1662,6],[1704,6],[2002,6]]},"192":{"position":[[1565,7]]},"194":{"position":[[17,6],[130,6],[327,6]]},"198":{"position":[[145,7]]},"202":{"position":[[17,6],[340,6],[550,6]]},"206":{"position":[[17,6],[126,6],[307,6]]},"208":{"position":[[995,6],[4724,7]]},"210":{"position":[[17,6],[355,6],[696,6]]},"212":{"position":[[16,7]]},"222":{"position":[[44,6],[461,7],[767,7],[1111,7],[1448,7],[1636,7],[1946,7],[2252,7]]},"230":{"position":[[110,6]]},"234":{"position":[[1527,6]]},"241":{"position":[[197,7]]},"247":{"position":[[99,6]]},"256":{"position":[[612,7]]},"267":{"position":[[557,7]]},"270":{"position":[[17,7],[193,7]]},"272":{"position":[[10,6],[57,7],[80,7],[105,7],[465,7]]},"274":{"position":[[294,7],[528,7]]},"276":{"position":[[202,7],[563,7]]},"280":{"position":[[589,7]]},"303":{"position":[[1488,6]]},"307":{"position":[[257,7]]},"309":{"position":[[68,6]]},"312":{"position":[[17,7],[323,7]]},"314":{"position":[[17,7],[222,7]]},"316":{"position":[[255,7]]},"329":{"position":[[1145,6],[1236,6],[1257,6],[3128,6],[3376,6]]},"340":{"position":[[21,6],[71,6],[104,6],[156,7],[1960,6]]},"342":{"position":[[93,6],[549,6],[575,7],[630,7],[739,7]]},"344":{"position":[[28,7],[86,7],[166,6],[1097,6]]},"355":{"position":[[3428,7]]},"379":{"position":[[88,6]]},"390":{"position":[[2344,6]]},"406":{"position":[[62,7]]},"416":{"position":[[1801,6],[3544,8]]},"424":{"position":[[2260,6]]},"453":{"position":[[328,7]]}}}],["config.json",{"_index":318,"t":{"14":{"position":[[979,11],[1728,11],[2347,11],[2925,11],[3773,11]]},"16":{"position":[[444,11],[456,11]]},"22":{"position":[[222,11],[344,11],[809,11],[1162,11],[1542,11]]},"102":{"position":[[1290,11]]},"222":{"position":[[51,11],[469,11],[1119,11],[1954,11]]},"241":{"position":[[205,11],[774,11]]},"243":{"position":[[125,11]]},"270":{"position":[[25,11]]},"272":{"position":[[113,11]]},"274":{"position":[[302,11]]},"276":{"position":[[210,11]]},"280":{"position":[[178,11]]},"312":{"position":[[25,11]]},"314":{"position":[[25,11]]},"340":{"position":[[1073,13]]},"379":{"position":[[246,11]]}}}],["config/config.json",{"_index":127,"t":{"4":{"position":[[2994,19]]},"400":{"position":[[874,20],[895,20]]}}}],["config/config.json.exampl",{"_index":134,"t":{"4":{"position":[[3681,27]]}}}],["config/data",{"_index":2348,"t":{"396":{"position":[[224,11]]}}}],["config/endpointlfm.json",{"_index":1089,"t":{"124":{"position":[[309,23]]}}}],["config/endpointlz.json",{"_index":1142,"t":{"138":{"position":[[388,22]]}}}],["config/kodi.json",{"_index":1075,"t":{"116":{"position":[[236,16]]}}}],["config/koito.json",{"_index":515,"t":{"37":{"position":[[229,17]]},"118":{"position":[[648,17]]}}}],["config/lastfm.json",{"_index":543,"t":{"41":{"position":[[427,18]]},"128":{"position":[[267,18]]}}}],["config/listenbrainz.json",{"_index":553,"t":{"45":{"position":[[244,24]]},"142":{"position":[[282,24]]}}}],["config/maloja.json",{"_index":575,"t":{"49":{"position":[[171,18]]},"146":{"position":[[265,18]]}}}],["config/mopidy.json",{"_index":1174,"t":{"154":{"position":[[61,18]]}}}],["config/mpd.json",{"_index":1185,"t":{"158":{"position":[[141,15]]}}}],["config/mpris.json",{"_index":1221,"t":{"162":{"position":[[361,17]]}}}],["config/musiccast.json",{"_index":1418,"t":{"206":{"position":[[138,21]]}}}],["config/musikcube.json",{"_index":1230,"t":{"166":{"position":[[178,21]]}}}],["config/plex.json",{"_index":1244,"t":{"168":{"position":[[2253,16]]}}}],["config/rocksky.json",{"_index":652,"t":{"56":{"position":[[681,19]]},"174":{"position":[[456,19]]}}}],["config/spotify.json",{"_index":1310,"t":{"178":{"position":[[227,19]]}}}],["config/subsonic.json",{"_index":1319,"t":{"182":{"position":[[193,20]]}}}],["config/systemd/us",{"_index":2383,"t":{"406":{"position":[[79,22]]}}}],["config/systemd/user/multi",{"_index":2385,"t":{"406":{"position":[[108,28]]}}}],["config/tealfm.json",{"_index":678,"t":{"63":{"position":[[818,18]]},"190":{"position":[[1716,18]]}}}],["config/vlc.json",{"_index":1369,"t":{"192":{"position":[[1573,15],[2337,15]]},"194":{"position":[[142,15]]}}}],["config/webscrobbler.json",{"_index":1407,"t":{"202":{"position":[[352,24]]}}}],["config/ytmusic.json",{"_index":1505,"t":{"210":{"position":[[367,19]]}}}],["config:/config",{"_index":1723,"t":{"247":{"position":[[1907,18]]},"309":{"position":[[1024,18]]},"394":{"position":[[1202,18],[1980,18]]},"396":{"position":[[1404,18]]},"414":{"position":[[468,18]]}}}],["config_dir",{"_index":68,"t":{"4":{"position":[[1209,10],[2458,11],[2869,10]]},"14":{"position":[[2636,10]]}}}],["config_dir/azuracast.json",{"_index":879,"t":{"88":{"position":[[350,25]]}}}],["config_dir/chromecast.json",{"_index":1019,"t":{"100":{"position":[[637,26]]}}}],["config_dir/config.json",{"_index":140,"t":{"4":{"position":[[4034,22]]},"37":{"position":[[502,22]]},"41":{"position":[[760,22]]},"45":{"position":[[544,22]]},"49":{"position":[[415,22]]},"56":{"position":[[931,22]]},"63":{"position":[[1052,22]]},"67":{"position":[[0,22]]},"88":{"position":[[624,22]]},"94":{"position":[[420,22]]},"100":{"position":[[871,22]]},"104":{"position":[[287,22]]},"110":{"position":[[527,22]]},"116":{"position":[[474,22]]},"118":{"position":[[921,22]]},"124":{"position":[[483,22]]},"128":{"position":[[600,22]]},"130":{"position":[[2750,22]]},"138":{"position":[[562,22]]},"142":{"position":[[582,22]]},"146":{"position":[[509,22]]},"154":{"position":[[297,22]]},"158":{"position":[[387,22]]},"162":{"position":[[571,22]]},"166":{"position":[[414,22]]},"168":{"position":[[2782,22]]},"174":{"position":[[706,22]]},"178":{"position":[[563,22]]},"182":{"position":[[470,22]]},"190":{"position":[[2014,22]]},"194":{"position":[[339,22]]},"202":{"position":[[562,22]]},"206":{"position":[[319,22]]},"210":{"position":[[708,22]]}}}],["config_dir/deezer.json",{"_index":917,"t":{"94":{"position":[[130,22]]}}}],["config_dir/endpointlz.json",{"_index":767,"t":{"69":{"position":[[1441,26]]}}}],["config_dir/icecast.json",{"_index":1043,"t":{"104":{"position":[[102,23]]}}}],["config_dir/jellyfin.json",{"_index":765,"t":{"69":{"position":[[1017,24]]},"130":{"position":[[2123,24]]}}}],["config_dir/jriver.json",{"_index":1060,"t":{"110":{"position":[[305,22]]}}}],["config_dir/lastfm.json",{"_index":479,"t":{"33":{"position":[[1004,22]]},"69":{"position":[[1889,22]]}}}],["config_dir/maloja.json",{"_index":768,"t":{"69":{"position":[[1563,22]]}}}],["config_dir/plex.json",{"_index":764,"t":{"69":{"position":[[524,20]]}}}],["config_dir/spotify.json",{"_index":113,"t":{"4":{"position":[[2520,23]]},"69":{"position":[[0,23]]}}}],["config_dir/ytmusic.json",{"_index":766,"t":{"69":{"position":[[1206,23]]}}}],["configs.push",{"_index":2048,"t":{"344":{"position":[[860,14]]}}}],["configur",{"_index":4,"t":{"2":{"position":[[47,14]]},"4":{"position":[[24,10],[158,13],[181,13],[224,14],[462,13],[1147,13],[1384,9],[1424,13],[1755,13],[1828,13],[1859,13],[1922,14],[2140,13],[2284,14],[2808,13],[3068,9],[3107,13],[3765,13],[3909,14],[3952,14]]},"6":{"position":[[8,13],[82,15],[256,13],[300,9],[321,13]]},"8":{"position":[[23,14],[211,13]]},"12":{"position":[[215,13],[453,14],[583,14]]},"14":{"position":[[213,12],[480,10],[526,10],[571,13],[751,14],[1237,10],[1283,10],[1328,13],[1508,14],[2132,14],[2481,14],[2558,10],[3408,14]]},"16":{"position":[[89,13]]},"22":{"position":[[42,10],[200,10],[302,10]]},"33":{"position":[[535,10],[815,13]]},"35":{"position":[[1492,10]]},"43":{"position":[[385,14]]},"47":{"position":[[548,13]]},"78":{"position":[[134,13]]},"80":{"position":[[97,13],[403,10],[443,10]]},"82":{"position":[[626,10]]},"84":{"position":[[291,14]]},"86":{"position":[[1600,11],[1733,10],[1834,10]]},"98":{"position":[[605,9],[767,10],[795,13],[914,10],[2124,14],[2156,10],[2721,13]]},"100":{"position":[[27,11]]},"102":{"position":[[723,9],[1547,10]]},"106":{"position":[[320,13]]},"112":{"position":[[288,13]]},"118":{"position":[[99,10],[208,13],[272,14],[372,14],[552,14]]},"122":{"position":[[29,13]]},"124":{"position":[[151,14]]},"126":{"position":[[84,10],[277,9],[342,13],[461,13]]},"128":{"position":[[169,14]]},"130":{"position":[[327,13],[1168,14],[1183,14]]},"134":{"position":[[29,13],[298,11]]},"136":{"position":[[202,13]]},"138":{"position":[[149,14]]},"140":{"position":[[106,10],[485,14]]},"142":{"position":[[179,14]]},"144":{"position":[[92,13],[156,14]]},"146":{"position":[[167,14]]},"148":{"position":[[748,13],[835,13]]},"160":{"position":[[1009,10]]},"164":{"position":[[26,9]]},"168":{"position":[[491,13],[1531,14]]},"170":{"position":[[244,10]]},"174":{"position":[[25,13],[89,14],[358,14]]},"176":{"position":[[1940,10],[2252,13],[4206,13]]},"180":{"position":[[661,13]]},"184":{"position":[[323,10]]},"188":{"position":[[25,13],[90,14]]},"190":{"position":[[362,10],[1618,14]]},"192":{"position":[[869,13]]},"200":{"position":[[10,10],[279,10]]},"208":{"position":[[1879,9],[4984,14]]},"216":{"position":[[314,13]]},"222":{"position":[[23,10],[260,13],[370,9],[1025,11],[1806,14],[1833,13]]},"224":{"position":[[1079,11]]},"226":{"position":[[25,10]]},"234":{"position":[[1604,14]]},"241":{"position":[[171,13],[459,14]]},"243":{"position":[[69,10],[89,13]]},"247":{"position":[[12,13],[50,10],[246,9],[599,13],[1113,13],[1294,13]]},"249":{"position":[[387,14]]},"251":{"position":[[528,13],[2553,14],[2574,13],[2870,13],[3196,13],[3404,10],[3975,13],[4682,13],[5831,13]]},"254":{"position":[[129,13]]},"256":{"position":[[1910,14]]},"258":{"position":[[769,14]]},"261":{"position":[[73,13]]},"276":{"position":[[18,10]]},"280":{"position":[[10,13],[102,13],[417,14]]},"303":{"position":[[31,14]]},"307":{"position":[[60,14],[149,14]]},"309":{"position":[[12,13],[368,13],[543,13]]},"316":{"position":[[177,13]]},"323":{"position":[[105,14]]},"325":{"position":[[240,13]]},"327":{"position":[[4,13]]},"329":{"position":[[834,14]]},"355":{"position":[[3391,10]]},"372":{"position":[[1646,13],[1929,11]]},"374":{"position":[[52,14]]},"379":{"position":[[304,13],[357,13]]},"388":{"position":[[65,14]]},"390":{"position":[[1458,13]]},"392":{"position":[[74,13]]},"394":{"position":[[322,14],[1550,13],[1679,14],[3248,13]]},"398":{"position":[[37,9]]},"416":{"position":[[156,13],[2001,9]]},"418":{"position":[[241,9]]},"424":{"position":[[117,10],[147,9],[2200,10]]},"426":{"position":[[328,10],[434,10]]},"428":{"position":[[102,13],[140,9],[271,13]]},"430":{"position":[[820,11],[1123,13]]},"432":{"position":[[11,14],[99,10],[247,10]]},"434":{"position":[[244,14],[465,10]]},"436":{"position":[[165,14]]},"442":{"position":[[8,13]]},"444":{"position":[[61,13],[194,14]]},"446":{"position":[[34,14]]},"453":{"position":[[280,14]]}}}],["configuraion",{"_index":1725,"t":{"249":{"position":[[96,12]]}}}],["configuration/data",{"_index":1934,"t":{"329":{"position":[[941,18]]}}}],["configurea",{"_index":214,"t":{"8":{"position":[[552,14],[988,14]]},"33":{"position":[[1057,14]]},"37":{"position":[[275,14],[566,14]]},"41":{"position":[[492,14],[842,14]]},"45":{"position":[[313,14],[624,14]]},"49":{"position":[[237,14],[498,14]]},"56":{"position":[[732,14],[998,14]]},"63":{"position":[[859,14],[1110,14]]},"118":{"position":[[348,14],[694,14],[985,14]]},"126":{"position":[[413,14]]},"128":{"position":[[332,14],[682,14]]},"142":{"position":[[351,14],[662,14]]},"144":{"position":[[232,14]]},"146":{"position":[[331,14],[592,14]]},"174":{"position":[[165,14],[507,14],[773,14]]},"188":{"position":[[166,14]]},"190":{"position":[[859,14],[1068,14],[1298,14],[1763,14],[2078,14]]},"216":{"position":[[419,14]]},"284":{"position":[[98,14]]},"344":{"position":[[943,12]]},"416":{"position":[[3783,14]]},"418":{"position":[[1730,14]]},"422":{"position":[[947,14]]}}}],["confirm",{"_index":2192,"t":{"364":{"position":[[507,10]]}}}],["confus",{"_index":2257,"t":{"384":{"position":[[269,7]]}}}],["congratul",{"_index":2137,"t":{"350":{"position":[[2985,16]]}}}],["conjunct",{"_index":1810,"t":{"258":{"position":[[722,11]]}}}],["connect",{"_index":319,"t":{"14":{"position":[[1038,13],[1783,13],[2408,13],[2528,10],[2984,13],[3383,10],[3434,10],[3479,7],[3723,7],[3834,13]]},"86":{"position":[[364,7]]},"98":{"position":[[718,10]]},"100":{"position":[[51,11]]},"108":{"position":[[16,7],[83,7],[561,7],[719,7]]},"114":{"position":[[16,7],[81,7],[553,7],[711,7]]},"148":{"position":[[360,7],[438,7],[1020,7]]},"156":{"position":[[46,11]]},"164":{"position":[[59,11]]},"168":{"position":[[63,7]]},"329":{"position":[[1413,11],[1897,10]]},"348":{"position":[[1404,11],[1451,10]]},"372":{"position":[[271,8],[908,7],[1200,7]]},"394":{"position":[[1378,7]]},"416":{"position":[[2561,7]]},"446":{"position":[[19,11]]}}}],["connect:/run/user/1000/bu",{"_index":1216,"t":{"160":{"position":[[1642,26]]}}}],["connector",{"_index":1403,"t":{"200":{"position":[[69,11],[149,10],[251,9]]},"202":{"position":[[213,11],[302,11]]}}}],["consecut",{"_index":2270,"t":{"390":{"position":[[685,11]]}}}],["consent",{"_index":1454,"t":{"208":{"position":[[1899,7]]}}}],["consid",{"_index":311,"t":{"14":{"position":[[708,8],[1465,8]]},"180":{"position":[[390,11]]},"234":{"position":[[429,8]]},"254":{"position":[[272,10]]},"261":{"position":[[624,8]]},"263":{"position":[[28,9]]},"303":{"position":[[107,10],[252,10]]},"390":{"position":[[583,9]]}}}],["consist",{"_index":531,"t":{"39":{"position":[[320,10]]},"102":{"position":[[395,11]]},"218":{"position":[[1095,8]]},"220":{"position":[[557,8]]},"222":{"position":[[116,8]]},"234":{"position":[[1144,10]]},"238":{"position":[[48,10]]},"319":{"position":[[54,8]]},"331":{"position":[[127,8]]},"390":{"position":[[968,11]]},"434":{"position":[[259,7]]},"436":{"position":[[180,7]]}}}],["consol",{"_index":1453,"t":{"208":{"position":[[1791,7],[4162,7]]}}}],["const",{"_index":2016,"t":{"340":{"position":[[1806,5]]},"344":{"position":[[614,6],[730,5]]},"346":{"position":[[684,5]]},"348":{"position":[[481,5],[569,5],[803,5],[1765,5],[2362,5]]},"350":{"position":[[1848,5],[1932,5],[2048,5],[2295,5],[2769,5]]},"353":{"position":[[748,5],[965,5]]},"355":{"position":[[3037,5],[3570,5]]}}}],["constraint",{"_index":1757,"t":{"251":{"position":[[5006,11]]}}}],["constructor",{"_index":1950,"t":{"329":{"position":[[2072,11]]},"342":{"position":[[67,11]]},"353":{"position":[[236,11],[500,14]]},"355":{"position":[[659,12],[943,14]]}}}],["constructor(nam",{"_index":2026,"t":{"342":{"position":[[607,17]]}}}],["consult",{"_index":2442,"t":{"428":{"position":[[497,7]]}}}],["contact",{"_index":1684,"t":{"241":{"position":[[307,10],[876,10],[995,10]]},"243":{"position":[[227,10]]},"270":{"position":[[127,10]]},"272":{"position":[[215,10]]},"274":{"position":[[404,10]]},"276":{"position":[[312,10]]},"355":{"position":[[1280,8],[1331,10]]},"372":{"position":[[140,7],[195,10]]},"418":{"position":[[420,7],[597,7]]},"420":{"position":[[153,7],[330,7]]}}}],["contact@mydomain.com",{"_index":1685,"t":{"241":{"position":[[318,22],[887,22],[1006,23]]},"243":{"position":[[238,22]]},"270":{"position":[[138,22]]},"272":{"position":[[226,22]]},"274":{"position":[[415,22]]},"276":{"position":[[323,22]]}}}],["contain",{"_index":45,"t":{"4":{"position":[[659,12],[1338,10],[3022,10]]},"14":{"position":[[2882,10],[3076,9],[3114,9]]},"47":{"position":[[280,10]]},"71":{"position":[[31,8]]},"98":{"position":[[1278,9],[2377,8],[2907,8]]},"160":{"position":[[735,9],[847,9],[965,10],[1027,9]]},"176":{"position":[[985,7],[2346,9],[2555,9],[2650,9],[3419,9]]},"220":{"position":[[62,10]]},"222":{"position":[[328,10]]},"234":{"position":[[628,8]]},"236":{"position":[[25,8]]},"241":{"position":[[100,8]]},"251":{"position":[[81,9],[383,10],[1030,8],[1357,8],[2383,8],[2801,8]]},"254":{"position":[[35,8]]},"323":{"position":[[16,8],[422,9]]},"327":{"position":[[228,8]]},"329":{"position":[[1152,10],[1269,8]]},"376":{"position":[[50,7]]},"394":{"position":[[1253,9],[1657,9],[1750,9],[2095,9],[2213,9],[3032,9],[3145,9]]},"396":{"position":[[156,9]]},"412":{"position":[[469,9]]},"424":{"position":[[464,10]]},"426":{"position":[[44,9],[210,10]]},"434":{"position":[[31,8]]},"455":{"position":[[77,9],[115,9]]}}}],["container_nam",{"_index":1714,"t":{"247":{"position":[[1414,15]]},"309":{"position":[[663,15]]},"394":{"position":[[413,15]]},"396":{"position":[[994,15]]},"414":{"position":[[192,15]]}}}],["content",{"_index":906,"t":{"92":{"position":[[523,8]]},"176":{"position":[[2216,8]]},"297":{"position":[[306,8]]},"406":{"position":[[176,8]]},"414":{"position":[[98,8]]},"416":{"position":[[3635,9]]}}}],["context",{"_index":1966,"t":{"331":{"position":[[374,7]]},"390":{"position":[[2605,8]]}}}],["continu",{"_index":601,"t":{"51":{"position":[[912,8]]},"58":{"position":[[990,8]]},"176":{"position":[[3001,8]]},"208":{"position":[[1619,8],[4388,8]]},"226":{"position":[[39,8],[266,9],[474,9],[1451,10]]},"276":{"position":[[879,10]]},"329":{"position":[[747,8]]}}}],["contribut",{"_index":1652,"t":{"234":{"position":[[718,11]]},"236":{"position":[[115,11]]}}}],["control",{"_index":374,"t":{"18":{"position":[[108,7]]},"112":{"position":[[153,7],[180,7]]},"114":{"position":[[461,7]]},"176":{"position":[[1421,8],[3505,7],[3816,8]]},"226":{"position":[[629,7],[791,7],[887,7],[1168,7]]},"251":{"position":[[2173,8]]},"256":{"position":[[134,12]]},"276":{"position":[[122,7]]},"376":{"position":[[947,8]]},"390":{"position":[[434,7]]},"430":{"position":[[941,8]]}}}],["conveni",{"_index":667,"t":{"58":{"position":[[1611,12]]},"176":{"position":[[3369,12]]},"280":{"position":[[368,12]]},"307":{"position":[[9,12]]},"364":{"position":[[2,11]]}}}],["cooki",{"_index":749,"t":{"67":{"position":[[2902,9]]},"69":{"position":[[1294,9]]},"92":{"position":[[21,6],[274,6],[448,7],[545,6],[655,7]]},"94":{"position":[[89,6]]},"208":{"position":[[549,7],[672,6],[784,6],[849,6],[967,6],[1088,9],[1337,8],[1721,8]]},"210":{"position":[[106,6],[453,9],[810,9]]},"376":{"position":[[391,7],[555,7],[640,7],[1035,6],[1204,7]]}}}],["cool",{"_index":1172,"t":{"152":{"position":[[466,4],[488,4],[553,4],[575,4]]},"192":{"position":[[1759,4]]},"251":{"position":[[3609,4],[3670,4],[3944,4]]},"282":{"position":[[134,4],[161,4],[280,4],[307,4],[610,4],[644,4],[838,4],[878,4]]},"301":{"position":[[346,4],[612,4]]},"303":{"position":[[1465,4]]},"316":{"position":[[89,4]]},"337":{"position":[[80,4],[93,4],[630,4],[704,4],[919,4]]},"340":{"position":[[42,4],[617,4],[645,4],[786,4]]},"342":{"position":[[770,4]]},"346":{"position":[[87,4],[582,4]]},"348":{"position":[[1978,5],[2506,4]]},"350":{"position":[[2432,4]]}}}],["coolplay",{"_index":2004,"t":{"340":{"position":[[1137,12],[1785,13],[1860,12]]},"344":{"position":[[155,10],[716,13],[881,13],[1112,12],[1306,13]]},"346":{"position":[[457,10],[951,12]]}}}],["coolplayer'",{"_index":2017,"t":{"340":{"position":[[2012,12]]}}}],["coolplayer.j",{"_index":2009,"t":{"340":{"position":[[1436,18]]}}}],["coolplayerdata",{"_index":2035,"t":{"344":{"position":[[328,14],[988,14]]}}}],["coolplayersourc",{"_index":2018,"t":{"342":{"position":[[36,16],[460,16]]},"344":{"position":[[131,16],[224,16],[310,17],[511,16],[1070,16]]},"346":{"position":[[357,16]]},"348":{"position":[[50,16],[378,16],[1638,16],[2276,16]]},"350":{"position":[[607,16],[1705,16],[3007,16]]},"353":{"position":[[460,16]]},"355":{"position":[[903,16],[2088,16]]}}}],["coolplayersource(nam",{"_index":2056,"t":{"344":{"position":[[1342,22]]}}}],["coolplayersource.formatplayobj(play",{"_index":2132,"t":{"350":{"position":[[2376,37]]}}}],["coolplayersource.formatplayobj(x",{"_index":2144,"t":{"353":{"position":[[1014,35]]}}}],["coolplayersource.j",{"_index":2036,"t":{"344":{"position":[[350,24]]}}}],["coolplayersource.parseconnectionurl(baseurl",{"_index":2093,"t":{"348":{"position":[[1164,45]]}}}],["coolplayersourceaioconfig",{"_index":2003,"t":{"340":{"position":[[985,25],[1379,26],[1597,26]]}}}],["coolplayersourceconfig",{"_index":2002,"t":{"340":{"position":[[887,22],[1019,22],[1406,22],[1511,23]]},"342":{"position":[[173,22],[583,23],[638,23]]},"344":{"position":[[1384,23]]}}}],["coolplayersourcedata",{"_index":1994,"t":{"340":{"position":[[475,20],[945,20]]}}}],["copi",{"_index":97,"t":{"4":{"position":[[2125,6],[3750,6]]},"35":{"position":[[302,4],[325,4]]},"47":{"position":[[465,4]]},"92":{"position":[[510,4],[789,4]]},"130":{"position":[[285,4]]},"176":{"position":[[2207,4],[4062,4]]},"208":{"position":[[2522,4]]},"379":{"position":[[337,4]]},"416":{"position":[[3620,4]]},"424":{"position":[[652,4],[1473,4],[1496,4]]}}}],["core",{"_index":2154,"t":{"355":{"position":[[1937,4]]}}}],["core/atomic.j",{"_index":2064,"t":{"346":{"position":[[312,23]]},"355":{"position":[[851,23]]}}}],["corner",{"_index":569,"t":{"47":{"position":[[373,7]]},"424":{"position":[[557,7]]}}}],["corpor",{"_index":1676,"t":{"234":{"position":[[1421,9]]},"238":{"position":[[325,9]]}}}],["correct",{"_index":1260,"t":{"176":{"position":[[783,7]]},"234":{"position":[[149,7]]},"256":{"position":[[1273,7]]},"261":{"position":[[193,10]]},"263":{"position":[[183,8]]},"278":{"position":[[137,10],[317,10]]},"321":{"position":[[357,7]]},"372":{"position":[[2381,7]]},"374":{"position":[[36,7]]},"390":{"position":[[327,7]]},"400":{"position":[[180,7]]},"428":{"position":[[432,7]]},"430":{"position":[[627,12],[2022,7]]}}}],["correct/norm",{"_index":2424,"t":{"418":{"position":[[109,17]]}}}],["correctli",{"_index":74,"t":{"4":{"position":[[1399,9],[3083,9]]},"86":{"position":[[39,9],[207,10],[660,9]]},"98":{"position":[[1748,9]]},"192":{"position":[[2072,9]]},"204":{"position":[[117,9],[273,10]]}}}],["correspond",{"_index":1327,"t":{"190":{"position":[[111,10]]},"251":{"position":[[1843,13]]},"331":{"position":[[591,13]]},"355":{"position":[[1445,13]]}}}],["count",{"_index":865,"t":{"86":{"position":[[1668,5]]}}}],["countri",{"_index":1782,"t":{"256":{"position":[[505,7],[946,7],[983,7],[1144,7]]}}}],["cover",{"_index":1376,"t":{"192":{"position":[[2201,5]]},"234":{"position":[[810,6]]},"236":{"position":[[207,6]]}}}],["cp",{"_index":2043,"t":{"344":{"position":[[736,2],[982,2]]}}}],["crash",{"_index":943,"t":{"98":{"position":[[211,7]]}}}],["creat",{"_index":188,"t":{"6":{"position":[[55,8]]},"35":{"position":[[68,6],[148,6],[260,6]]},"39":{"position":[[74,6],[181,6]]},"43":{"position":[[76,6],[202,6]]},"47":{"position":[[439,6]]},"51":{"position":[[60,6],[657,6]]},"58":{"position":[[70,6],[739,6]]},"60":{"position":[[9,6],[167,6]]},"118":{"position":[[161,6]]},"120":{"position":[[148,6],[237,6]]},"126":{"position":[[139,6],[246,6]]},"130":{"position":[[39,6],[238,6],[294,7]]},"132":{"position":[[158,6],[257,6]]},"140":{"position":[[175,6],[301,6]]},"144":{"position":[[43,6]]},"170":{"position":[[35,6]]},"176":{"position":[[542,6],[750,6],[1470,6],[2546,6]]},"184":{"position":[[42,6]]},"208":{"position":[[1799,7],[1833,6],[2141,6],[2438,6],[2458,7]]},"247":{"position":[[1524,7]]},"267":{"position":[[267,8]]},"323":{"position":[[435,8]]},"335":{"position":[[52,8]]},"340":{"position":[[8,6],[129,6],[634,7],[1888,6]]},"342":{"position":[[9,6]]},"344":{"position":[[1059,6]]},"346":{"position":[[12,6]]},"404":{"position":[[150,6]]},"406":{"position":[[0,6],[207,8]]},"414":{"position":[[0,6],[62,6]]},"416":{"position":[[290,8],[437,7],[554,6],[805,7],[887,8],[1650,6],[1687,6],[1751,8],[1861,8],[2467,7],[2666,8],[2906,6],[3501,6]]},"418":{"position":[[506,8],[1008,8],[1151,8],[1293,8],[1431,8],[1530,7]]},"420":{"position":[[239,8]]},"422":{"position":[[225,8],[368,8],[510,8],[648,8],[747,7]]},"424":{"position":[[626,6],[764,7],[1144,7],[1319,6],[1431,6],[2050,7]]},"426":{"position":[[184,7]]},"446":{"position":[[70,8]]}}}],["creation",{"_index":2419,"t":{"416":{"position":[[3436,8],[3715,9]]},"424":{"position":[[1027,8]]}}}],["credenti",{"_index":1274,"t":{"176":{"position":[[2027,12]]},"180":{"position":[[282,12]]},"208":{"position":[[1555,11],[2129,11],[2148,11],[4579,11],[4705,11]]},"327":{"position":[[294,12]]},"329":{"position":[[1329,11],[3235,11]]},"394":{"position":[[1698,12]]},"430":{"position":[[1066,11]]}}}],["criteria",{"_index":1738,"t":{"251":{"position":[[1141,9]]}}}],["critic",{"_index":1003,"t":{"98":{"position":[[3175,8]]}}}],["crosbi",{"_index":1883,"t":{"314":{"position":[[148,8]]}}}],["cross",{"_index":2310,"t":{"394":{"position":[[0,5]]}}}],["ctrl+shift+i",{"_index":909,"t":{"92":{"position":[[583,12]]}}}],["current",{"_index":463,"t":{"33":{"position":[[31,9]]},"76":{"position":[[815,7]]},"84":{"position":[[21,9]]},"98":{"position":[[1627,7]]},"226":{"position":[[137,9],[746,7]]},"230":{"position":[[560,7]]},"337":{"position":[[578,7]]},"340":{"position":[[2112,7]]},"350":{"position":[[397,10],[1889,9],[2670,9]]},"394":{"position":[[3429,7]]},"400":{"position":[[338,7]]},"426":{"position":[[466,7]]},"430":{"position":[[2288,7]]},"453":{"position":[[0,10]]}}}],["custom",{"_index":478,"t":{"33":{"position":[[922,9]]},"65":{"position":[[949,6]]},"82":{"position":[[323,10]]},"86":{"position":[[618,6]]},"134":{"position":[[745,6]]},"204":{"position":[[451,6]]},"208":{"position":[[2886,6],[3353,8],[3435,6],[3721,6]]},"210":{"position":[[260,6]]},"226":{"position":[[1152,10]]},"376":{"position":[[402,6]]}}}],["cwd/build",{"_index":2189,"t":{"364":{"position":[[473,11]]}}}],["d",{"_index":565,"t":{"47":{"position":[[323,1]]},"98":{"position":[[1236,1]]},"424":{"position":[[507,1]]},"426":{"position":[[249,1]]},"455":{"position":[[303,1]]}}}],["d3df",{"_index":1621,"t":{"230":{"position":[[1017,4]]}}}],["daemon",{"_index":784,"t":{"73":{"position":[[599,7]]},"98":{"position":[[1044,6],[1256,6]]},"160":{"position":[[455,7]]},"408":{"position":[[34,6]]},"430":{"position":[[308,7]]}}}],["daemon/socket",{"_index":980,"t":{"98":{"position":[[1390,13]]}}}],["daemon/socket:/var/run/avahi",{"_index":979,"t":{"98":{"position":[[1361,28]]}}}],["dashboard",{"_index":369,"t":{"18":{"position":[[23,9]]},"31":{"position":[[270,10]]},"33":{"position":[[686,9]]},"35":{"position":[[198,9],[541,9],[620,9],[1613,9]]},"53":{"position":[[216,9]]},"56":{"position":[[654,9]]},"80":{"position":[[525,9]]},"84":{"position":[[407,9]]},"86":{"position":[[1091,9]]},"130":{"position":[[141,9]]},"176":{"position":[[726,9],[4276,9]]},"208":{"position":[[3097,9],[4254,9],[5080,10],[5172,9],[5304,11],[5390,9]]},"319":{"position":[[359,10]]},"355":{"position":[[3155,9]]},"376":{"position":[[533,10]]},"394":{"position":[[1037,9],[1075,9],[2128,9],[2647,9],[2747,9]]},"412":{"position":[[136,9],[526,9]]},"416":{"position":[[1116,9],[4004,9]]},"424":{"position":[[1369,9],[1708,9],[1787,9],[2321,9]]},"426":{"position":[[418,9]]}}}],["data",{"_index":117,"t":{"4":{"position":[[2600,7],[4494,7],[4728,7]]},"8":{"position":[[165,4],[577,7],[1013,7]]},"14":{"position":[[60,4],[274,4],[363,4],[447,4],[1204,4]]},"33":{"position":[[1082,7]]},"37":{"position":[[300,7],[591,7]]},"41":{"position":[[517,7],[867,7]]},"45":{"position":[[338,7],[649,7]]},"49":{"position":[[262,7],[523,7]]},"51":{"position":[[288,5],[299,4],[358,4],[381,4],[473,4],[757,4],[797,4],[855,4],[1012,4],[1072,4],[1540,4],[1613,4]]},"56":{"position":[[757,7],[1023,7]]},"58":{"position":[[239,4],[370,5],[381,4],[440,4],[463,4],[555,4],[839,4],[879,4],[937,4],[1090,4],[1606,4]]},"63":{"position":[[884,7],[1135,7]]},"67":{"position":[[991,7],[1247,7],[1493,7],[1749,7],[1919,7],[2276,7],[2512,7],[2723,7],[2892,7],[3127,7],[3218,7],[3336,7],[3454,7],[3569,7]]},"69":{"position":[[155,7],[290,7],[425,7],[596,7],[750,7],[910,7],[1067,7],[1284,7],[1527,7],[1612,7],[1712,7],[1812,7],[1935,7]]},"71":{"position":[[14,4]]},"76":{"position":[[133,4],[265,4],[381,4],[540,4],[725,4],[1275,4]]},"80":{"position":[[272,7]]},"82":{"position":[[396,7]]},"84":{"position":[[681,7]]},"86":{"position":[[1346,7]]},"88":{"position":[[434,7],[718,7]]},"90":{"position":[[61,4]]},"94":{"position":[[209,7],[512,7]]},"96":{"position":[[315,7]]},"98":{"position":[[435,4],[510,4],[2333,7],[2865,7],[3524,7]]},"100":{"position":[[686,7],[929,7]]},"102":{"position":[[370,4],[1339,7]]},"104":{"position":[[163,7],[360,7]]},"110":{"position":[[368,7],[603,7]]},"116":{"position":[[291,7],[548,7]]},"118":{"position":[[719,7],[1010,7]]},"124":{"position":[[370,7],[556,7]]},"126":{"position":[[356,4]]},"128":{"position":[[357,7],[707,7]]},"130":{"position":[[2205,7],[2843,7]]},"138":{"position":[[447,7],[634,7]]},"142":{"position":[[376,7],[687,7]]},"146":{"position":[[356,7],[617,7]]},"152":{"position":[[188,4],[305,5]]},"154":{"position":[[120,7],[373,7]]},"158":{"position":[[194,7],[460,7]]},"162":{"position":[[417,7],[645,7]]},"166":{"position":[[262,7],[512,7]]},"168":{"position":[[2326,7],[2874,7]]},"172":{"position":[[117,5]]},"174":{"position":[[532,7],[798,7]]},"176":{"position":[[3571,4]]},"178":{"position":[[303,7],[655,7]]},"182":{"position":[[256,7],[548,7]]},"184":{"position":[[211,4]]},"186":{"position":[[117,5]]},"190":{"position":[[662,4],[884,7],[1093,7],[1323,7],[1788,7],[2103,7]]},"192":{"position":[[1626,7],[1868,4],[2390,7]]},"194":{"position":[[195,7],[412,7]]},"198":{"position":[[234,7],[318,7]]},"202":{"position":[[407,7],[628,7]]},"206":{"position":[[200,7],[395,7]]},"208":{"position":[[1005,4],[1078,7],[2625,7],[3854,7]]},"210":{"position":[[443,7],[800,7]]},"212":{"position":[[64,4],[260,4],[506,4],[780,4],[834,4]]},"216":{"position":[[68,4],[85,4],[108,4],[444,7]]},"218":{"position":[[38,4],[103,4],[198,4],[276,4],[341,4],[433,4],[564,4],[611,4],[888,4],[1221,5]]},"220":{"position":[[119,5],[374,4],[451,4],[491,4],[626,4],[702,4]]},"222":{"position":[[311,4],[343,4],[815,7],[1496,7],[1674,7],[2300,7]]},"224":{"position":[[107,4],[1011,4],[1202,5]]},"226":{"position":[[224,5],[525,4]]},"228":{"position":[[289,5],[1537,4]]},"230":{"position":[[378,7]]},"234":{"position":[[40,4],[202,5],[268,5],[598,4],[1021,4],[1158,4],[1201,4]]},"236":{"position":[[418,4]]},"238":{"position":[[62,4],[105,4]]},"241":{"position":[[151,4],[285,7],[854,7]]},"243":{"position":[[205,7]]},"245":{"position":[[68,4],[453,4]]},"249":{"position":[[176,4]]},"251":{"position":[[45,4],[68,4],[190,4],[307,4],[498,4],[730,4],[780,4],[976,4],[1025,4],[1352,4],[1538,4],[1591,5],[1640,4],[2378,4],[2796,4],[3359,5],[3819,4],[4558,4],[4973,4],[5295,4]]},"256":{"position":[[246,4]]},"261":{"position":[[238,4],[345,4]]},"263":{"position":[[192,4],[242,4],[476,4]]},"265":{"position":[[37,4],[305,4],[368,5],[422,7]]},"267":{"position":[[605,7]]},"270":{"position":[[105,7],[241,7]]},"272":{"position":[[193,7],[513,7]]},"274":{"position":[[33,4],[382,7],[576,7]]},"276":{"position":[[290,7],[611,7]]},"278":{"position":[[101,5],[176,5],[209,5],[312,4]]},"280":{"position":[[637,7]]},"284":{"position":[[123,7]]},"301":{"position":[[91,5],[155,4],[699,5]]},"303":{"position":[[1144,4],[1298,4]]},"305":{"position":[[68,4]]},"307":{"position":[[305,7]]},"312":{"position":[[371,7]]},"314":{"position":[[270,7]]},"316":{"position":[[303,7]]},"327":{"position":[[190,6],[223,4],[237,4]]},"329":{"position":[[785,5],[870,4],[1264,4],[2455,4],[2553,4],[2686,4]]},"331":{"position":[[31,4],[94,4],[146,4],[303,4],[636,4]]},"337":{"position":[[1057,4]]},"340":{"position":[[364,4],[383,4],[939,5],[2031,4]]},"344":{"position":[[976,5]]},"346":{"position":[[68,4],[572,4],[764,5]]},"348":{"position":[[82,5],[117,4]]},"350":{"position":[[1225,4],[1927,4],[2229,4],[2290,4]]},"355":{"position":[[116,4],[204,4],[1796,4],[2541,4],[2641,4]]},"372":{"position":[[823,4]]},"384":{"position":[[65,4],[554,4]]},"390":{"position":[[219,4],[1562,7],[2397,7]]},"400":{"position":[[1006,7],[1175,7]]},"412":{"position":[[217,4]]},"414":{"position":[[48,4]]},"416":{"position":[[3677,4],[3808,7]]},"418":{"position":[[100,5],[136,5],[1755,7]]},"422":{"position":[[972,7]]},"430":{"position":[[591,4],[1589,4],[1932,4],[2011,4],[2361,4]]},"434":{"position":[[14,4],[292,4]]},"436":{"position":[[213,4]]}}}],["data.baseurl",{"_index":1938,"t":{"329":{"position":[[1179,13]]}}}],["databas",{"_index":1560,"t":{"220":{"position":[[400,8]]},"234":{"position":[[66,9],[619,8],[801,8]]},"236":{"position":[[16,8],[198,8]]},"251":{"position":[[859,8],[1309,8]]},"394":{"position":[[498,8]]},"396":{"position":[[1079,8]]},"414":{"position":[[277,8]]},"430":{"position":[[659,8],[1982,8]]},"453":{"position":[[45,9]]}}}],["datatyp",{"_index":589,"t":{"51":{"position":[[453,9]]},"58":{"position":[[535,9]]}}}],["date",{"_index":1964,"t":{"331":{"position":[[227,4]]},"376":{"position":[[738,4]]}}}],["datetim",{"_index":1532,"t":{"214":{"position":[[336,9],[717,9]]}}}],["dayj",{"_index":2062,"t":{"346":{"position":[[186,5],[197,8]]}}}],["dayjs(playedat",{"_index":2075,"t":{"346":{"position":[[916,15]]}}}],["dbu",{"_index":1194,"t":{"160":{"position":[[450,4],[939,4],[1350,4],[1503,4],[1548,4]]}}}],["dbus_session_bus_address=tcp:host=yourhostip,port=6644",{"_index":1217,"t":{"160":{"position":[[1726,54]]}}}],["dbus_session_bus_address=unix:path=/run/user/uid/bu",{"_index":1204,"t":{"160":{"position":[[1172,52]]}}}],["dead",{"_index":457,"t":{"31":{"position":[[281,4]]}}}],["debian",{"_index":2380,"t":{"404":{"position":[[116,7]]}}}],["debug",{"_index":357,"t":{"16":{"position":[[11,5],[60,11],[121,5],[279,5],[412,5]]},"98":{"position":[[370,5],[3444,5]]},"130":{"position":[[2672,7],[3292,7]]},"168":{"position":[[2658,8],[3206,8]]},"192":{"position":[[1837,5]]},"230":{"position":[[660,5]]},"267":{"position":[[170,5],[365,6]]},"372":{"position":[[979,5],[1422,5],[1452,5],[2443,9]]}}}],["debug_mode=tru",{"_index":368,"t":{"16":{"position":[[531,15]]},"230":{"position":[[250,15]]},"372":{"position":[[1524,16]]},"390":{"position":[[1650,15]]}}}],["debugmod",{"_index":141,"t":{"4":{"position":[[4059,12]]},"16":{"position":[[470,12]]}}}],["decid",{"_index":1421,"t":{"208":{"position":[[163,7]]}}}],["declar",{"_index":2025,"t":{"342":{"position":[[567,7]]}}}],["decod",{"_index":1312,"t":{"180":{"position":[[303,9]]}}}],["deezer",{"_index":774,"t":{"73":{"position":[[129,6]]},"90":{"position":[[54,6],[112,6],[279,6]]},"92":{"position":[[33,6],[217,7]]},"94":{"position":[[663,8]]},"96":{"position":[[30,6],[55,6],[161,6]]},"430":{"position":[[145,6]]}}}],["deezer'",{"_index":883,"t":{"90":{"position":[[98,8]]},"92":{"position":[[144,8]]}}}],["deezer.com",{"_index":897,"t":{"92":{"position":[[306,11],[470,11],[567,11],[689,10]]}}}],["deezer.json",{"_index":928,"t":{"96":{"position":[[259,11],[279,11]]}}}],["deezer_arl",{"_index":916,"t":{"94":{"position":[[66,10]]}}}],["deezerarl",{"_index":918,"t":{"94":{"position":[[165,12],[468,12]]}}}],["default",{"_index":69,"t":{"4":{"position":[[1258,8],[2918,8],[3462,8],[3531,7]]},"12":{"position":[[41,7],[138,7]]},"14":{"position":[[433,8],[826,7],[883,7],[1190,8],[1583,7],[1640,7],[1998,8],[2207,7],[2264,7],[2760,7],[3607,7]]},"33":{"position":[[161,7],[768,7]]},"37":{"position":[[62,7]]},"41":{"position":[[62,7]]},"45":{"position":[[62,7]]},"49":{"position":[[62,7]]},"51":{"position":[[1081,7]]},"56":{"position":[[481,7]]},"58":{"position":[[1155,7]]},"63":{"position":[[619,7]]},"67":{"position":[[79,7],[217,7],[381,7],[592,7],[756,7],[1125,7]]},"80":{"position":[[358,7]]},"82":{"position":[[246,7]]},"84":{"position":[[535,7]]},"86":{"position":[[1200,7],[1532,7],[1864,8],[1945,7]]},"88":{"position":[[46,7]]},"94":{"position":[[46,7]]},"98":{"position":[[1908,8],[2442,8],[3029,8]]},"100":{"position":[[141,7]]},"102":{"position":[[659,8]]},"104":{"position":[[46,7]]},"108":{"position":[[176,7],[281,7]]},"110":{"position":[[61,7]]},"114":{"position":[[174,7],[277,7]]},"116":{"position":[[61,7]]},"124":{"position":[[62,7]]},"130":{"position":[[524,8],[536,10],[1244,7]]},"138":{"position":[[62,7]]},"148":{"position":[[531,7],[634,7]]},"158":{"position":[[62,7]]},"162":{"position":[[62,7]]},"164":{"position":[[405,7]]},"166":{"position":[[62,7]]},"168":{"position":[[112,8],[184,8],[551,7],[695,9],[1061,9],[1360,8],[1372,7],[1608,7]]},"178":{"position":[[62,7]]},"182":{"position":[[62,7]]},"194":{"position":[[62,7]]},"202":{"position":[[62,7]]},"204":{"position":[[378,7]]},"206":{"position":[[62,7]]},"210":{"position":[[62,7]]},"222":{"position":[[222,8],[252,7],[559,11],[576,7],[655,7],[1076,7],[1204,11],[1319,11],[1825,7],[2044,11],[2061,7],[2140,7],[2447,10]]},"226":{"position":[[257,8],[334,8],[465,8],[602,7],[874,7]]},"241":{"position":[[918,7]]},"243":{"position":[[106,9],[266,11]]},"247":{"position":[[262,8],[460,7],[481,9],[591,7],[1541,8]]},"249":{"position":[[84,7]]},"251":{"position":[[356,9],[443,8],[558,11],[2604,11],[4005,11],[4712,11],[5861,11]]},"254":{"position":[[195,7]]},"256":{"position":[[1932,11]]},"258":{"position":[[1066,8]]},"261":{"position":[[813,8]]},"272":{"position":[[35,7],[256,11]]},"274":{"position":[[445,11],[492,8]]},"276":{"position":[[43,8],[91,7],[353,11]]},"280":{"position":[[94,7],[160,9],[257,11],[344,7],[753,7]]},"303":{"position":[[174,7],[327,9],[619,8],[1045,8]]},"305":{"position":[[431,8]]},"307":{"position":[[131,8],[423,7]]},"309":{"position":[[4,7]]},"312":{"position":[[115,11],[132,7],[211,7]]},"314":{"position":[[115,11]]},"316":{"position":[[221,7]]},"329":{"position":[[2140,8],[2242,8]]},"337":{"position":[[648,7]]},"342":{"position":[[446,7]]},"344":{"position":[[382,7],[1016,8],[1172,9],[1440,8]]},"346":{"position":[[343,7]]},"348":{"position":[[261,7],[364,7],[1624,7],[2262,7]]},"350":{"position":[[1691,7]]},"353":{"position":[[446,7]]},"355":{"position":[[889,7],[2808,7],[3480,7]]},"368":{"position":[[31,8]]},"394":{"position":[[2045,8],[2205,7]]}}}],["default/exampl",{"_index":2242,"t":{"374":{"position":[[372,15]]}}}],["defaultconfigurea",{"_index":2050,"t":{"344":{"position":[[956,19]]}}}],["defaults/filt",{"_index":2416,"t":{"416":{"position":[[2975,18]]}}}],["defin",{"_index":255,"t":{"12":{"position":[[0,7]]},"14":{"position":[[2671,7]]},"33":{"position":[[1166,6]]},"51":{"position":[[435,7]]},"58":{"position":[[517,7]]},"100":{"position":[[233,6]]},"108":{"position":[[377,6]]},"114":{"position":[[373,6]]},"126":{"position":[[437,7]]},"148":{"position":[[730,6]]},"168":{"position":[[748,7]]},"180":{"position":[[711,7]]},"198":{"position":[[621,8]]},"202":{"position":[[141,6]]},"218":{"position":[[1127,6]]},"220":{"position":[[183,6]]},"222":{"position":[[243,8],[926,8],[1053,6]]},"226":{"position":[[726,7]]},"241":{"position":[[501,7],[582,6],[650,7]]},"251":{"position":[[294,6]]},"280":{"position":[[395,6]]},"307":{"position":[[36,6]]},"329":{"position":[[72,7]]},"348":{"position":[[975,10],[1130,10]]},"364":{"position":[[456,7]]},"394":{"position":[[2542,7]]}}}],["definit",{"_index":814,"t":{"76":{"position":[[1166,12]]}}}],["degre",{"_index":2111,"t":{"350":{"position":[[468,7]]}}}],["delay",{"_index":707,"t":{"67":{"position":[[395,5],[770,5]]}}}],["delet",{"_index":1460,"t":{"208":{"position":[[2042,6]]},"364":{"position":[[307,6]]},"366":{"position":[[194,7]]}}}],["delim",{"_index":1857,"t":{"297":{"position":[[322,5],[408,13],[593,11]]}}}],["delim>\\\\s*\\\\/\\\\",{"_index":1862,"t":{"297":{"position":[[691,34]]}}}],["delim>\\\\s*\\\\\\\\\\",{"_index":1860,"t":{"297":{"position":[[489,21]]}}}],["delimit",{"_index":1010,"t":{"100":{"position":[[320,9],[431,9],[511,9],[614,9]]},"162":{"position":[[192,9],[269,9]]},"202":{"position":[[231,9],[320,9]]},"222":{"position":[[584,10],[629,13],[663,10],[1218,13],[2069,10],[2114,13],[2148,10]]},"247":{"position":[[299,9]]},"251":{"position":[[3262,10],[4113,9],[4509,10]]},"297":{"position":[[59,9],[232,9],[351,9]]},"301":{"position":[[297,10],[404,10],[468,9]]},"303":{"position":[[118,10],[196,10],[263,10],[300,10]]},"312":{"position":[[140,10],[185,13],[219,10]]},"416":{"position":[[2828,9]]}}}],["delimitersextra",{"_index":1871,"t":{"303":{"position":[[46,15]]}}}],["demon",{"_index":1611,"t":{"230":{"position":[[793,6]]}}}],["deni",{"_index":1345,"t":{"190":{"position":[[999,4]]},"256":{"position":[[1247,4]]},"263":{"position":[[45,4]]}}}],["depend",{"_index":985,"t":{"98":{"position":[[1698,9]]},"323":{"position":[[188,12]]},"329":{"position":[[1653,7]]},"350":{"position":[[488,9]]},"453":{"position":[[58,12]]}}}],["deploy",{"_index":1712,"t":{"247":{"position":[[1278,6]]},"309":{"position":[[527,6]]}}}],["deriv",{"_index":2117,"t":{"350":{"position":[[1178,8]]}}}],["describ",{"_index":193,"t":{"6":{"position":[[283,9]]},"24":{"position":[[516,9]]},"35":{"position":[[772,8]]},"325":{"position":[[216,10]]},"329":{"position":[[420,10]]},"335":{"position":[[100,10]]}}}],["descript",{"_index":315,"t":{"14":{"position":[[891,11],[1648,11],[2272,11],[2768,11],[3615,11]]},"37":{"position":[[70,11]]},"41":{"position":[[70,11]]},"45":{"position":[[70,11]]},"49":{"position":[[70,11]]},"56":{"position":[[489,11]]},"63":{"position":[[627,11]]},"88":{"position":[[54,11]]},"94":{"position":[[54,11]]},"100":{"position":[[149,11]]},"104":{"position":[[54,11]]},"110":{"position":[[69,11]]},"116":{"position":[[69,11]]},"124":{"position":[[70,11]]},"130":{"position":[[1252,11]]},"138":{"position":[[70,11]]},"158":{"position":[[70,11]]},"162":{"position":[[70,11]]},"166":{"position":[[70,11]]},"168":{"position":[[1616,11]]},"178":{"position":[[70,11]]},"182":{"position":[[70,11]]},"194":{"position":[[70,11]]},"202":{"position":[[70,11]]},"206":{"position":[[70,11]]},"210":{"position":[[70,11]]}}}],["description=multi",{"_index":2388,"t":{"406":{"position":[[248,17]]}}}],["design",{"_index":611,"t":{"51":{"position":[[1355,6]]},"196":{"position":[[540,8]]}}}],["desir",{"_index":1819,"t":{"263":{"position":[[148,7]]}}}],["desired/allow",{"_index":1729,"t":{"249":{"position":[[340,15]]}}}],["desktop",{"_index":1097,"t":{"130":{"position":[[93,7]]},"390":{"position":[[2741,9],[2825,7]]},"430":{"position":[[329,8]]},"434":{"position":[[108,7]]}}}],["destin",{"_index":771,"t":{"73":{"position":[[56,11]]}}}],["detail",{"_index":946,"t":{"98":{"position":[[331,8]]},"208":{"position":[[374,8],[412,7]]},"297":{"position":[[0,7]]},"390":{"position":[[2594,6],[2624,8]]},"400":{"position":[[690,7]]},"430":{"position":[[954,8]]},"448":{"position":[[0,8]]},"453":{"position":[[353,8]]}}}],["detect",{"_index":504,"t":{"35":{"position":[[999,8]]},"96":{"position":[[477,6]]},"130":{"position":[[1042,7],[1111,8]]},"208":{"position":[[431,9]]},"390":{"position":[[7,7],[731,8],[1259,9],[1435,10]]}}}],["determin",{"_index":467,"t":{"33":{"position":[[248,11],[1271,10]]},"35":{"position":[[471,9]]},"76":{"position":[[574,9]]},"82":{"position":[[67,9]]},"84":{"position":[[159,9]]},"102":{"position":[[552,9],[838,9]]},"176":{"position":[[133,9],[769,9]]},"224":{"position":[[1113,9]]},"329":{"position":[[1955,10]]},"344":{"position":[[40,10]]},"350":{"position":[[863,9],[1439,9]]},"355":{"position":[[92,11],[339,13],[1861,10],[2275,10]]},"372":{"position":[[1813,9]]},"374":{"position":[[444,9]]},"390":{"position":[[70,9],[339,9]]},"424":{"position":[[1638,9]]}}}],["devcontain",{"_index":1899,"t":{"321":{"position":[[111,13],[399,12]]},"323":{"position":[[150,12],[278,12],[337,13]]}}}],["develop",{"_index":635,"t":{"53":{"position":[[206,9]]},"56":{"position":[[644,9]]},"58":{"position":[[1345,12]]},"92":{"position":[[340,9],[604,9]]},"176":{"position":[[675,9],[716,9],[3487,9]]},"208":{"position":[[1484,9]]},"321":{"position":[[0,11]]},"323":{"position":[[48,11],[167,11]]},"333":{"position":[[7,11],[39,11]]},"335":{"position":[[243,12]]},"337":{"position":[[12,9]]},"340":{"position":[[422,11]]},"448":{"position":[[26,11]]}}}],["devic",{"_index":815,"t":{"78":{"position":[[65,6],[186,7]]},"98":{"position":[[14,6],[461,6],[729,8],[743,7],[1589,7],[1778,6]]},"100":{"position":[[44,6],[305,8],[416,8]]},"130":{"position":[[1838,7],[1913,7]]},"168":{"position":[[1963,7],[2034,7]]},"204":{"position":[[424,6]]},"206":{"position":[[110,6]]},"384":{"position":[[100,7],[581,6]]},"386":{"position":[[41,6]]}}}],["device/receiv",{"_index":1410,"t":{"204":{"position":[[18,16]]}}}],["device/us",{"_index":770,"t":{"73":{"position":[[35,11]]},"331":{"position":[[444,11]]}}}],["device_info=chxoeku0tmpjek5ewtbprgd3tlrbmk16qxpndz09ejbs8z0ggjbs8z0g",{"_index":752,"t":{"67":{"position":[[2967,69]]},"69":{"position":[[1359,69]]}}}],["devicesallow",{"_index":1120,"t":{"130":{"position":[[2416,15],[3027,15]]},"168":{"position":[[2468,15],[3016,15]]}}}],["devicesblock",{"_index":1121,"t":{"130":{"position":[[2445,15],[3058,15]]},"168":{"position":[[2499,15],[3047,15]]}}}],["devot",{"_index":1671,"t":{"234":{"position":[[1296,6]]},"238":{"position":[[200,6]]}}}],["diagnos",{"_index":1004,"t":{"98":{"position":[[3187,10],[3209,8],[3365,8]]},"267":{"position":[[189,8]]},"384":{"position":[[393,8]]}}}],["did/handl",{"_index":1337,"t":{"190":{"position":[[638,10]]}}}],["did:plc",{"_index":673,"t":{"63":{"position":[[94,11]]}}}],["did:web",{"_index":674,"t":{"63":{"position":[[109,11]]}}}],["diff",{"_index":1602,"t":{"230":{"position":[[13,4],[501,4],[615,4],[750,4]]},"267":{"position":[[433,4]]}}}],["differ",{"_index":582,"t":{"51":{"position":[[230,9],[1179,9]]},"58":{"position":[[312,9],[1253,9]]},"118":{"position":[[250,10]]},"122":{"position":[[269,9]]},"126":{"position":[[396,10]]},"134":{"position":[[584,9]]},"144":{"position":[[134,10]]},"174":{"position":[[67,10]]},"188":{"position":[[67,11]]},"212":{"position":[[164,9],[645,9]]},"218":{"position":[[1049,9]]},"224":{"position":[[79,9],[718,9]]},"329":{"position":[[80,9]]},"384":{"position":[[218,11]]},"392":{"position":[[12,10]]},"394":{"position":[[2599,9]]},"396":{"position":[[179,9]]}}}],["dir=/home/youruser/multi",{"_index":2207,"t":{"366":{"position":[[856,24]]}}}],["direct",{"_index":2412,"t":{"416":{"position":[[2360,10]]},"418":{"position":[[843,10]]},"422":{"position":[[60,10]]}}}],["directli",{"_index":1195,"t":{"160":{"position":[[531,8]]},"168":{"position":[[318,8]]},"430":{"position":[[1376,8]]}}}],["directori",{"_index":66,"t":{"4":{"position":[[1182,9],[2003,9],[2154,9],[2437,9],[2842,9],[3668,9],[3779,9]]},"14":{"position":[[682,9],[1439,9],[2647,9],[2860,10]]},"321":{"position":[[245,9]]},"364":{"position":[[223,9],[390,9]]},"366":{"position":[[244,12],[707,9]]},"394":{"position":[[1638,9],[3262,9]]},"396":{"position":[[236,9],[267,9]]},"400":{"position":[[66,9]]},"412":{"position":[[240,9]]},"416":{"position":[[3553,9]]},"426":{"position":[[144,9]]}}}],["dirti",{"_index":1514,"t":{"212":{"position":[[386,5]]}}}],["disabl",{"_index":377,"t":{"18":{"position":[[172,9],[267,9],[277,7]]},"33":{"position":[[324,8],[1118,7]]}}}],["disable_web=tru",{"_index":380,"t":{"18":{"position":[[303,16]]}}}],["disablediscoveri",{"_index":1189,"t":{"158":{"position":[[275,19],[541,19]]}}}],["disableweb",{"_index":143,"t":{"4":{"position":[[4079,13]]},"18":{"position":[[366,13]]}}}],["disallow",{"_index":1113,"t":{"130":{"position":[[1766,8],[1924,8],[2099,8]]},"150":{"position":[[15,8]]},"168":{"position":[[1895,8],[2045,8],[2212,8]]}}}],["discov",{"_index":954,"t":{"98":{"position":[[826,10]]},"118":{"position":[[78,10]]},"140":{"position":[[85,10]]},"170":{"position":[[223,10]]},"184":{"position":[[302,10]]},"214":{"position":[[365,9],[510,10]]},"218":{"position":[[161,10]]},"350":{"position":[[821,12]]},"355":{"position":[[2019,8],[2379,12],[2462,10],[2721,10],[2959,10],[3043,11],[3180,11],[3241,10],[3576,11],[3800,10]]}}}],["discovered/scrobbl",{"_index":2440,"t":{"426":{"position":[[533,20]]}}}],["discoveri",{"_index":577,"t":{"51":{"position":[[116,9],[1485,9]]},"58":{"position":[[116,9]]},"98":{"position":[[854,10]]},"170":{"position":[[91,9]]},"184":{"position":[[88,9]]},"355":{"position":[[2215,10]]}}}],["display",{"_index":1464,"t":{"208":{"position":[[2362,9],[3247,10],[5410,7]]},"416":{"position":[[3490,10]]},"424":{"position":[[1044,9]]},"426":{"position":[[508,7]]}}}],["dissemin",{"_index":2166,"t":{"355":{"position":[[3344,12]]}}}],["distribut",{"_index":970,"t":{"98":{"position":[[1145,13]]}}}],["distro",{"_index":2377,"t":{"404":{"position":[[73,7]]}}}],["diverg",{"_index":1918,"t":{"325":{"position":[[468,9]]}}}],["dn",{"_index":964,"t":{"98":{"position":[[1090,3]]},"394":{"position":[[1359,3]]}}}],["doauthent",{"_index":1956,"t":{"329":{"position":[[2993,16]]},"348":{"position":[[2323,16]]}}}],["dobuildinitdata",{"_index":1935,"t":{"329":{"position":[[1012,15]]},"348":{"position":[[747,18]]}}}],["doc",{"_index":73,"t":{"4":{"position":[[1368,4],[3052,4]]},"8":{"position":[[1839,4]]},"35":{"position":[[767,4]]},"53":{"position":[[83,4]]},"168":{"position":[[505,5]]},"170":{"position":[[332,5]]},"172":{"position":[[54,4]]},"184":{"position":[[411,5]]},"186":{"position":[[54,4]]},"224":{"position":[[754,4]]},"232":{"position":[[40,4]]},"340":{"position":[[434,5]]},"416":{"position":[[687,5],[3013,4]]},"424":{"position":[[1920,4]]},"428":{"position":[[86,4],[116,4]]}}}],["docheckconnect",{"_index":1946,"t":{"329":{"position":[[1745,17]]},"348":{"position":[[1701,20]]}}}],["docker",{"_index":44,"t":{"4":{"position":[[652,6],[672,6],[759,6],[774,6],[1312,6],[2085,6],[2984,6],[3713,6]]},"8":{"position":[[785,6]]},"12":{"position":[[388,6]]},"14":{"position":[[608,6],[1365,6],[3160,6],[3182,6]]},"47":{"position":[[105,6],[304,6]]},"98":{"position":[[1004,6],[1297,6],[1480,6]]},"160":{"position":[[469,6],[681,6],[728,6],[1137,6]]},"176":{"position":[[2339,6],[2727,6]]},"230":{"position":[[578,6]]},"247":{"position":[[1271,6]]},"309":{"position":[[520,6]]},"394":{"position":[[252,6],[337,6],[727,6],[765,6],[826,6],[864,6],[1330,6],[1574,6],[1584,6],[1780,6],[1787,6],[1822,7],[1830,6],[1901,6],[1917,6],[2054,6],[2245,6],[2252,6],[2267,6],[2295,6],[2346,6],[2362,6],[2779,6],[2786,6],[2801,6],[2874,6],[2890,6],[3078,8],[3087,7],[3160,6],[3293,6]]},"396":{"position":[[49,6],[149,6],[285,6],[331,6],[338,6],[362,6],[693,6],[852,6],[918,6]]},"412":{"position":[[66,6],[77,6],[257,6]]},"414":{"position":[[69,6]]},"416":{"position":[[267,6],[864,6],[1838,6],[2177,6],[2225,6],[2643,6],[3591,6]]},"418":{"position":[[483,6],[985,6],[1128,6],[1270,6],[1408,6]]},"420":{"position":[[216,6]]},"422":{"position":[[202,6],[345,6],[487,6],[625,6]]},"424":{"position":[[289,6],[488,6],[741,6],[1121,6],[2027,6]]},"426":{"position":[[161,6],[230,6]]},"428":{"position":[[18,6]]},"430":{"position":[[1172,6]]},"453":{"position":[[513,6]]},"455":{"position":[[0,6],[7,6],[22,6],[70,6],[108,6],[144,6],[264,6],[284,6]]}}}],["docker.io/foxxmd/multi",{"_index":2317,"t":{"394":{"position":[[139,22]]}}}],["dockerhub",{"_index":2316,"t":{"394":{"position":[[97,9]]}}}],["docs.rocksky.app",{"_index":631,"t":{"53":{"position":[[91,16]]}}}],["docs:instal",{"_index":2360,"t":{"400":{"position":[[221,12]]}}}],["docsit",{"_index":2194,"t":{"366":{"position":[[236,7],[446,7]]}}}],["docsite/packag",{"_index":2202,"t":{"366":{"position":[[502,15]]}}}],["document",{"_index":836,"t":{"84":{"position":[[84,13]]},"325":{"position":[[13,9]]},"331":{"position":[[718,13]]},"335":{"position":[[5,8],[209,8]]},"372":{"position":[[1660,13]]},"388":{"position":[[92,14]]},"392":{"position":[[61,8]]},"410":{"position":[[31,8]]},"440":{"position":[[21,13]]},"442":{"position":[[22,13]]}}}],["doesn't",{"_index":693,"t":{"65":{"position":[[454,7]]}}}],["domain",{"_index":644,"t":{"56":{"position":[[227,7]]},"63":{"position":[[281,6],[318,7]]},"134":{"position":[[783,6]]},"176":{"position":[[1410,6],[1843,7],[1890,6],[2505,6],[3457,6]]},"190":{"position":[[134,6]]},"196":{"position":[[448,6]]},"208":{"position":[[2026,7],[3535,6]]},"372":{"position":[[1841,6]]}}}],["domain.tld",{"_index":1387,"t":{"196":{"position":[[319,13]]}}}],["domain/ip:port",{"_index":1413,"t":{"204":{"position":[[299,14]]}}}],["don't",{"_index":470,"t":{"33":{"position":[[421,5]]},"60":{"position":[[42,5]]},"162":{"position":[[137,5]]},"251":{"position":[[1561,5]]},"256":{"position":[[1982,5]]},"261":{"position":[[831,6]]}}}],["done",{"_index":310,"t":{"14":{"position":[[645,5],[1402,5]]},"35":{"position":[[137,4]]},"47":{"position":[[46,4]]},"51":{"position":[[621,4]]},"58":{"position":[[703,4]]},"112":{"position":[[107,4]]},"280":{"position":[[27,4],[143,4]]},"355":{"position":[[2136,4]]},"424":{"position":[[230,4],[1308,4]]},"426":{"position":[[258,5]]}}}],["dottransform",{"_index":1568,"t":{"222":{"position":[[1186,17],[1593,16]]}}}],["doubl",{"_index":914,"t":{"92":{"position":[[740,6]]}}}],["down",{"_index":792,"t":{"76":{"position":[[57,4]]},"390":{"position":[[1136,4]]}}}],["downstream",{"_index":1521,"t":{"212":{"position":[[844,10]]},"214":{"position":[[765,10]]},"218":{"position":[[462,10],[1210,10]]}}}],["dream",{"_index":1598,"t":{"228":{"position":[[589,8],[641,8],[767,8],[819,8]]}}}],["drink",{"_index":2289,"t":{"390":{"position":[[1898,8]]}}}],["driver",{"_index":348,"t":{"14":{"position":[[3338,7]]}}}],["drop",{"_index":2366,"t":{"400":{"position":[[508,4]]}}}],["due",{"_index":966,"t":{"98":{"position":[[1105,3]]},"192":{"position":[[2092,3]]},"196":{"position":[[384,3]]},"208":{"position":[[241,3],[4812,3]]},"212":{"position":[[318,3]]},"226":{"position":[[530,3]]},"234":{"position":[[961,3]]},"236":{"position":[[358,3]]},"329":{"position":[[227,3]]},"390":{"position":[[2248,3]]}}}],["dumpvlcmetadata",{"_index":1377,"t":{"192":{"position":[[2423,18]]}}}],["duplic",{"_index":329,"t":{"14":{"position":[[1940,9]]},"96":{"position":[[550,11]]},"212":{"position":[[698,9],[874,9]]},"355":{"position":[[2494,9],[4056,11]]},"390":{"position":[[885,9]]},"430":{"position":[[1729,11]]}}}],["durat",{"_index":150,"t":{"4":{"position":[[4218,11]]},"76":{"position":[[832,8]]},"82":{"position":[[187,10],[453,11]]},"86":{"position":[[138,8]]},"102":{"position":[[942,8]]},"176":{"position":[[427,8]]},"204":{"position":[[204,8]]},"224":{"position":[[506,11],[561,8]]},"228":{"position":[[1058,8]]},"251":{"position":[[150,8],[422,8]]},"331":{"position":[[213,9]]},"346":{"position":[[726,9],[851,9]]},"350":{"position":[[1410,8]]}}}],["dure",{"_index":1138,"t":{"136":{"position":[[80,6]]},"208":{"position":[[2817,6]]},"216":{"position":[[139,6]]},"256":{"position":[[2003,6]]},"329":{"position":[[2065,6]]},"400":{"position":[[285,6]]}}}],["e",{"_index":46,"t":{"4":{"position":[[684,1],[714,1]]},"348":{"position":[[1218,3],[1287,4],[2031,3],[2043,2],[2494,3],[2621,2]]},"350":{"position":[[2552,3],[2564,2]]},"353":{"position":[[1058,3],[1136,4]]},"394":{"position":[[2817,1]]},"396":{"position":[[397,1],[451,1],[488,1],[514,1],[542,1],[576,1],[601,1],[616,1],[728,1],[743,1],[758,1]]}}}],["e0cce74f",{"_index":1636,"t":{"230":{"position":[[1181,8]]}}}],["e4xwktm7jxm607x8el1fcda30eu14dzb64h3j",{"_index":1250,"t":{"174":{"position":[[549,40],[815,40]]}}}],["e90b20526808373353afad7fb98a201198c0c3e0555bea19f182df3388af7b17",{"_index":416,"t":{"22":{"position":[[1732,69]]}}}],["each",{"_index":76,"t":{"4":{"position":[[1483,4],[2299,4],[2376,4],[3166,4]]},"6":{"position":[[214,4]]},"12":{"position":[[448,4]]},"22":{"position":[[317,4]]},"51":{"position":[[418,4]]},"58":{"position":[[500,4]]},"65":{"position":[[73,4],[113,4]]},"84":{"position":[[70,4],[471,4]]},"86":{"position":[[1155,4]]},"190":{"position":[[760,4]]},"220":{"position":[[0,4],[456,4],[536,4]]},"222":{"position":[[105,4]]},"224":{"position":[[0,4],[697,4],[732,4],[809,5],[836,4]]},"228":{"position":[[39,4],[153,4]]},"230":{"position":[[333,4]]},"234":{"position":[[749,4]]},"236":{"position":[[146,4]]},"245":{"position":[[0,4]]},"247":{"position":[[883,4],[1044,4]]},"254":{"position":[[0,4]]},"256":{"position":[[1152,4],[1299,4]]},"258":{"position":[[0,4]]},"267":{"position":[[460,4]]},"284":{"position":[[0,4]]},"305":{"position":[[0,4]]},"309":{"position":[[138,4],[299,4]]},"329":{"position":[[434,4]]},"418":{"position":[[857,4]]},"422":{"position":[[74,4]]}}}],["earli",{"_index":1579,"t":{"226":{"position":[[79,6]]}}}],["earlier",{"_index":1546,"t":{"218":{"position":[[569,7]]},"390":{"position":[[1114,7]]},"416":{"position":[[2489,8]]},"424":{"position":[[792,8],[1172,8],[2078,8]]},"426":{"position":[[192,7]]}}}],["eas",{"_index":2451,"t":{"430":{"position":[[1712,4]]}}}],["easi",{"_index":1679,"t":{"234":{"position":[[1580,4]]},"256":{"position":[[258,4]]},"430":{"position":[[1118,4]]}}}],["easili",{"_index":2453,"t":{"430":{"position":[[1851,6]]}}}],["ec42e09d5ae0ee0f0816ca151008412a",{"_index":121,"t":{"4":{"position":[[2674,35],[4568,35]]},"8":{"position":[[1079,35]]},"41":{"position":[[583,35],[933,35]]},"128":{"position":[[423,35],[773,35]]},"178":{"position":[[377,35],[729,35]]}}}],["echo",{"_index":1265,"t":{"176":{"position":[[1364,4],[1369,4],[1864,4],[2691,5],[3438,4],[3884,4]]}}}],["echo.multi",{"_index":1266,"t":{"176":{"position":[[1379,10]]}}}],["echo:36",{"_index":1280,"t":{"176":{"position":[[2630,7],[2785,7],[3411,7]]}}}],["edit",{"_index":1360,"t":{"192":{"position":[[899,7]]},"208":{"position":[[3157,4]]},"234":{"position":[[790,6]]},"236":{"position":[[187,6]]}}}],["editor",{"_index":1654,"t":{"234":{"position":[[741,7]]},"236":{"position":[[138,7]]},"406":{"position":[[165,6]]}}}],["editor/valid",{"_index":523,"t":{"37":{"position":[[469,16],[779,16]]},"41":{"position":[[727,16],[1097,16]]},"45":{"position":[[511,16],[848,16]]},"49":{"position":[[382,16],[663,16]]},"56":{"position":[[898,16],[1185,16]]},"63":{"position":[[1019,16],[1290,16]]},"88":{"position":[[607,16],[893,16]]},"94":{"position":[[403,16],[725,16]]},"100":{"position":[[846,16],[1113,16]]},"104":{"position":[[262,16],[480,16]]},"110":{"position":[[494,16],[749,16]]},"116":{"position":[[441,16],[716,16]]},"118":{"position":[[888,16],[1198,16]]},"124":{"position":[[450,16],[661,16]]},"128":{"position":[[567,16],[937,16]]},"130":{"position":[[2733,16],[3375,16]]},"138":{"position":[[529,16],[740,16]]},"142":{"position":[[549,16],[886,16]]},"146":{"position":[[476,16],[757,16]]},"154":{"position":[[264,16],[537,16]]},"158":{"position":[[354,16],[637,16]]},"162":{"position":[[538,16],[785,16]]},"166":{"position":[[381,16],[633,16]]},"168":{"position":[[2749,16],[3315,16]]},"174":{"position":[[673,16],[960,16]]},"178":{"position":[[530,16],[903,16]]},"182":{"position":[[437,16],[751,16]]},"190":{"position":[[1981,16],[2316,16]]},"194":{"position":[[306,16],[540,16]]},"202":{"position":[[529,16],[776,16]]},"206":{"position":[[286,16],[504,16]]},"210":{"position":[[675,16],[1053,16]]}}}],["effect",{"_index":2267,"t":{"390":{"position":[[458,6]]}}}],["effort",{"_index":1672,"t":{"234":{"position":[[1303,6]]},"238":{"position":[[207,6]]}}}],["eleph",{"_index":1596,"t":{"228":{"position":[[506,9],[559,9],[684,9],[737,9],[1220,8],[1335,10],[1465,9],[1630,10]]},"287":{"position":[[102,9],[322,10]]}}}],["elimin",{"_index":935,"t":{"96":{"position":[[536,9]]},"258":{"position":[[470,9]]},"263":{"position":[[381,9],[522,10]]}}}],["elsewher",{"_index":251,"t":{"8":{"position":[[1906,9]]}}}],["email",{"_index":1683,"t":{"241":{"position":[[112,5]]},"418":{"position":[[548,5]]},"420":{"position":[[281,5]]}}}],["emit",{"_index":2164,"t":{"355":{"position":[[3287,4],[3633,4],[3729,5]]}}}],["emitt",{"_index":2027,"t":{"342":{"position":[[688,8],[757,9]]}}}],["empti",{"_index":740,"t":{"67":{"position":[[2223,6],[2459,6]]},"80":{"position":[[313,5]]},"208":{"position":[[2053,5],[4969,5]]},"256":{"position":[[1532,5]]},"280":{"position":[[477,5]]},"284":{"position":[[450,5]]},"366":{"position":[[205,5]]}}}],["emul",{"_index":2109,"t":{"350":{"position":[[246,8]]}}}],["enabl",{"_index":115,"t":{"4":{"position":[[2569,9],[3515,7],[4426,9],[4692,9]]},"16":{"position":[[40,6],[154,8]]},"33":{"position":[[169,7],[313,7],[1129,6]]},"41":{"position":[[476,9],[826,9]]},"45":{"position":[[297,9],[608,9]]},"49":{"position":[[221,9],[482,9]]},"86":{"position":[[292,7]]},"88":{"position":[[401,9],[685,9]]},"94":{"position":[[178,9],[481,9]]},"98":{"position":[[3393,6],[3437,6]]},"100":{"position":[[191,6]]},"102":{"position":[[1323,9]]},"104":{"position":[[147,9],[344,9]]},"106":{"position":[[91,8]]},"110":{"position":[[197,8],[262,8],[352,9],[587,9]]},"112":{"position":[[86,8]]},"116":{"position":[[275,9],[532,9]]},"120":{"position":[[12,7]]},"124":{"position":[[354,9],[540,9]]},"128":{"position":[[316,9],[666,9]]},"130":{"position":[[2174,9],[2812,9]]},"132":{"position":[[12,7]]},"138":{"position":[[431,9],[618,9]]},"142":{"position":[[335,9],[646,9]]},"146":{"position":[[315,9],[576,9]]},"148":{"position":[[301,7]]},"154":{"position":[[104,9],[357,9]]},"158":{"position":[[161,9],[427,9]]},"162":{"position":[[401,9],[629,9]]},"164":{"position":[[88,6],[359,8]]},"166":{"position":[[225,9],[475,9]]},"168":{"position":[[2295,9],[2843,9]]},"176":{"position":[[55,7],[1458,8]]},"178":{"position":[[272,9],[624,9]]},"182":{"position":[[240,9],[532,9]]},"192":{"position":[[63,6],[278,6],[1610,9],[2374,9]]},"194":{"position":[[162,9],[379,9]]},"202":{"position":[[112,6]]},"206":{"position":[[184,9],[379,9]]},"208":{"position":[[1045,9],[2592,9],[3821,9]]},"210":{"position":[[412,9],[769,9]]},"216":{"position":[[403,9]]},"230":{"position":[[233,7]]},"247":{"position":[[998,8]]},"251":{"position":[[3041,6],[4889,6],[5333,6]]},"267":{"position":[[141,6],[292,6],[472,6]]},"309":{"position":[[253,8]]},"384":{"position":[[424,6]]},"408":{"position":[[65,6],[219,6]]},"416":{"position":[[2375,8]]},"418":{"position":[[751,6],[802,7],[869,6]]},"422":{"position":[[19,7],[86,6]]}}}],["encount",{"_index":1002,"t":{"98":{"position":[[3152,11]]},"226":{"position":[[364,10]]},"400":{"position":[[308,9]]}}}],["end",{"_index":625,"t":{"51":{"position":[[1731,3]]},"176":{"position":[[161,4]]},"178":{"position":[[194,3]]},"198":{"position":[[92,3]]},"208":{"position":[[3620,3]]},"226":{"position":[[74,4]]},"258":{"position":[[650,6]]},"350":{"position":[[206,4]]},"412":{"position":[[100,3]]}}}],["endless",{"_index":1743,"t":{"251":{"position":[[1746,8],[1944,8],[3516,8],[3864,8],[4383,8],[4603,8]]},"301":{"position":[[744,8],[878,8]]}}}],["endors",{"_index":1420,"t":{"208":{"position":[[71,8]]}}}],["endpoint",{"_index":384,"t":{"20":{"position":[[64,8]]},"22":{"position":[[1507,9],[1714,9],[1823,9]]},"24":{"position":[[3,8]]},"39":{"position":[[198,10]]},"43":{"position":[[224,10]]},"73":{"position":[[401,10],[485,10]]},"102":{"position":[[1478,9]]},"122":{"position":[[237,8]]},"124":{"position":[[112,8]]},"126":{"position":[[263,10]]},"134":{"position":[[552,8]]},"136":{"position":[[224,9]]},"138":{"position":[[110,8]]},"140":{"position":[[323,10]]},"180":{"position":[[108,8],[423,10]]},"319":{"position":[[153,9]]},"327":{"position":[[332,10]]},"329":{"position":[[3191,8],[3339,8]]},"337":{"position":[[231,8],[325,9],[426,8],[509,8]]},"355":{"position":[[1409,9]]},"372":{"position":[[128,8],[1714,8]]},"394":{"position":[[2189,11]]},"416":{"position":[[1670,8],[1713,8],[1784,8]]},"430":{"position":[[228,10],[265,10],[760,8]]}}}],["endpointlfm",{"_index":1092,"t":{"124":{"position":[[594,13]]}}}],["endpointlz",{"_index":753,"t":{"67":{"position":[[3058,13]]},"138":{"position":[[674,12]]}}}],["enforc",{"_index":1916,"t":{"325":{"position":[[345,8]]},"327":{"position":[[73,8]]}}}],["enhanc",{"_index":326,"t":{"14":{"position":[[1871,7]]},"212":{"position":[[47,7]]},"220":{"position":[[87,9]]},"247":{"position":[[1838,8]]},"267":{"position":[[98,8],[247,12]]},"309":{"position":[[955,8]]},"428":{"position":[[385,12]]}}}],["enhance/correct",{"_index":2444,"t":{"430":{"position":[[566,15]]}}}],["enough",{"_index":1527,"t":{"214":{"position":[[149,6]]},"234":{"position":[[103,6]]},"251":{"position":[[5816,8]]},"256":{"position":[[1641,6]]},"261":{"position":[[182,6]]},"350":{"position":[[1476,6],[2719,6]]}}}],["ensur",{"_index":511,"t":{"35":{"position":[[1471,6]]},"112":{"position":[[197,6]]},"258":{"position":[[508,6],[561,6]]},"329":{"position":[[1856,6],[2527,6]]},"372":{"position":[[2242,6]]},"374":{"position":[[0,6]]},"376":{"position":[[199,6]]},"424":{"position":[[2179,6]]},"430":{"position":[[1994,6]]}}}],["enter",{"_index":1496,"t":{"208":{"position":[[5248,5]]},"376":{"position":[[285,8]]}}}],["entir",{"_index":1731,"t":{"251":{"position":[[210,6]]},"319":{"position":[[27,8]]},"372":{"position":[[2304,8]]}}}],["entri",{"_index":191,"t":{"6":{"position":[[219,5]]},"76":{"position":[[1313,5]]}}}],["env",{"_index":9,"t":{"4":{"position":[[56,5],[296,3],[452,3],[1850,4]]},"8":{"position":[[1184,3],[1366,4],[1674,3],[1796,3]]},"12":{"position":[[180,3]]},"14":{"position":[[842,3],[1599,3],[2223,3],[2577,3],[2711,3],[3558,3]]},"16":{"position":[[527,3]]},"18":{"position":[[299,3]]},"33":{"position":[[348,3]]},"37":{"position":[[0,3],[13,3]]},"41":{"position":[[0,3],[13,3]]},"45":{"position":[[0,3],[13,3]]},"49":{"position":[[0,3],[13,3]]},"56":{"position":[[419,3],[432,3]]},"63":{"position":[[557,3],[570,3]]},"80":{"position":[[460,3]]},"82":{"position":[[668,5]]},"88":{"position":[[0,3]]},"94":{"position":[[0,3]]},"100":{"position":[[0,3],[246,4]]},"104":{"position":[[0,3]]},"110":{"position":[[0,3],[13,3]]},"116":{"position":[[0,3],[13,3]]},"118":{"position":[[308,3],[387,3],[400,3],[436,3],[516,4]]},"124":{"position":[[0,3],[13,3],[214,4]]},"128":{"position":[[0,3],[13,3],[49,3],[133,4]]},"130":{"position":[[1198,3]]},"134":{"position":[[426,4]]},"138":{"position":[[0,3],[13,3],[212,4]]},"142":{"position":[[0,3],[13,3],[49,3],[143,4]]},"144":{"position":[[192,3]]},"146":{"position":[[0,3],[13,3],[49,3],[131,4]]},"154":{"position":[[0,3],[13,3],[32,3]]},"158":{"position":[[0,3],[13,3]]},"160":{"position":[[1000,4],[1720,5]]},"162":{"position":[[0,3],[13,3]]},"166":{"position":[[0,3],[13,3]]},"168":{"position":[[470,5],[1546,3],[1559,3]]},"174":{"position":[[125,3],[189,3],[202,3],[238,3],[322,4]]},"176":{"position":[[1731,4],[2169,4],[2863,3],[4033,4]]},"178":{"position":[[0,3],[13,3]]},"182":{"position":[[0,3],[13,3]]},"188":{"position":[[126,3]]},"190":{"position":[[1449,3],[1462,3],[1498,3],[1582,4]]},"194":{"position":[[0,3],[13,3]]},"202":{"position":[[0,3],[13,3],[154,4]]},"206":{"position":[[0,3],[13,3]]},"208":{"position":[[1019,4],[2565,5],[3422,4]]},"210":{"position":[[0,3],[13,3]]},"234":{"position":[[1523,3],[1600,3]]},"247":{"position":[[95,3],[177,3],[851,3],[1065,3],[1179,4],[1290,3]]},"272":{"position":[[76,3]]},"309":{"position":[[64,3],[111,3],[320,3],[433,4],[539,3]]},"344":{"position":[[560,4],[920,6]]},"390":{"position":[[1626,5]]},"392":{"position":[[31,3]]},"396":{"position":[[353,3]]},"400":{"position":[[714,3]]},"416":{"position":[[1797,3],[2051,4]]},"430":{"position":[[1145,4]]}}}],["env/fil",{"_index":1046,"t":{"106":{"position":[[311,8]]},"112":{"position":[[279,8]]}}}],["environ",{"_index":56,"t":{"4":{"position":[[850,12]]},"8":{"position":[[766,11]]},"18":{"position":[[129,12]]},"47":{"position":[[193,11]]},"160":{"position":[[1157,12]]},"247":{"position":[[1446,12]]},"309":{"position":[[695,12]]},"394":{"position":[[445,12],[2942,12]]},"396":{"position":[[1026,12]]},"414":{"position":[[224,12]]},"416":{"position":[[240,11],[837,11],[1811,11],[2205,11],[2616,11]]},"418":{"position":[[456,11],[958,11],[1101,11],[1243,11],[1381,11]]},"420":{"position":[[189,11]]},"422":{"position":[[175,11],[318,11],[460,11],[598,11]]},"424":{"position":[[377,11],[714,11],[1094,11],[2000,11]]}}}],["environment",{"_index":8,"t":{"4":{"position":[[42,13],[328,13],[1220,13],[2880,13]]},"8":{"position":[[70,13],[434,13],[712,13],[1418,13],[1553,13]]},"14":{"position":[[850,13],[1607,13],[2231,13],[2727,13],[3574,13]]},"37":{"position":[[29,13]]},"41":{"position":[[29,13]]},"45":{"position":[[29,13]]},"49":{"position":[[29,13]]},"56":{"position":[[448,13]]},"63":{"position":[[586,13]]},"88":{"position":[[13,13]]},"94":{"position":[[13,13]]},"100":{"position":[[108,13]]},"104":{"position":[[13,13]]},"110":{"position":[[29,13]]},"116":{"position":[[29,13]]},"124":{"position":[[29,13]]},"130":{"position":[[1211,13]]},"138":{"position":[[29,13]]},"158":{"position":[[29,13]]},"162":{"position":[[29,13]]},"166":{"position":[[29,13]]},"168":{"position":[[1575,13]]},"178":{"position":[[29,13]]},"182":{"position":[[29,13]]},"194":{"position":[[29,13]]},"202":{"position":[[29,13]]},"206":{"position":[[29,13]]},"210":{"position":[[29,13]]},"372":{"position":[[1501,13]]},"394":{"position":[[3052,13],[3359,13]]},"400":{"position":[[1348,13]]},"414":{"position":[[406,13]]}}}],["eol",{"_index":2375,"t":{"402":{"position":[[150,4]]}}}],["ep",{"_index":1777,"t":{"256":{"position":[[322,4],[811,3]]},"261":{"position":[[496,2],[554,6]]},"272":{"position":[[364,6]]},"276":{"position":[[461,6]]}}}],["equal",{"_index":876,"t":{"88":{"position":[[326,5]]}}}],["equival",{"_index":1670,"t":{"234":{"position":[[1190,10]]},"238":{"position":[[94,10]]}}}],["error",{"_index":176,"t":{"4":{"position":[[4961,8],[5185,8]]},"8":{"position":[[1405,5]]},"20":{"position":[[117,7]]},"22":{"position":[[148,5],[785,5],[982,8],[1138,5],[1380,8]]},"24":{"position":[[181,5]]},"67":{"position":[[122,6],[276,5],[651,5]]},"98":{"position":[[223,6],[3145,6]]},"208":{"position":[[1240,6],[5091,6]]},"226":{"position":[[378,5]]},"329":{"position":[[2657,6],[2809,5]]},"348":{"position":[[2530,5],[2567,5],[2592,5]]},"376":{"position":[[11,6],[74,6]]},"379":{"position":[[158,5],[193,5],[225,5],[239,6],[415,6]]},"400":{"position":[[278,6],[321,5]]}}}],["error('error",{"_index":2145,"t":{"353":{"position":[[1074,12]]}}}],["error(`'baseurl",{"_index":2091,"t":{"348":{"position":[[1105,16]]}}}],["error(`'token",{"_index":2089,"t":{"348":{"position":[[952,14]]}}}],["error(`could",{"_index":2094,"t":{"348":{"position":[[1234,12]]}}}],["error/network",{"_index":1926,"t":{"329":{"position":[[237,13]]}}}],["essenti",{"_index":2300,"t":{"390":{"position":[[2148,9]]}}}],["etc",{"_index":233,"t":{"8":{"position":[[1351,6]]},"18":{"position":[[248,7]]},"51":{"position":[[531,6]]},"58":{"position":[[613,6]]},"71":{"position":[[177,6]]},"222":{"position":[[436,7]]},"224":{"position":[[667,7]]},"247":{"position":[[1215,6]]},"256":{"position":[[715,6],[815,6],[931,6],[1025,6]]},"265":{"position":[[166,6]]},"301":{"position":[[544,7]]},"303":{"position":[[842,6]]},"309":{"position":[[469,6]]},"327":{"position":[[343,6]]},"331":{"position":[[257,6],[483,6]]},"337":{"position":[[623,6]]},"384":{"position":[[156,7]]},"390":{"position":[[2777,7]]},"434":{"position":[[230,6]]}}}],["evalu",{"_index":1300,"t":{"176":{"position":[[3825,8]]}}}],["even",{"_index":593,"t":{"51":{"position":[[538,4]]},"58":{"position":[[620,4]]},"234":{"position":[[318,4]]},"251":{"position":[[477,4],[716,4]]}}}],["event",{"_index":389,"t":{"22":{"position":[[70,7]]},"329":{"position":[[212,5]]},"355":{"position":[[1309,6],[1620,6],[1655,6],[3738,5]]}}}],["eventemitt",{"_index":2028,"t":{"342":{"position":[[697,13]]}}}],["eventu",{"_index":1287,"t":{"176":{"position":[[3027,11]]}}}],["everyone'",{"_index":701,"t":{"65":{"position":[[796,10]]}}}],["everyth",{"_index":343,"t":{"14":{"position":[[3243,10]]},"24":{"position":[[136,10]]},"65":{"position":[[528,10],[876,10]]},"130":{"position":[[2314,10]]},"258":{"position":[[855,10],[949,10]]},"430":{"position":[[1420,10]]}}}],["ex",{"_index":270,"t":{"12":{"position":[[476,2]]},"14":{"position":[[3734,3]]},"35":{"position":[[359,2],[617,2]]},"100":{"position":[[336,2],[527,2]]},"196":{"position":[[164,2]]},"204":{"position":[[533,2]]},"208":{"position":[[3125,3]]},"256":{"position":[[1367,2],[1456,2]]},"258":{"position":[[817,2],[909,2]]},"282":{"position":[[726,2]]},"297":{"position":[[159,2]]},"301":{"position":[[308,2],[606,2]]},"327":{"position":[[493,2]]},"372":{"position":[[2058,2]]},"374":{"position":[[595,2]]},"394":{"position":[[1054,3]]},"424":{"position":[[1530,2],[1784,2]]}}}],["exact",{"_index":1330,"t":{"190":{"position":[[288,5]]}}}],["exactli",{"_index":1463,"t":{"208":{"position":[[2334,7],[3062,7],[3271,7]]},"430":{"position":[[1563,7]]}}}],["exampl",{"_index":43,"t":{"4":{"position":[[640,7],[1914,7],[2112,8],[2211,7],[2233,8],[2429,7],[2512,7],[3615,7],[3739,7],[3836,7],[3858,8],[3981,7],[4026,7]]},"8":{"position":[[138,8],[470,7]]},"12":{"position":[[468,7]]},"14":{"position":[[802,8],[1559,8],[2183,8],[2719,7],[2917,7],[3566,7],[3765,7]]},"22":{"position":[[336,7],[801,7],[1154,7],[1534,7]]},"26":{"position":[[112,8]]},"35":{"position":[[958,9],[977,8],[1017,7]]},"37":{"position":[[452,7],[762,7]]},"41":{"position":[[710,7],[1080,7]]},"45":{"position":[[494,7],[831,7]]},"47":{"position":[[97,7]]},"49":{"position":[[365,7],[646,7]]},"56":{"position":[[881,7],[1168,7]]},"63":{"position":[[1002,7],[1273,7]]},"71":{"position":[[114,8]]},"80":{"position":[[592,8]]},"86":{"position":[[698,9]]},"88":{"position":[[590,7],[876,7]]},"94":{"position":[[386,7],[708,7]]},"96":{"position":[[271,7]]},"98":{"position":[[2265,7],[2797,7],[3426,7],[3456,7]]},"100":{"position":[[629,7],[829,7],[863,7],[1096,7]]},"102":{"position":[[1282,7]]},"104":{"position":[[94,7],[245,7],[279,7],[463,7]]},"108":{"position":[[620,8],[629,8]]},"110":{"position":[[477,7],[732,7]]},"114":{"position":[[612,8],[621,8]]},"116":{"position":[[424,7],[699,7]]},"118":{"position":[[871,7],[1181,7]]},"124":{"position":[[433,7],[644,7]]},"128":{"position":[[550,7],[920,7]]},"130":{"position":[[2716,7],[3358,7]]},"138":{"position":[[512,7],[723,7]]},"142":{"position":[[532,7],[869,7]]},"146":{"position":[[459,7],[740,7]]},"148":{"position":[[921,8],[930,8]]},"150":{"position":[[342,7]]},"152":{"position":[[345,7]]},"154":{"position":[[247,7],[520,7]]},"158":{"position":[[337,7],[620,7]]},"162":{"position":[[521,7],[768,7]]},"166":{"position":[[364,7],[616,7]]},"168":{"position":[[686,8],[2732,7],[3298,7]]},"174":{"position":[[656,7],[943,7]]},"176":{"position":[[1503,8]]},"178":{"position":[[513,7],[886,7]]},"182":{"position":[[420,7],[734,7]]},"190":{"position":[[772,8],[1964,7],[2299,7]]},"192":{"position":[[1535,7]]},"194":{"position":[[289,7],[523,7]]},"198":{"position":[[153,7]]},"202":{"position":[[512,7],[759,7]]},"206":{"position":[[269,7],[487,7]]},"210":{"position":[[658,7],[1036,7]]},"218":{"position":[[694,8]]},"220":{"position":[[130,8]]},"222":{"position":[[397,9],[444,7],[1094,7],[1929,7]]},"226":{"position":[[895,7],[1176,7]]},"228":{"position":[[1161,7],[1365,7]]},"230":{"position":[[472,7]]},"232":{"position":[[4,8]]},"241":{"position":[[745,7]]},"243":{"position":[[116,8]]},"247":{"position":[[1150,8],[1258,7],[1332,7]]},"251":{"position":[[514,7],[542,8],[1624,8],[2588,8],[3497,7],[3989,8],[4364,7],[4696,8],[5845,8]]},"265":{"position":[[374,7]]},"267":{"position":[[530,7]]},"270":{"position":[[0,7]]},"272":{"position":[[88,7]]},"274":{"position":[[277,7]]},"276":{"position":[[185,7]]},"278":{"position":[[215,7]]},"280":{"position":[[170,7],[562,7]]},"287":{"position":[[40,7]]},"289":{"position":[[60,7]]},"291":{"position":[[0,7]]},"293":{"position":[[0,7]]},"295":{"position":[[0,7]]},"297":{"position":[[656,7]]},"301":{"position":[[650,7]]},"303":{"position":[[1396,7]]},"307":{"position":[[230,7]]},"309":{"position":[[405,7],[507,7],[581,7]]},"312":{"position":[[0,7]]},"314":{"position":[[0,7]]},"316":{"position":[[149,7]]},"329":{"position":[[1070,8],[1805,8],[3052,8]]},"340":{"position":[[691,8],[812,8]]},"372":{"position":[[1630,8]]},"386":{"position":[[188,7],[337,7]]},"392":{"position":[[44,8]]},"394":{"position":[[244,7],[1772,7],[2237,7],[2771,7]]},"396":{"position":[[64,7],[76,7]]},"400":{"position":[[704,9]]},"414":{"position":[[439,8]]},"418":{"position":[[1602,7]]},"422":{"position":[[819,7]]},"424":{"position":[[281,7],[1964,8]]},"428":{"position":[[285,8],[362,7]]},"434":{"position":[[166,8]]},"436":{"position":[[112,8]]}}}],["example.com",{"_index":1134,"t":{"134":{"position":[[790,13]]}}}],["except",{"_index":1548,"t":{"218":{"position":[[652,7]]},"263":{"position":[[197,6]]},"329":{"position":[[673,9],[2766,9],[2890,9]]}}}],["exclud",{"_index":1798,"t":{"256":{"position":[[1252,9],[1462,7]]}}}],["execstart=npm",{"_index":2393,"t":{"406":{"position":[[371,13]]}}}],["exhaust",{"_index":618,"t":{"51":{"position":[[1520,10]]},"98":{"position":[[494,10]]},"263":{"position":[[320,13]]},"301":{"position":[[221,10]]}}}],["exist",{"_index":248,"t":{"8":{"position":[[1787,8]]},"31":{"position":[[235,6]]},"35":{"position":[[288,9]]},"98":{"position":[[568,8]]},"176":{"position":[[639,8]]},"208":{"position":[[1531,9]]},"218":{"position":[[1451,11],[1490,10]]},"224":{"position":[[1188,8]]},"234":{"position":[[375,8]]},"291":{"position":[[71,11]]},"355":{"position":[[1474,8]]},"364":{"position":[[332,8]]},"379":{"position":[[100,6]]},"418":{"position":[[127,8]]},"424":{"position":[[1459,9]]}}}],["exit",{"_index":2252,"t":{"379":{"position":[[172,6]]}}}],["expand",{"_index":910,"t":{"92":{"position":[[648,6]]}}}],["expect",{"_index":1766,"t":{"251":{"position":[[5701,6]]},"261":{"position":[[333,6]]},"267":{"position":[[132,8]]},"390":{"position":[[3069,8]]}}}],["experi",{"_index":924,"t":{"96":{"position":[[127,10]]},"98":{"position":[[200,10],[283,10]]},"208":{"position":[[1926,10]]},"390":{"position":[[1239,10]]}}}],["experiment",{"_index":942,"t":{"98":{"position":[[178,13]]}}}],["explain",{"_index":2307,"t":{"390":{"position":[[3057,7]]}}}],["explan",{"_index":1424,"t":{"208":{"position":[[383,12]]}}}],["explicit",{"_index":1818,"t":{"263":{"position":[[115,8]]}}}],["explicitli",{"_index":269,"t":{"12":{"position":[[326,10]]},"33":{"position":[[302,10]]},"84":{"position":[[574,10]]},"86":{"position":[[675,10],[1239,10],[1926,10]]},"98":{"position":[[2050,10]]},"108":{"position":[[366,10]]},"114":{"position":[[362,10]]},"148":{"position":[[719,10]]},"168":{"position":[[582,10]]},"204":{"position":[[492,10]]},"256":{"position":[[1223,11],[1373,10]]},"394":{"position":[[957,10],[2531,10]]}}}],["explor",{"_index":135,"t":{"4":{"position":[[3924,7]]},"37":{"position":[[425,7],[735,7]]},"41":{"position":[[683,7],[1053,7]]},"45":{"position":[[467,7],[804,7]]},"49":{"position":[[338,7],[619,7]]},"56":{"position":[[854,7],[1141,7]]},"63":{"position":[[975,7],[1246,7]]},"88":{"position":[[563,7],[849,7]]},"94":{"position":[[359,7],[681,7]]},"100":{"position":[[802,7],[1069,7]]},"104":{"position":[[218,7],[436,7]]},"110":{"position":[[450,7],[705,7]]},"116":{"position":[[397,7],[672,7]]},"118":{"position":[[844,7],[1154,7]]},"124":{"position":[[406,7],[617,7]]},"128":{"position":[[523,7],[893,7]]},"130":{"position":[[2689,7],[3331,7]]},"138":{"position":[[485,7],[696,7]]},"142":{"position":[[505,7],[842,7]]},"146":{"position":[[432,7],[713,7]]},"154":{"position":[[220,7],[493,7]]},"158":{"position":[[310,7],[593,7]]},"162":{"position":[[494,7],[741,7]]},"166":{"position":[[337,7],[589,7]]},"168":{"position":[[2705,7],[3271,7]]},"174":{"position":[[629,7],[916,7]]},"178":{"position":[[486,7],[859,7]]},"182":{"position":[[393,7],[707,7]]},"190":{"position":[[1937,7],[2272,7]]},"194":{"position":[[262,7],[496,7]]},"202":{"position":[[485,7],[732,7]]},"206":{"position":[[242,7],[460,7]]},"210":{"position":[[631,7],[1009,7]]}}}],["export",{"_index":61,"t":{"4":{"position":[[1026,6]]},"340":{"position":[[458,6],[870,6],[968,6],[1455,6],[1535,6],[1741,6],[1799,6]]},"342":{"position":[[439,6]]},"344":{"position":[[375,6]]},"346":{"position":[[336,6]]},"348":{"position":[[357,6],[1617,6],[2255,6]]},"350":{"position":[[1684,6]]},"353":{"position":[[439,6]]},"355":{"position":[[882,6],[2801,6],[3473,6]]}}}],["expos",{"_index":802,"t":{"76":{"position":[[685,6],[1036,6]]},"160":{"position":[[1343,6]]}}}],["express",{"_index":1366,"t":{"192":{"position":[[1190,12],[1367,10],[1470,12]]},"228":{"position":[[194,11],[906,10]]},"278":{"position":[[39,12]]},"280":{"position":[[57,11]]},"282":{"position":[[21,10],[95,11],[187,10],[234,11],[410,11]]},"284":{"position":[[49,12]]},"303":{"position":[[409,12]]}}}],["expressj",{"_index":1893,"t":{"319":{"position":[[219,10]]}}}],["extend",{"_index":1995,"t":{"340":{"position":[[496,7],[910,7],[1011,7]]},"342":{"position":[[477,7]]},"346":{"position":[[374,7]]},"348":{"position":[[395,7],[1655,7],[2293,7]]},"350":{"position":[[1722,7]]},"353":{"position":[[477,7]]},"355":{"position":[[920,7],[2836,7],[3514,7]]}}}],["extens",{"_index":1149,"t":{"148":{"position":[[291,9]]},"196":{"position":[[34,9],[255,9]]},"200":{"position":[[171,10],[314,10]]},"323":{"position":[[226,10]]},"372":{"position":[[92,9],[2457,9]]},"430":{"position":[[1276,9]]}}}],["extern",{"_index":292,"t":{"14":{"position":[[89,8],[1834,8]]}}}],["extra",{"_index":1350,"t":{"192":{"position":[[246,5]]}}}],["extract",{"_index":1364,"t":{"192":{"position":[[1109,7],[1309,7],[1412,10],[1684,8],[1860,7]]},"220":{"position":[[288,7]]},"222":{"position":[[1336,8]]},"247":{"position":[[691,10]]},"251":{"position":[[2720,10],[2921,7],[3233,7],[3623,8],[3699,8],[4259,7],[4313,7],[4520,8],[4807,10]]},"261":{"position":[[647,10]]},"276":{"position":[[80,10]]},"301":{"position":[[52,7],[552,8]]},"303":{"position":[[572,7],[726,7],[807,7],[1112,7],[1361,7],[1498,9]]},"316":{"position":[[34,7]]}}}],["f12",{"_index":899,"t":{"92":{"position":[[324,3]]}}}],["f243331e",{"_index":1997,"t":{"340":{"position":[[700,8]]}}}],["factori",{"_index":1750,"t":{"251":{"position":[[1827,9],[2010,9],[3597,8],[3659,7],[3930,9],[4463,7]]},"301":{"position":[[825,9],[944,9]]}}}],["fail",{"_index":305,"t":{"14":{"position":[[310,6]]},"24":{"position":[[281,7]]},"226":{"position":[[415,5],[769,5],[1037,6],[1345,5]]},"247":{"position":[[722,5],[833,4]]},"251":{"position":[[2145,6],[4827,4]]},"276":{"position":[[773,5]]},"329":{"position":[[696,6],[2631,6]]},"372":{"position":[[2515,6]]}}}],["failur",{"_index":393,"t":{"22":{"position":[[179,7]]},"329":{"position":[[1627,8],[2749,7],[2787,7],[2969,8]]},"430":{"position":[[996,7]]}}}],["failure/etc",{"_index":1927,"t":{"329":{"position":[[251,14]]}}}],["fake",{"_index":1169,"t":{"152":{"position":[[207,4]]}}}],["fallback",{"_index":1716,"t":{"247":{"position":[[1562,8]]},"276":{"position":[[52,8]]}}}],["fallbackalbumsearch",{"_index":1753,"t":{"251":{"position":[[2517,19],[2681,22]]}}}],["fallbackartistsearch",{"_index":1694,"t":{"243":{"position":[[319,23]]},"247":{"position":[[651,21]]},"251":{"position":[[2833,20],[3017,20],[3072,20],[4026,23],[4733,23]]},"261":{"position":[[853,23]]},"272":{"position":[[405,23]]},"276":{"position":[[502,23]]}}}],["fallbackfreetextsearch",{"_index":1704,"t":{"247":{"position":[[782,23]]},"251":{"position":[[5882,25]]}}}],["fals",{"_index":142,"t":{"4":{"position":[[4072,6],[4093,6],[4134,6],[4187,6]]},"84":{"position":[[772,5]]},"86":{"position":[[1437,5]]},"130":{"position":[[2609,6],[3230,5]]},"158":{"position":[[295,5],[561,5]]},"168":{"position":[[2688,7],[3236,7]]},"210":{"position":[[320,5]]},"224":{"position":[[211,6]]},"245":{"position":[[181,6]]},"251":{"position":[[452,6]]},"265":{"position":[[542,6],[560,6],[576,6],[599,6]]},"274":{"position":[[696,6],[714,6],[730,6],[753,6]]},"305":{"position":[[162,6]]},"316":{"position":[[402,5]]},"329":{"position":[[2149,6],[2251,6],[2617,5],[2910,5]]},"342":{"position":[[921,6]]},"348":{"position":[[536,6]]}}}],["famili",{"_index":1013,"t":{"100":{"position":[[350,6]]},"430":{"position":[[894,8],[1811,6]]}}}],["fan",{"_index":1673,"t":{"234":{"position":[[1335,3]]},"238":{"position":[[239,3]]}}}],["fanci",{"_index":1973,"t":{"337":{"position":[[27,6]]}}}],["faq",{"_index":2,"t":{"2":{"position":[[14,3]]},"208":{"position":[[364,3]]},"428":{"position":[[509,3]]},"446":{"position":[[59,3]]}}}],["fashion",{"_index":1510,"t":{"212":{"position":[[85,7]]}}}],["faster",{"_index":297,"t":{"14":{"position":[[131,7]]},"234":{"position":[[1680,6]]}}}],["favorit",{"_index":1674,"t":{"234":{"position":[[1400,8]]},"238":{"position":[[304,8]]}}}],["feat",{"_index":1744,"t":{"251":{"position":[[1767,6],[3537,6],[3742,6],[4404,6],[4624,6]]},"301":{"position":[[534,5],[622,6],[765,6]]},"303":{"position":[[832,5]]},"316":{"position":[[100,6]]}}}],["featur",{"_index":835,"t":{"84":{"position":[[10,7]]}}}],["fedora",{"_index":2378,"t":{"404":{"position":[[99,7]]}}}],["feedback",{"_index":2279,"t":{"390":{"position":[[1339,8]]}}}],["fetch",{"_index":1929,"t":{"329":{"position":[[357,8]]}}}],["few",{"_index":1483,"t":{"208":{"position":[[4193,3]]},"384":{"position":[[40,3]]}}}],["ffff:127.0.0.1",{"_index":2215,"t":{"372":{"position":[[493,16],[704,16]]}}}],["ffff:192.168.0.100",{"_index":2231,"t":{"372":{"position":[[1028,20]]}}}],["field",{"_index":205,"t":{"8":{"position":[[316,6],[376,5]]},"192":{"position":[[1298,7],[1391,5],[2115,6],[2177,5]]},"212":{"position":[[519,5]]},"245":{"position":[[97,6]]},"251":{"position":[[1295,6],[1397,6],[2232,6],[2436,7],[5163,7]]},"284":{"position":[[412,5],[491,5]]},"305":{"position":[[97,6]]},"382":{"position":[[57,5]]},"384":{"position":[[51,6],[181,6],[360,6]]}}}],["field/env",{"_index":1305,"t":{"176":{"position":[[4189,9]]}}}],["file",{"_index":15,"t":{"4":{"position":[[107,5],[139,4],[300,4],[305,4],[434,5],[1161,5],[1413,4],[2304,4],[2381,4],[2822,4],[3634,5]]},"8":{"position":[[11,4],[109,6],[225,5],[347,6],[497,4]]},"14":{"position":[[468,4],[921,4],[1030,7],[1225,4],[1674,4],[1775,7],[2596,4],[2608,4],[2679,4],[2798,4],[2912,4],[2976,7]]},"18":{"position":[[334,4]]},"22":{"position":[[234,4]]},"33":{"position":[[883,4],[976,4]]},"37":{"position":[[4,4],[212,4]]},"41":{"position":[[4,4],[410,4]]},"45":{"position":[[4,4],[227,4]]},"49":{"position":[[4,4],[154,4]]},"56":{"position":[[423,4],[664,4]]},"63":{"position":[[561,4],[801,4]]},"69":{"position":[[80,4]]},"82":{"position":[[361,4]]},"84":{"position":[[644,4]]},"86":{"position":[[1309,4]]},"88":{"position":[[4,4]]},"94":{"position":[[4,4]]},"96":{"position":[[182,5]]},"98":{"position":[[784,4],[2113,4],[2710,4]]},"100":{"position":[[4,4],[89,4]]},"104":{"position":[[4,4]]},"108":{"position":[[47,4],[661,4]]},"110":{"position":[[4,4],[288,4]]},"114":{"position":[[45,4],[653,4]]},"116":{"position":[[4,4],[219,4]]},"118":{"position":[[391,4],[584,4],[631,4]]},"124":{"position":[[4,4],[292,4]]},"128":{"position":[[4,4],[201,4],[250,4]]},"130":{"position":[[1202,4]]},"138":{"position":[[4,4],[371,4]]},"142":{"position":[[4,4],[211,4],[265,4]]},"146":{"position":[[4,4],[199,5],[248,4]]},"148":{"position":[[402,4],[849,4],[962,4]]},"154":{"position":[[4,4],[44,4]]},"158":{"position":[[4,4],[124,4]]},"162":{"position":[[4,4],[344,4]]},"166":{"position":[[4,4],[161,4]]},"168":{"position":[[1550,4],[2236,4]]},"174":{"position":[[193,4],[390,4],[439,4]]},"178":{"position":[[4,4],[210,4]]},"180":{"position":[[649,4]]},"182":{"position":[[4,4],[176,4]]},"190":{"position":[[1453,4],[1650,4],[1699,4]]},"192":{"position":[[883,4],[1009,4],[1554,4]]},"194":{"position":[[4,4],[125,4]]},"198":{"position":[[134,4]]},"202":{"position":[[4,4],[335,4]]},"206":{"position":[[4,4],[121,4]]},"210":{"position":[[4,4],[350,4]]},"222":{"position":[[63,4],[762,4],[1443,4],[1631,4],[2247,4]]},"267":{"position":[[552,4]]},"270":{"position":[[188,4]]},"272":{"position":[[460,4]]},"274":{"position":[[523,4]]},"276":{"position":[[558,4]]},"280":{"position":[[584,4]]},"307":{"position":[[252,4]]},"312":{"position":[[318,4]]},"314":{"position":[[217,4]]},"316":{"position":[[250,4]]},"329":{"position":[[394,6],[894,6],[3247,4]]},"340":{"position":[[142,4]]},"355":{"position":[[1459,6]]},"379":{"position":[[95,4],[318,4]]},"390":{"position":[[2200,4],[2306,5],[2508,4]]},"392":{"position":[[39,4]]},"394":{"position":[[3300,4]]},"396":{"position":[[357,4]]},"400":{"position":[[718,4]]},"406":{"position":[[21,4],[198,4]]},"408":{"position":[[9,4]]},"412":{"position":[[276,4]]},"416":{"position":[[3514,4]]},"418":{"position":[[1521,4]]},"422":{"position":[[738,4]]},"426":{"position":[[112,4]]},"428":{"position":[[172,5]]},"444":{"position":[[173,4]]}}}],["file/aio",{"_index":94,"t":{"4":{"position":[[1891,8]]},"33":{"position":[[449,8]]},"80":{"position":[[88,8],[662,8]]},"118":{"position":[[319,8]]},"126":{"position":[[452,8]]},"130":{"position":[[1159,8]]},"144":{"position":[[203,8]]},"174":{"position":[[136,8]]},"188":{"position":[[137,8]]},"272":{"position":[[48,8]]}}}],["filenam",{"_index":1361,"t":{"192":{"position":[[984,8],[1167,8],[1512,8],[1715,9],[1880,8]]}}}],["filenamepattern",{"_index":1371,"t":{"192":{"position":[[1659,19]]}}}],["fill",{"_index":1458,"t":{"208":{"position":[[1983,4]]},"234":{"position":[[161,4]]},"261":{"position":[[208,7]]},"418":{"position":[[84,4]]},"428":{"position":[[444,4]]}}}],["filter",{"_index":817,"t":{"78":{"position":[[120,8]]},"92":{"position":[[456,7]]},"190":{"position":[[59,6],[313,6]]},"256":{"position":[[178,6],[1196,6],[1748,6],[2010,9]]},"258":{"position":[[186,9],[406,10],[422,7],[458,7],[707,8],[739,8]]},"263":{"position":[[20,7],[132,6],[354,9],[512,9]]}}}],["final",{"_index":571,"t":{"47":{"position":[[494,8]]},"108":{"position":[[681,5]]},"114":{"position":[[673,5]]},"148":{"position":[[982,5]]},"176":{"position":[[2280,5]]},"230":{"position":[[164,5],[305,5]]},"247":{"position":[[838,8]]},"256":{"position":[[194,5]]},"329":{"position":[[915,8]]},"340":{"position":[[1624,8]]},"348":{"position":[[2063,8]]},"350":{"position":[[2821,8]]},"424":{"position":[[681,8]]}}}],["find",{"_index":547,"t":{"43":{"position":[[350,4]]},"80":{"position":[[538,4]]},"92":{"position":[[700,4]]},"140":{"position":[[450,4]]},"168":{"position":[[0,4]]},"192":{"position":[[1958,4]]},"214":{"position":[[184,5]]},"226":{"position":[[1354,4]]},"234":{"position":[[1016,4]]},"236":{"position":[[413,4]]},"247":{"position":[[731,4],[1139,4]]},"251":{"position":[[1457,4],[4151,5],[4485,5]]},"276":{"position":[[782,4]]},"309":{"position":[[394,4]]},"379":{"position":[[400,4]]},"416":{"position":[[2498,4]]},"444":{"position":[[386,4]]}}}],["fine",{"_index":1922,"t":{"327":{"position":[[400,4]]}}}],["finish",{"_index":1278,"t":{"176":{"position":[[2470,6]]},"208":{"position":[[4554,8]]},"226":{"position":[[304,8]]},"390":{"position":[[2925,6]]}}}],["firefox",{"_index":896,"t":{"92":{"position":[[295,7]]},"130":{"position":[[2432,12],[3045,9]]},"168":{"position":[[2486,9],[3034,9]]},"196":{"position":[[299,7],[391,7]]}}}],["firefox/139.0",{"_index":2223,"t":{"372":{"position":[[588,14],[799,14]]}}}],["firewal",{"_index":2239,"t":{"372":{"position":[[2152,8],[2233,8]]}}}],["first",{"_index":98,"t":{"4":{"position":[[2167,5],[3792,5]]},"192":{"position":[[1487,5]]},"198":{"position":[[577,5]]},"208":{"position":[[1682,5],[1704,5],[2432,5]]},"214":{"position":[[0,6]]},"222":{"position":[[940,5]]},"247":{"position":[[709,5]]},"251":{"position":[[1117,6],[4094,5],[4496,5]]},"297":{"position":[[139,5]]},"329":{"position":[[151,5]]},"342":{"position":[[0,5]]},"348":{"position":[[88,5]]},"366":{"position":[[161,6]]},"372":{"position":[[862,5],[1437,6]]},"376":{"position":[[192,6]]},"382":{"position":[[257,5]]},"394":{"position":[[1445,5]]},"444":{"position":[[212,5]]}}}],["firstgotifyserv",{"_index":167,"t":{"4":{"position":[[4826,20]]},"22":{"position":[[426,20]]}}}],["fit",{"_index":2321,"t":{"394":{"position":[[313,3]]}}}],["fix",{"_index":1519,"t":{"212":{"position":[[816,3]]},"372":{"position":[[1291,3]]},"379":{"position":[[435,3]]},"386":{"position":[[316,3],[433,3]]}}}],["flatpak",{"_index":2170,"t":{"359":{"position":[[8,7],[24,7],[40,7]]},"364":{"position":[[97,7],[215,7],[424,7]]},"366":{"position":[[87,7],[117,7],[297,7],[475,7],[623,8],[692,7],[736,7],[781,7]]},"368":{"position":[[98,7]]},"402":{"position":[[90,7],[142,7]]}}}],["flatpak/build",{"_index":2209,"t":{"366":{"position":[[936,13]]}}}],["flatpak/flathub",{"_index":2374,"t":{"402":{"position":[[12,15]]}}}],["flatpak/nodej",{"_index":981,"t":{"98":{"position":[[1431,14]]}}}],["flatpak/repo",{"_index":2206,"t":{"366":{"position":[[835,12]]}}}],["flatpak/setup.sh",{"_index":2180,"t":{"364":{"position":[[181,17]]}}}],["flatpak/st",{"_index":2208,"t":{"366":{"position":[[891,13]]}}}],["flow",{"_index":542,"t":{"41":{"position":[[388,4]]},"208":{"position":[[4334,5],[4546,4],[5343,4]]},"226":{"position":[[624,4],[786,4],[882,4],[1163,4]]},"251":{"position":[[2168,4]]},"276":{"position":[[117,4]]}}}],["fm.teal",{"_index":658,"t":{"58":{"position":[[942,10]]}}}],["fm.teal.alpha.feed.play",{"_index":1338,"t":{"190":{"position":[[690,23]]}}}],["folder",{"_index":1276,"t":{"176":{"position":[[2266,6]]},"208":{"position":[[4732,7]]},"390":{"position":[[2526,6]]},"414":{"position":[[13,6]]}}}],["follow",{"_index":844,"t":{"84":{"position":[[603,9]]},"86":{"position":[[1268,9]]},"156":{"position":[[90,9]]},"160":{"position":[[1683,9]]},"172":{"position":[[0,6]]},"176":{"position":[[1235,9]]},"186":{"position":[[0,6]]},"208":{"position":[[1297,6],[4318,6]]},"366":{"position":[[27,6]]},"376":{"position":[[1151,6]]},"390":{"position":[[1375,9]]},"416":{"position":[[136,6],[2349,6],[3352,9]]},"418":{"position":[[832,6]]},"422":{"position":[[49,6]]},"424":{"position":[[943,9]]}}}],["foo",{"_index":1865,"t":{"301":{"position":[[311,3]]},"303":{"position":[[1445,5],[1564,5],[1625,5]]}}}],["foo.com",{"_index":1840,"t":{"282":{"position":[[817,10]]}}}],["foobar",{"_index":1888,"t":{"316":{"position":[[107,7]]}}}],["footerm",{"_index":1843,"t":{"284":{"position":[[276,9],[338,10]]}}}],["forc",{"_index":996,"t":{"98":{"position":[[2475,7],[2509,6]]},"130":{"position":[[1063,5]]},"251":{"position":[[461,5]]},"366":{"position":[[988,5]]},"386":{"position":[[401,5]]}}}],["forcemediarecognitionon",{"_index":1000,"t":{"98":{"position":[[2677,25],[2988,26]]}}}],["forcesearch",{"_index":1733,"t":{"251":{"position":[[431,11],[746,14]]}}}],["forget",{"_index":1817,"t":{"261":{"position":[[838,6]]}}}],["fork",{"_index":339,"t":{"14":{"position":[[3047,4]]}}}],["form",{"_index":351,"t":{"14":{"position":[[3526,5]]},"108":{"position":[[110,6]]},"114":{"position":[[108,6]]},"148":{"position":[[465,6]]}}}],["format",{"_index":1025,"t":{"102":{"position":[[99,6],[474,6]]},"263":{"position":[[91,8]]},"331":{"position":[[165,6]]}}}],["formatplayobj(obj",{"_index":2068,"t":{"346":{"position":[[607,18]]}}}],["formatplayobjectopt",{"_index":2063,"t":{"346":{"position":[[215,24],[640,23]]}}}],["forward",{"_index":1855,"t":{"297":{"position":[[256,7],[532,7]]},"372":{"position":[[2170,11],[2338,10]]},"430":{"position":[[2204,7]]},"432":{"position":[[261,7]]}}}],["found",{"_index":105,"t":{"4":{"position":[[2351,5],[3647,5]]},"8":{"position":[[1445,6]]},"16":{"position":[[80,5]]},"84":{"position":[[462,5]]},"86":{"position":[[1146,5]]},"102":{"position":[[1100,5],[1496,5]]},"108":{"position":[[446,5]]},"114":{"position":[[440,5]]},"130":{"position":[[780,5]]},"148":{"position":[[815,5]]},"164":{"position":[[157,5]]},"168":{"position":[[1421,5]]},"212":{"position":[[767,5]]},"222":{"position":[[946,5],[1369,5]]},"243":{"position":[[22,5]]},"249":{"position":[[20,5]]},"251":{"position":[[1166,5],[3787,5],[4100,5],[5197,6]]},"297":{"position":[[152,6]]},"303":{"position":[[849,5]]},"344":{"position":[[94,6],[181,6]]},"394":{"position":[[272,5],[512,5]]},"396":{"position":[[1093,5]]},"414":{"position":[[291,5]]},"418":{"position":[[739,5]]},"420":{"position":[[472,5]]},"444":{"position":[[90,5]]}}}],["foxx",{"_index":687,"t":{"65":{"position":[[50,7]]},"67":{"position":[[2741,7]]}}}],["foxxairson",{"_index":744,"t":{"67":{"position":[[2680,15]]}}}],["foxxapikey",{"_index":757,"t":{"67":{"position":[[3276,12]]},"69":{"position":[[1670,12]]}}}],["foxxmaloja",{"_index":713,"t":{"67":{"position":[[975,15],[2707,15],[2876,15],[3111,15],[3204,13]]},"69":{"position":[[139,15],[1268,15],[1511,15],[1598,13]]}}}],["foxxmd",{"_index":555,"t":{"45":{"position":[[410,9],[721,9]]},"67":{"position":[[2562,9]]},"69":{"position":[[1117,9]]},"130":{"position":[[2255,9],[2893,9],[2965,9]]},"142":{"position":[[448,9],[759,9]]},"168":{"position":[[1112,7],[1134,10],[1287,8],[2406,9],[2954,9]]},"176":{"position":[[3497,7]]}}}],["foxxmd\",\"someotherus",{"_index":1117,"t":{"130":{"position":[[2357,27]]}}}],["foxxmd,plex_local_user,someus",{"_index":1235,"t":{"168":{"position":[[1197,31]]}}}],["foxxmd/multi",{"_index":55,"t":{"4":{"position":[[827,12]]},"98":{"position":[[1408,12]]},"247":{"position":[[1391,12]]},"309":{"position":[[640,12]]},"394":{"position":[[390,12],[1872,12],[2323,12],[2851,12]]},"396":{"position":[[670,12],[825,12],[971,12]]},"414":{"position":[[169,12]]},"453":{"position":[[562,12]]},"455":{"position":[[40,12]]}}}],["foxxpassword",{"_index":745,"t":{"67":{"position":[[2761,15]]}}}],["foxxspot",{"_index":712,"t":{"67":{"position":[[952,11]]},"69":{"position":[[116,11]]}}}],["foxxspotifyappid",{"_index":714,"t":{"67":{"position":[[1013,19],[1269,19]]},"69":{"position":[[177,19],[312,19]]}}}],["foxxspotifyappsecret",{"_index":715,"t":{"67":{"position":[[1049,23],[1396,23]]},"69":{"position":[[213,22],[348,22]]}}}],["foxxyoutub",{"_index":748,"t":{"67":{"position":[[2850,14]]},"69":{"position":[[1242,14]]}}}],["fqn",{"_index":1386,"t":{"196":{"position":[[314,4]]}}}],["frank",{"_index":1879,"t":{"303":{"position":[[1481,6],[1580,5],[1673,5]]}}}],["fred",{"_index":688,"t":{"65":{"position":[[58,5],[350,4],[477,5],[483,4],[816,4]]}}}],["fred'",{"_index":696,"t":{"65":{"position":[[558,6]]}}}],["fredapikey",{"_index":759,"t":{"67":{"position":[[3394,12]]},"69":{"position":[[1770,12]]}}}],["fredjelli",{"_index":741,"t":{"67":{"position":[[2412,12]]},"69":{"position":[[1054,12]]}}}],["fredmaloja",{"_index":722,"t":{"67":{"position":[[1477,15],[1733,15],[3322,13]]},"69":{"position":[[409,15],[580,15],[1698,13]]}}}],["fredplex",{"_index":730,"t":{"67":{"position":[[1710,11]]},"69":{"position":[[557,11]]}}}],["fredspot",{"_index":721,"t":{"67":{"position":[[1454,11]]},"69":{"position":[[386,11]]}}}],["fredsrefreshtoken",{"_index":726,"t":{"67":{"position":[[1548,20]]},"69":{"position":[[480,20]]}}}],["fredstoken",{"_index":724,"t":{"67":{"position":[[1518,13]]},"69":{"position":[[450,13]]}}}],["fredus",{"_index":734,"t":{"67":{"position":[[1836,12],[2632,12]]},"69":{"position":[[683,12],[1187,12]]}}}],["free",{"_index":1703,"t":{"247":{"position":[[765,4]]},"251":{"position":[[4767,4],[4896,4],[5026,4],[5346,4]]}}}],["friend",{"_index":2445,"t":{"430":{"position":[[882,7],[1799,7]]}}}],["friendli",{"_index":2457,"t":{"434":{"position":[[273,8]]},"436":{"position":[[194,8]]}}}],["frontend",{"_index":1891,"t":{"319":{"position":[[80,9],[245,9],[259,8]]}}}],["ft",{"_index":1868,"t":{"301":{"position":[[529,4]]},"303":{"position":[[828,3],[1476,4]]}}}],["full",{"_index":638,"t":{"56":{"position":[[52,4],[525,4]]},"63":{"position":[[126,4],[666,4]]},"98":{"position":[[527,4]]},"247":{"position":[[1266,4]]},"309":{"position":[[515,4]]},"329":{"position":[[1087,4]]},"424":{"position":[[1915,4]]}}}],["function",{"_index":466,"t":{"33":{"position":[[131,14]]},"90":{"position":[[176,14]]},"134":{"position":[[916,14]]},"282":{"position":[[940,8]]},"329":{"position":[[411,8]]},"340":{"position":[[1990,8]]},"346":{"position":[[28,8]]},"350":{"position":[[700,9]]},"355":{"position":[[1736,8],[1987,13],[2054,9],[2156,13]]},"416":{"position":[[1462,13]]},"453":{"position":[[200,13]]}}}],["funkwhal",{"_index":83,"t":{"4":{"position":[[1574,12],[3257,12]]}}}],["further",{"_index":2275,"t":{"390":{"position":[[1127,8]]}}}],["futur",{"_index":1445,"t":{"208":{"position":[[1290,6]]}}}],["fuzzydiscoveryignor",{"_index":926,"t":{"96":{"position":[[222,23],[373,23]]}}}],["g",{"_index":2347,"t":{"394":{"position":[[3502,1]]}}}],["garbag",{"_index":1515,"t":{"212":{"position":[[410,7]]}}}],["gather",{"_index":365,"t":{"16":{"position":[[337,9]]}}}],["gaurante",{"_index":1451,"t":{"208":{"position":[[1599,9]]}}}],["gave",{"_index":824,"t":{"80":{"position":[[638,4]]}}}],["gb",{"_index":1793,"t":{"256":{"position":[[1017,3]]}}}],["gecko/20100101",{"_index":2222,"t":{"372":{"position":[[573,14],[784,14]]}}}],["gener",{"_index":22,"t":{"4":{"position":[[249,9],[3989,9]]},"12":{"position":[[32,8]]},"41":{"position":[[360,9]]},"47":{"position":[[474,9]]},"58":{"position":[[1633,9]]},"76":{"position":[[488,9]]},"80":{"position":[[483,9]]},"98":{"position":[[2022,9]]},"118":{"position":[[226,7]]},"134":{"position":[[218,8]]},"144":{"position":[[110,7]]},"174":{"position":[[43,7]]},"188":{"position":[[43,7]]},"200":{"position":[[243,7]]},"208":{"position":[[2412,8]]},"224":{"position":[[815,12]]},"247":{"position":[[4,7]]},"251":{"position":[[5591,10]]},"261":{"position":[[0,10]]},"263":{"position":[[411,10]]},"329":{"position":[[3061,8]]},"337":{"position":[[355,9]]},"340":{"position":[[597,9]]},"359":{"position":[[53,10]]},"364":{"position":[[53,10],[341,9]]},"366":{"position":[[56,8],[130,9],[143,8],[310,9],[347,9],[406,9],[437,8],[488,9],[533,9],[592,9]]},"424":{"position":[[661,9]]}}}],["get",{"_index":1520,"t":{"212":{"position":[[839,4]]},"353":{"position":[[1102,7]]},"376":{"position":[[1023,7]]}}}],["get(`${this.baseurl}/now",{"_index":2126,"t":{"350":{"position":[[1959,25]]}}}],["get(`${this.baseurl}/rec",{"_index":2104,"t":{"348":{"position":[[2389,30]]},"353":{"position":[[775,30]]}}}],["getbackloggedplay",{"_index":2138,"t":{"353":{"position":[[198,18],[654,18]]}}}],["getnowplay",{"_index":1311,"t":{"180":{"position":[[94,13]]}}}],["getrecentlyplay",{"_index":2112,"t":{"350":{"position":[[710,18],[1045,18]]},"355":{"position":[[1690,17],[2196,18]]}}}],["getrecentlyplayed(opt",{"_index":2122,"t":{"350":{"position":[[1768,26]]}}}],["ghcr.io/foxxmd/multi",{"_index":2319,"t":{"394":{"position":[[195,20]]}}}],["gid",{"_index":2344,"t":{"394":{"position":[[3417,3],[3514,3]]}}}],["git",{"_index":201,"t":{"8":{"position":[[264,4]]},"321":{"position":[[255,3]]},"400":{"position":[[76,3]]},"453":{"position":[[501,3]]},"457":{"position":[[63,3],[111,3]]}}}],["github",{"_index":561,"t":{"47":{"position":[[176,6]]},"394":{"position":[[107,6]]},"424":{"position":[[360,6]]},"453":{"position":[[365,6]]}}}],["give",{"_index":455,"t":{"31":{"position":[[168,5]]},"58":{"position":[[1476,5]]},"208":{"position":[[1215,5]]},"258":{"position":[[122,4]]},"303":{"position":[[351,4]]}}}],["given",{"_index":211,"t":{"8":{"position":[[478,5]]},"80":{"position":[[475,5]]},"108":{"position":[[643,5]]},"114":{"position":[[635,5]]},"148":{"position":[[944,5]]},"258":{"position":[[602,5]]},"329":{"position":[[3119,5],[3367,5]]}}}],["global",{"_index":132,"t":{"4":{"position":[[3578,6]]},"33":{"position":[[333,8]]},"82":{"position":[[637,8]]},"222":{"position":[[14,8]]}}}],["go",{"_index":902,"t":{"92":{"position":[[364,2],[620,2]]},"176":{"position":[[2984,2]]},"208":{"position":[[1854,2]]},"340":{"position":[[450,2]]},"414":{"position":[[448,2]]}}}],["goal",{"_index":612,"t":{"51":{"position":[[1362,4]]}}}],["goc",{"_index":1508,"t":{"210":{"position":[[580,9],[937,9]]}}}],["gocspx",{"_index":1469,"t":{"208":{"position":[[2708,7],[3937,7]]}}}],["good",{"_index":1807,"t":{"258":{"position":[[386,4]]},"261":{"position":[[112,4],[177,4]]},"355":{"position":[[3821,4],[3868,4]]}}}],["goodmus",{"_index":1122,"t":{"130":{"position":[[2496,14],[3113,11]]},"168":{"position":[[2554,11],[3102,11]]}}}],["goodterm",{"_index":1836,"t":{"282":{"position":[[535,10],[573,10],[635,8]]}}}],["googl",{"_index":776,"t":{"73":{"position":[[159,6]]},"98":{"position":[[155,6],[647,6],[690,6]]},"130":{"position":[[2461,8],[3076,7]]},"168":{"position":[[2517,7],[3065,7]]},"208":{"position":[[83,7],[156,6],[1778,6],[3167,6],[3779,6],[4149,6],[4819,6]]},"384":{"position":[[4,6],[456,6]]},"430":{"position":[[152,6]]}}}],["gorillaz",{"_index":2297,"t":{"390":{"position":[[2068,8]]}}}],["gotifi",{"_index":168,"t":{"4":{"position":[[4855,9]]},"22":{"position":[[455,9],[560,9],[641,7],[831,9]]},"430":{"position":[[721,8]]}}}],["gotify://192.168.0.101:8070/mytoken",{"_index":415,"t":{"22":{"position":[[1660,40]]}}}],["gotifyconfig",{"_index":399,"t":{"22":{"position":[[680,12]]}}}],["grab",{"_index":2456,"t":{"432":{"position":[[161,5]]}}}],["grace",{"_index":2446,"t":{"430":{"position":[[968,8]]}}}],["granular",{"_index":2417,"t":{"416":{"position":[[3029,8]]}}}],["greater",{"_index":1096,"t":{"130":{"position":[[31,7]]}}}],["green",{"_index":2298,"t":{"390":{"position":[[2081,5]]}}}],["group",{"_index":1368,"t":{"192":{"position":[[1352,6]]},"256":{"position":[[730,5],[830,5]]},"297":{"position":[[336,5]]}}}],["guarante",{"_index":609,"t":{"51":{"position":[[1260,9],[1287,9]]},"355":{"position":[[3919,9]]}}}],["gui",{"_index":1045,"t":{"106":{"position":[[130,4]]},"112":{"position":[[124,4]]}}}],["guid",{"_index":1970,"t":{"335":{"position":[[42,5]]},"396":{"position":[[24,5],[42,6]]},"412":{"position":[[5,5],[111,5]]},"430":{"position":[[1233,5]]},"438":{"position":[[20,5]]},"448":{"position":[[38,6]]}}}],["guidanc",{"_index":828,"t":{"82":{"position":[[293,9]]}}}],["guy",{"_index":1853,"t":{"297":{"position":[[202,3],[485,3],[589,3],[652,3]]},"301":{"position":[[327,4]]}}}],["gym",{"_index":1597,"t":{"228":{"position":[[516,5],[569,4],[694,5],[747,4],[1229,3],[1346,5],[1475,4],[1641,5]]},"287":{"position":[[112,4],[333,5]]}}}],["handl",{"_index":637,"t":{"56":{"position":[[4,6],[65,7],[302,6],[405,6],[538,7],[815,9],[1081,9]]},"63":{"position":[[139,7],[172,7],[397,6],[543,6],[679,6]]},"174":{"position":[[590,9],[856,9]]},"319":{"position":[[102,7]]},"355":{"position":[[85,6],[161,7],[319,6],[1772,9]]},"430":{"position":[[1004,8],[1054,8],[1603,8]]}}}],["handle(someplay",{"_index":2162,"t":{"355":{"position":[[2861,16],[3539,16]]}}}],["hang",{"_index":700,"t":{"65":{"position":[[731,7]]}}}],["happen",{"_index":2309,"t":{"390":{"position":[[3151,8]]}}}],["hard",{"_index":2264,"t":{"390":{"position":[[280,4]]}}}],["hasn't",{"_index":461,"t":{"31":{"position":[[359,6]]}}}],["have",{"_index":476,"t":{"33":{"position":[[716,6]]},"176":{"position":[[3713,6]]},"355":{"position":[[1224,6],[2654,6]]},"390":{"position":[[468,6]]},"446":{"position":[[0,6]]}}}],["header",{"_index":1431,"t":{"208":{"position":[[765,7]]},"337":{"position":[[378,6]]}}}],["headless",{"_index":1145,"t":{"148":{"position":[[12,8]]}}}],["health",{"_index":418,"t":{"24":{"position":[[31,6],[220,9],[589,7],[695,7]]},"337":{"position":[[224,6]]},"348":{"position":[[1842,7]]}}}],["health?name=mymaloja",{"_index":434,"t":{"24":{"position":[[426,21]]}}}],["health?type=spotifi",{"_index":433,"t":{"24":{"position":[[402,20]]}}}],["healthcheck",{"_index":383,"t":{"20":{"position":[[52,11]]},"430":{"position":[[748,11]]}}}],["heavi",{"_index":729,"t":{"67":{"position":[[1663,5]]}}}],["help",{"_index":948,"t":{"98":{"position":[[365,4],[3360,4]]},"212":{"position":[[861,4],[916,4]]},"267":{"position":[[184,4]]},"376":{"position":[[964,4]]},"390":{"position":[[1284,4]]}}}],["here",{"_index":139,"t":{"4":{"position":[[4014,4]]},"39":{"position":[[237,5]]},"98":{"position":[[1670,6]]},"208":{"position":[[1761,7]]},"220":{"position":[[707,7]]},"340":{"position":[[453,4]]},"344":{"position":[[605,4]]},"394":{"position":[[518,4]]},"396":{"position":[[1099,4]]},"414":{"position":[[297,4],[451,5]]},"418":{"position":[[745,5]]},"420":{"position":[[478,5]]},"424":{"position":[[157,5]]}}}],["heureist",{"_index":2277,"t":{"390":{"position":[[1306,10]]}}}],["heurist",{"_index":1559,"t":{"220":{"position":[[274,10]]},"301":{"position":[[31,10],[240,11]]}}}],["hidden",{"_index":904,"t":{"92":{"position":[[430,7]]}}}],["high",{"_index":847,"t":{"86":{"position":[[255,4]]},"234":{"position":[[98,4]]},"251":{"position":[[5620,4]]}}}],["higher",{"_index":1773,"t":{"254":{"position":[[259,6]]},"263":{"position":[[253,6]]},"321":{"position":[[38,6]]}}}],["highli",{"_index":1432,"t":{"208":{"position":[[819,6]]}}}],["highlight",{"_index":1604,"t":{"230":{"position":[[598,11]]},"418":{"position":[[1575,11],[1638,11]]},"422":{"position":[[792,11],[855,11]]}}}],["hint",{"_index":259,"t":{"12":{"position":[[131,6]]},"342":{"position":[[508,5]]}}}],["histor",{"_index":441,"t":{"26":{"position":[[43,10]]},"436":{"position":[[43,10]]}}}],["histori",{"_index":775,"t":{"73":{"position":[[143,7],[346,7],[377,7],[420,7],[456,7],[504,7],[534,7],[709,7],[821,7],[858,7],[964,7]]},"76":{"position":[[663,7],[1179,9],[1267,7]]},"92":{"position":[[189,8]]},"96":{"position":[[111,8]]},"118":{"position":[[48,7]]},"126":{"position":[[43,7]]},"140":{"position":[[55,7]]},"176":{"position":[[525,7]]},"208":{"position":[[287,7]]},"210":{"position":[[334,7]]},"350":{"position":[[121,8],[189,8]]},"355":{"position":[[368,7],[518,7]]},"390":{"position":[[19,7],[155,9],[1149,8],[1192,8],[1696,7]]}}}],["hit",{"_index":908,"t":{"92":{"position":[[579,3]]},"208":{"position":[[4384,3]]}}}],["home",{"_index":1012,"t":{"100":{"position":[[344,5]]},"130":{"position":[[2470,7],[3084,5]]},"168":{"position":[[2525,5],[3073,5]]},"406":{"position":[[57,4]]}}}],["home/myuser/ms:/config",{"_index":2355,"t":{"396":{"position":[[646,23]]}}}],["home/youruser/multi",{"_index":2204,"t":{"366":{"position":[[661,20],[905,20]]}}}],["hook",{"_index":1535,"t":{"216":{"position":[[197,4],[299,5]]},"218":{"position":[[683,6],[838,4],[995,5],[1015,4],[1032,4]]},"220":{"position":[[5,4],[472,4],[530,5]]},"222":{"position":[[216,5],[305,5],[624,4],[703,4],[1923,5],[2109,4],[2188,4]]},"228":{"position":[[16,5]]},"247":{"position":[[978,4]]},"309":{"position":[[233,4]]},"312":{"position":[[180,4],[259,4]]}}}],["host",{"_index":375,"t":{"18":{"position":[[121,7]]},"22":{"position":[[1615,7]]},"98":{"position":[[869,4],[1015,4]]},"160":{"position":[[364,4],[567,4],[869,4]]},"176":{"position":[[3522,5]]},"192":{"position":[[802,4],[964,4]]},"337":{"position":[[43,6],[719,6]]},"340":{"position":[[766,4],[801,6]]},"372":{"position":[[1602,4],[1980,4]]},"394":{"position":[[743,5],[842,5],[1463,4],[1633,4],[2691,4],[3110,5],[3178,4],[3279,4]]},"396":{"position":[[249,4]]},"412":{"position":[[171,4]]},"426":{"position":[[65,4]]},"430":{"position":[[2376,6]]}}}],["host'",{"_index":1193,"t":{"160":{"position":[[443,6],[1496,6]]}}}],["host/ip",{"_index":354,"t":{"14":{"position":[[3703,7]]}}}],["host:port",{"_index":502,"t":{"35":{"position":[[923,10]]}}}],["hostnam",{"_index":1151,"t":{"148":{"position":[[776,8],[874,8]]}}}],["http",{"_index":264,"t":{"12":{"position":[[244,4],[357,5]]},"67":{"position":[[230,4],[605,4]]},"112":{"position":[[192,4]]},"134":{"position":[[819,11]]},"148":{"position":[[286,4],[867,6]]},"176":{"position":[[1114,8],[1343,5],[2624,5],[2674,4],[2779,5],[3405,5]]},"192":{"position":[[39,6],[70,4],[305,4],[384,4],[503,4],[797,4],[836,4],[958,5],[973,4]]},"196":{"position":[[409,5]]},"416":{"position":[[715,5]]}}}],["http://127.0.0.1:5079/callback",{"_index":1286,"t":{"176":{"position":[[2870,30]]}}}],["http://127.0.0.1:5079/callback?code=xxxxxx",{"_index":1288,"t":{"176":{"position":[[3095,45]]}}}],["http://127.0.0.1:9078/callback",{"_index":1275,"t":{"176":{"position":[[2069,30]]}}}],["http://192.168.0.100:4110",{"_index":498,"t":{"35":{"position":[[633,25],[682,25],[1042,25],[1068,25],[1285,25]]},"37":{"position":[[388,27],[679,27]]},"118":{"position":[[807,27],[1098,27]]},"424":{"position":[[1800,25],[1854,25]]}}}],["http://192.168.0.100:4110/apis/listenbrainz",{"_index":508,"t":{"35":{"position":[[1241,43]]}}}],["http://192.168.0.100:4110/apis/listenbrainz/1",{"_index":505,"t":{"35":{"position":[[1094,45],[1311,45]]}}}],["http://192.168.0.100:42010/admin_apikey",{"_index":2429,"t":{"424":{"position":[[584,41]]}}}],["http://192.168.0.100:6969",{"_index":1985,"t":{"337":{"position":[[729,25]]},"340":{"position":[[821,25]]}}}],["http://192.168.0.100:6969/api",{"_index":1986,"t":{"337":{"position":[[782,29]]}}}],["http://192.168.0.100:80/koito",{"_index":509,"t":{"35":{"position":[[1357,29],[1387,29]]}}}],["http://192.168.0.100:80/koito/apis/listenbrainz/1",{"_index":510,"t":{"35":{"position":[[1417,49]]}}}],["http://192.168.0.100:8070",{"_index":395,"t":{"22":{"position":[[472,28],[887,28]]}}}],["http://192.168.0.100:8080",{"_index":414,"t":{"22":{"position":[[1623,28]]}}}],["http://192.168.0.100:9078",{"_index":2407,"t":{"416":{"position":[[1129,25],[4017,25]]},"426":{"position":[[381,25]]}}}],["http://192.168.0.100:9078/lastfm/callback",{"_index":2418,"t":{"416":{"position":[[3380,41],[3905,43]]},"418":{"position":[[1852,43]]},"422":{"position":[[1069,43]]},"424":{"position":[[971,41]]}}}],["http://192.168.0.100:9991",{"_index":406,"t":{"22":{"position":[[1236,28]]}}}],["http://192.168.0.101",{"_index":1414,"t":{"204":{"position":[[556,20]]}}}],["http://192.168.0.101/my/subfold",{"_index":276,"t":{"12":{"position":[[743,33]]}}}],["http://192.168.0.101/yamahaextendedcontrol/v1",{"_index":1415,"t":{"204":{"position":[[577,45]]}}}],["http://192.168.0.101:3456/jsonprc",{"_index":1069,"t":{"114":{"position":[[864,33]]}}}],["http://192.168.0.101:3456/mcws/v1",{"_index":1055,"t":{"108":{"position":[[882,34]]}}}],["http://192.168.0.101:4000/my/subfolder/lastfm/callback",{"_index":283,"t":{"12":{"position":[[1010,54]]}}}],["http://192.168.0.101:80/lastfm/callback",{"_index":279,"t":{"12":{"position":[[873,39]]}}}],["http://192.168.0.101:8096",{"_index":2373,"t":{"400":{"position":[[1069,28]]}}}],["http://192.168.0.101:9078",{"_index":2330,"t":{"394":{"position":[[1088,27]]}}}],["http://192.168.0.101:9078/callback?code=xxxxxx",{"_index":1292,"t":{"176":{"position":[[3255,50]]}}}],["http://192.168.0.101:9078/lastfm/callback",{"_index":273,"t":{"12":{"position":[[634,41]]}}}],["http://192.168.0.101:9078/my/subfolder/lastfm/callback",{"_index":277,"t":{"12":{"position":[[777,54]]}}}],["http://192.168.0.120:32400",{"_index":1246,"t":{"168":{"position":[[2360,29],[2908,29]]}}}],["http://192.168.0.140:9078",{"_index":2244,"t":{"374":{"position":[[510,26]]}}}],["http://192.168.0.140:9078/api/webscrobbl",{"_index":2238,"t":{"372":{"position":[[2103,42]]}}}],["http://192.168.0.220:9078/lastfm/callback",{"_index":2245,"t":{"374":{"position":[[639,41]]}}}],["http://jriver.mydomain.com:52199/mcws/v1",{"_index":1053,"t":{"108":{"position":[[821,41]]}}}],["http://kodi.mydomain.com:8080/jsonrpc",{"_index":1068,"t":{"114":{"position":[[807,37]]}}}],["http://localhost",{"_index":2243,"t":{"374":{"position":[[398,21]]}}}],["http://localhost:32400",{"_index":1238,"t":{"168":{"position":[[1671,22]]}}}],["http://localhost:4040/airson",{"_index":1321,"t":{"182":{"position":[[273,33],[565,33]]}}}],["http://localhost:42010",{"_index":163,"t":{"4":{"position":[[4745,25]]},"49":{"position":[[279,25],[540,25]]},"146":{"position":[[373,25],[634,25]]},"400":{"position":[[1192,25]]}}}],["http://localhost:52199/mcws/v1",{"_index":1049,"t":{"108":{"position":[[187,31],[769,31]]},"110":{"position":[[96,31]]}}}],["http://localhost:8070",{"_index":169,"t":{"4":{"position":[[4872,24]]}}}],["http://localhost:8080",{"_index":1354,"t":{"192":{"position":[[549,21]]}}}],["http://localhost:8080/jsonrpc",{"_index":1065,"t":{"114":{"position":[[185,29],[759,29]]},"116":{"position":[[94,29],[308,32],[565,32]]}}}],["http://localhost:8096",{"_index":742,"t":{"67":{"position":[[2529,24]]},"69":{"position":[[1084,24]]},"130":{"position":[[1315,21],[2222,24],[2860,24]]}}}],["http://localhost:9078",{"_index":260,"t":{"12":{"position":[[149,21]]},"208":{"position":[[3129,22]]},"444":{"position":[[99,21]]}}}],["http://localhost:9078/2.0",{"_index":1082,"t":{"122":{"position":[[97,26]]}}}],["http://localhost:9078/api/lastfm/myslug",{"_index":1083,"t":{"122":{"position":[[327,39]]}}}],["http://localhost:9078/api/webscrobbl",{"_index":1384,"t":{"196":{"position":[[167,38]]},"198":{"position":[[518,38]]},"372":{"position":[[2061,38]]}}}],["http://localhost:9078/api/webscrobbler/usera",{"_index":1400,"t":{"198":{"position":[[387,44]]}}}],["http://localhost:9078/api/webscrobbler/userb",{"_index":1401,"t":{"198":{"position":[[469,44]]}}}],["http://localhost:9078/api/ytmusic/callback?name=myytm",{"_index":1473,"t":{"208":{"position":[[2955,53]]}}}],["http://localhost:9078/callback",{"_index":123,"t":{"4":{"position":[[2725,33],[4619,32]]},"178":{"position":[[154,30],[428,33],[780,33]]}}}],["http://localhost:9078/lastfm/callback",{"_index":218,"t":{"8":{"position":[[656,39],[1130,39]]},"39":{"position":[[346,37]]},"41":{"position":[[208,37],[634,39],[984,39]]},"67":{"position":[[3642,39]]},"69":{"position":[[2008,39]]},"128":{"position":[[474,39],[824,39]]},"374":{"position":[[598,37]]}}}],["http://localhost:9991",{"_index":180,"t":{"4":{"position":[[5040,24]]}}}],["http://maloja:port",{"_index":2334,"t":{"394":{"position":[[1404,19]]}}}],["http://my.custom.domain/api/ytmusic/callback?name=myytm",{"_index":1482,"t":{"208":{"position":[[3978,57]]}}}],["http://my.domain.loc",{"_index":274,"t":{"12":{"position":[[676,22]]}}}],["http://my.domain.local:9000/lastfm/callback",{"_index":281,"t":{"12":{"position":[[934,43]]}}}],["http://my.domain.local:9078/lastfm/callback",{"_index":275,"t":{"12":{"position":[[699,43]]}}}],["http://mydomain.com/reverseproxy/cast",{"_index":1416,"t":{"204":{"position":[[623,37],[661,37]]}}}],["http://mydomain.com:80/kodireverse/jsonrpc",{"_index":1071,"t":{"114":{"position":[[934,42]]}}}],["http://myicecast.com/radio",{"_index":1038,"t":{"102":{"position":[[1356,29]]},"104":{"position":[[180,28],[377,28]]}}}],["http://mymalojaserverip/admin_apikey",{"_index":570,"t":{"47":{"position":[[400,38]]}}}],["http://mymultiscrobblerip:9078/1",{"_index":1128,"t":{"134":{"position":[[242,33],[459,33]]},"416":{"position":[[2084,33]]}}}],["http://mymultiscrobblerip:9078/1/submit",{"_index":1127,"t":{"134":{"position":[[102,39]]}}}],["http://mymultiscrobblerip:9078/api/listenbrainz/myslug",{"_index":1133,"t":{"134":{"position":[[642,54]]}}}],["http://some_ip:7000/subfolder/api",{"_index":1937,"t":{"329":{"position":[[1101,33]]}}}],["http://your_jellyin_url/web/index.html#!/apikeys.html",{"_index":1098,"t":{"130":{"position":[[163,55]]}}}],["http://yourmultiscrobblerdomain/health",{"_index":419,"t":{"24":{"position":[[77,38]]}}}],["https://192.168.0.101",{"_index":284,"t":{"12":{"position":[[1065,21]]}}}],["https://192.168.0.101:443/lastfm/callback",{"_index":285,"t":{"12":{"position":[[1087,41]]}}}],["https://airsonic.foxx.exampl",{"_index":746,"t":{"67":{"position":[[2784,31]]}}}],["https://api.listenbrainz.org",{"_index":552,"t":{"45":{"position":[[166,29],[427,30],[738,30]]},"142":{"position":[[465,30],[776,30]]}}}],["https://bsky.app/settings/app",{"_index":668,"t":{"60":{"position":[[77,29]]}}}],["https://developer.spotify.com",{"_index":1258,"t":{"176":{"position":[[599,29]]}}}],["https://echo.multi",{"_index":1301,"t":{"176":{"position":[[3926,18]]}}}],["https://en.wikipedia.org/wiki/list_of_tz_database_time_zon",{"_index":2325,"t":{"394":{"position":[[523,60]]},"396":{"position":[[1104,60]]},"414":{"position":[[302,60]]}}}],["https://github.com/foxxmd/multi",{"_index":1903,"t":{"321":{"position":[[265,31]]},"400":{"position":[[86,31]]}}}],["https://github.com/patrickkfkan/volumio",{"_index":1428,"t":{"208":{"position":[[602,39]]}}}],["https://koito.mydomain.com",{"_index":506,"t":{"35":{"position":[[1140,26],[1167,26]]}}}],["https://koito.mydomain.com/apis/listenbrainz/1",{"_index":507,"t":{"35":{"position":[[1194,46]]}}}],["https://maloja.foxx.exampl",{"_index":756,"t":{"67":{"position":[[3235,30]]},"69":{"position":[[1629,30]]}}}],["https://maloja.fred.exampl",{"_index":758,"t":{"67":{"position":[[3353,30]]},"69":{"position":[[1729,30]]}}}],["https://maloja.mary.exampl",{"_index":760,"t":{"67":{"position":[[3471,30]]},"69":{"position":[[1829,30]]}}}],["https://musicbrainz.org",{"_index":1691,"t":{"241":{"position":[[720,24],[945,23]]}}}],["https://my.mb.mirror.domain.com",{"_index":1692,"t":{"241":{"position":[[1037,33]]}}}],["https://scrobbler.mydomain.com",{"_index":1270,"t":{"176":{"position":[[1603,30]]}}}],["https://scrobbler.mydomain.com/callback",{"_index":1272,"t":{"176":{"position":[[1739,39]]}}}],["https://www.google.com/devic",{"_index":1495,"t":{"208":{"position":[[5185,29]]}}}],["https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copi",{"_index":1430,"t":{"208":{"position":[[682,67]]}}}],["icecast",{"_index":779,"t":{"73":{"position":[[208,7]]},"102":{"position":[[24,7],[145,7],[443,7],[633,7],[774,7],[1109,7],[1258,7],[1505,7]]},"104":{"position":[[82,7],[417,9]]},"430":{"position":[[177,7]]}}}],["icecast_url",{"_index":1042,"t":{"104":{"position":[[66,11]]}}}],["ici",{"_index":1039,"t":{"102":{"position":[[1397,7],[1611,3]]}}}],["icon",{"_index":488,"t":{"35":{"position":[[242,5],[330,4]]},"92":{"position":[[417,4]]},"424":{"position":[[1413,5],[1501,4]]}}}],["id",{"_index":541,"t":{"41":{"position":[[348,3]]},"176":{"position":[[4142,3]]},"208":{"position":[[2184,3],[2495,2],[2914,3]]},"210":{"position":[[152,2]]},"251":{"position":[[1114,2]]},"331":{"position":[[422,3],[456,2]]},"374":{"position":[[18,2]]},"394":{"position":[[3478,2],[3498,2]]}}}],["id/secret",{"_index":1257,"t":{"176":{"position":[[579,10],[3732,9],[4078,9]]},"416":{"position":[[591,9]]}}}],["id3",{"_index":1362,"t":{"192":{"position":[[1048,3]]},"212":{"position":[[348,3]]}}}],["ideal",{"_index":2066,"t":{"346":{"position":[[420,7]]},"390":{"position":[[3295,8]]}}}],["identifi",{"_index":672,"t":{"63":{"position":[[12,10],[412,10],[894,13],[1145,13]]},"168":{"position":[[300,10]]},"190":{"position":[[894,13],[1103,13],[1333,13],[1798,13],[2113,13]]},"220":{"position":[[579,8]]},"241":{"position":[[58,8]]},"247":{"position":[[184,8]]},"340":{"position":[[1110,8],[1653,10],[1685,11]]}}}],["idl",{"_index":1498,"t":{"208":{"position":[[5421,4]]}}}],["ie",{"_index":39,"t":{"4":{"position":[[615,2],[1529,2],[1650,2],[3212,2],[3333,2]]},"24":{"position":[[399,2]]},"33":{"position":[[603,2]]},"130":{"position":[[1312,2]]},"168":{"position":[[1668,2]]},"208":{"position":[[3558,2]]},"212":{"position":[[418,2],[525,2]]},"226":{"position":[[699,2]]},"297":{"position":[[446,2],[546,2],[611,2]]},"329":{"position":[[2319,2],[2664,2]]},"350":{"position":[[2164,2]]},"355":{"position":[[485,2]]},"394":{"position":[[62,3]]},"412":{"position":[[541,3]]},"453":{"position":[[559,2]]}}}],["if/when",{"_index":800,"t":{"76":{"position":[[584,7]]},"230":{"position":[[43,7]]}}}],["ignor",{"_index":1163,"t":{"150":{"position":[[299,8]]},"190":{"position":[[398,8]]},"390":{"position":[[876,8]]},"412":{"position":[[575,6]]}}}],["ignoreinvalidcert",{"_index":1247,"t":{"168":{"position":[[2667,20],[3215,20]]}}}],["ii",{"_index":1613,"t":{"230":{"position":[[811,2]]}}}],["imag",{"_index":54,"t":{"4":{"position":[[820,6]]},"14":{"position":[[3268,6]]},"176":{"position":[[2638,6]]},"247":{"position":[[1384,6]]},"309":{"position":[[633,6]]},"394":{"position":[[15,6],[90,6],[383,6]]},"396":{"position":[[964,6]]},"414":{"position":[[162,6]]},"430":{"position":[[1179,6]]},"453":{"position":[[520,5]]},"455":{"position":[[29,5]]}}}],["immedi",{"_index":1542,"t":{"218":{"position":[[43,11],[281,11]]},"355":{"position":[[1014,11]]},"366":{"position":[[1076,12]]},"376":{"position":[[1085,11]]}}}],["implement",{"_index":790,"t":{"76":{"position":[[12,11]]},"180":{"position":[[49,10],[488,15]]},"329":{"position":[[1002,9],[1735,9],[2983,9]]},"335":{"position":[[149,11]]},"340":{"position":[[1977,10],[2054,10],[2081,10]]},"348":{"position":[[13,9],[97,9],[1431,9],[2080,9]]},"350":{"position":[[214,10],[569,11],[688,9],[3043,11]]},"353":{"position":[[188,9],[923,10]]},"355":{"position":[[1399,9],[1677,12],[1717,9],[1959,10],[2601,14]]},"384":{"position":[[244,15]]}}}],["import",{"_index":289,"t":{"14":{"position":[[50,9]]},"130":{"position":[[514,9]]},"340":{"position":[[227,6],[274,6],[1278,6],[1370,6]]},"342":{"position":[[164,6],[259,6],[305,6]]},"344":{"position":[[301,6]]},"346":{"position":[[179,6],[206,6],[285,6]]},"348":{"position":[[323,6],[1509,6],[1543,6],[2147,6],[2181,6]]},"350":{"position":[[1536,6],[1570,6]]},"353":{"position":[[332,6],[366,6]]},"355":{"position":[[824,6]]},"418":{"position":[[1661,10]]},"422":{"position":[[878,10]]}}}],["importantli",{"_index":1874,"t":{"303":{"position":[[874,12]]},"337":{"position":[[165,11]]}}}],["imposs",{"_index":2260,"t":{"384":{"position":[[606,10]]}}}],["improv",{"_index":2276,"t":{"390":{"position":[[1289,7]]}}}],["incentiv",{"_index":1662,"t":{"234":{"position":[[917,12]]},"236":{"position":[[314,12]]}}}],["includ",{"_index":192,"t":{"6":{"position":[[245,8]]},"35":{"position":[[871,7]]},"41":{"position":[[282,7]]},"51":{"position":[[778,8]]},"56":{"position":[[73,9],[323,7]]},"58":{"position":[[860,8]]},"63":{"position":[[147,9],[461,7]]},"96":{"position":[[203,7]]},"98":{"position":[[307,7],[3091,7],[3316,7]]},"102":{"position":[[196,7],[1194,7],[1461,7]]},"118":{"position":[[340,7]]},"144":{"position":[[224,7]]},"174":{"position":[[157,7]]},"188":{"position":[[158,7]]},"192":{"position":[[2284,7]]},"208":{"position":[[3652,7]]},"247":{"position":[[154,7]]},"256":{"position":[[1235,8],[1701,8]]},"263":{"position":[[308,7]]},"267":{"position":[[311,7]]},"280":{"position":[[735,7]]},"307":{"position":[[405,7]]},"323":{"position":[[79,8]]},"384":{"position":[[493,7]]},"390":{"position":[[2692,9],[3268,9]]},"404":{"position":[[81,9]]},"453":{"position":[[240,7]]}}}],["incognito/priv",{"_index":1433,"t":{"208":{"position":[[864,17]]},"376":{"position":[[1050,17]]}}}],["incom",{"_index":2146,"t":{"355":{"position":[[107,8]]}}}],["inconsist",{"_index":1423,"t":{"208":{"position":[[311,12]]},"390":{"position":[[252,12],[383,13],[660,12],[855,12]]}}}],["incorrectli",{"_index":998,"t":{"98":{"position":[[2610,11]]},"192":{"position":[[1975,11]]},"212":{"position":[[489,11]]},"386":{"position":[[51,11]]}}}],["independ",{"_index":596,"t":{"51":{"position":[[593,12]]},"58":{"position":[[675,12]]},"430":{"position":[[1324,11]]}}}],["index.j",{"_index":1993,"t":{"340":{"position":[[327,13]]}}}],["indi",{"_index":1667,"t":{"234":{"position":[[1039,6]]},"236":{"position":[[436,6]]}}}],["indic",{"_index":837,"t":{"84":{"position":[[317,8]]},"353":{"position":[[248,10]]},"355":{"position":[[598,8]]}}}],["individu",{"_index":465,"t":{"33":{"position":[[108,10],[957,12]]},"67":{"position":[[162,10],[326,10],[514,10],[701,10],[889,10]]},"228":{"position":[[311,10],[1376,10]]},"234":{"position":[[1280,11],[1313,10]]},"238":{"position":[[184,11],[217,10]]},"247":{"position":[[110,10],[1088,10]]},"256":{"position":[[69,11]]},"267":{"position":[[499,10]]},"278":{"position":[[148,10],[350,10]]},"280":{"position":[[76,10]]},"309":{"position":[[79,10],[343,10]]}}}],["info",{"_index":173,"t":{"4":{"position":[[4939,7],[5163,7]]},"22":{"position":[[771,4],[960,7],[1124,4],[1358,7]]},"86":{"position":[[989,4]]},"90":{"position":[[225,4]]},"152":{"position":[[64,4]]},"325":{"position":[[0,4]]},"329":{"position":[[997,4],[1730,4],[2978,4]]},"331":{"position":[[577,4]]},"348":{"position":[[1867,4],[1936,4]]},"350":{"position":[[1399,4]]},"353":{"position":[[903,4]]},"355":{"position":[[2415,4]]},"366":{"position":[[1000,4]]},"372":{"position":[[380,4],[635,4]]},"394":{"position":[[3116,4]]},"424":{"position":[[1885,4]]}}}],["inform",{"_index":442,"t":{"26":{"position":[[54,11]]},"51":{"position":[[1439,11]]},"71":{"position":[[40,11]]},"92":{"position":[[65,12]]},"96":{"position":[[671,11]]},"98":{"position":[[319,11],[3239,11]]},"102":{"position":[[127,11],[348,11]]},"176":{"position":[[4109,11]]},"180":{"position":[[546,11]]},"192":{"position":[[1066,11],[1142,11],[1258,11],[1322,11],[1928,11],[2003,11]]},"234":{"position":[[177,11]]},"256":{"position":[[1648,11]]},"331":{"position":[[78,11]]},"337":{"position":[[531,11],[947,11]]},"350":{"position":[[506,11],[1363,11]]},"353":{"position":[[122,11]]},"372":{"position":[[237,11],[1583,12],[2497,11]]},"384":{"position":[[334,11]]},"402":{"position":[[124,11]]},"424":{"position":[[1054,11]]},"428":{"position":[[466,11]]},"432":{"position":[[172,11]]},"434":{"position":[[40,11]]},"436":{"position":[[54,11]]}}}],["ingest",{"_index":2158,"t":{"355":{"position":[[2628,6]]}}}],["ingress",{"_index":371,"t":{"18":{"position":[[40,7],[89,7],[194,7]]},"73":{"position":[[412,7],[496,7],[850,7]]},"76":{"position":[[175,7]]},"319":{"position":[[205,7]]},"329":{"position":[[1664,7]]},"337":{"position":[[979,7]]},"355":{"position":[[1155,7]]},"372":{"position":[[18,7],[399,9],[424,9],[654,9],[679,9]]}}}],["inherit",{"_index":1914,"t":{"325":{"position":[[290,10]]},"329":{"position":[[11,7]]},"340":{"position":[[1908,10]]},"350":{"position":[[624,8]]}}}],["initi",{"_index":870,"t":{"86":{"position":[[1911,8]]},"102":{"position":[[700,8]]},"222":{"position":[[360,9]]},"251":{"position":[[2045,7]]},"329":{"position":[[131,11],[2084,14]]},"457":{"position":[[37,7]]}}}],["initiali",{"_index":2469,"t":{"455":{"position":[[234,8]]}}}],["innaccuraci",{"_index":1740,"t":{"251":{"position":[[1372,13]]}}}],["input",{"_index":1412,"t":{"204":{"position":[[70,7]]}}}],["insecur",{"_index":1206,"t":{"160":{"position":[[1318,9]]},"176":{"position":[[1088,8]]}}}],["insensit",{"_index":227,"t":{"8":{"position":[[1231,11]]},"150":{"position":[[329,12]]},"152":{"position":[[332,12]]}}}],["insid",{"_index":1829,"t":{"280":{"position":[[69,6]]},"350":{"position":[[1038,6]]},"394":{"position":[[1305,6]]}}}],["instal",{"_index":60,"t":{"4":{"position":[[1013,12],[1277,12],[1360,7],[2092,13],[2937,12],[3044,7],[3720,13]]},"8":{"position":[[800,13]]},"49":{"position":[[114,12]]},"108":{"position":[[510,12]]},"114":{"position":[[502,12]]},"160":{"position":[[517,13]]},"196":{"position":[[6,10]]},"321":{"position":[[48,9],[155,9],[220,7],[416,7]]},"323":{"position":[[209,9],[391,7]]},"359":{"position":[[0,7],[16,7]]},"366":{"position":[[1014,7],[1066,9]]},"368":{"position":[[16,7]]},"394":{"position":[[2580,10]]},"398":{"position":[[6,12]]},"400":{"position":[[41,7],[205,7]]},"402":{"position":[[28,8]]},"406":{"position":[[406,9]]},"416":{"position":[[2136,13],[2184,13]]},"428":{"position":[[50,7],[73,12]]},"430":{"position":[[1158,7]]},"440":{"position":[[8,12]]},"457":{"position":[[45,12]]}}}],["instanc",{"_index":350,"t":{"14":{"position":[[3502,8]]},"35":{"position":[[607,9]]},"43":{"position":[[320,8]]},"67":{"position":[[1371,8]]},"130":{"position":[[437,8]]},"140":{"position":[[419,9]]},"168":{"position":[[84,9]]},"176":{"position":[[2536,9],[3221,8]]},"278":{"position":[[159,9]]},"282":{"position":[[494,9]]},"337":{"position":[[692,8]]},"372":{"position":[[1232,8]]},"390":{"position":[[984,9]]},"416":{"position":[[2582,9]]},"424":{"position":[[1774,9]]}}}],["instead",{"_index":236,"t":{"8":{"position":[[1452,8]]},"102":{"position":[[906,7]]},"108":{"position":[[597,8]]},"114":{"position":[[589,8]]},"152":{"position":[[86,7],[526,7]]},"176":{"position":[[1897,7]]},"180":{"position":[[441,7]]},"218":{"position":[[1227,8]]},"251":{"position":[[3435,8]]},"258":{"position":[[696,7]]},"272":{"position":[[65,7]]},"297":{"position":[[521,7]]},"348":{"position":[[1881,7]]},"355":{"position":[[1666,7]]},"372":{"position":[[1903,7]]},"416":{"position":[[3181,8]]}}}],["instruct",{"_index":960,"t":{"98":{"position":[[977,12]]},"126":{"position":[[325,12]]},"172":{"position":[[17,12]]},"176":{"position":[[856,12],[2970,13],[3014,12]]},"186":{"position":[[17,12]]},"208":{"position":[[584,12],[1313,12],[1743,12]]},"366":{"position":[[100,12]]},"376":{"position":[[1166,12]]},"394":{"position":[[778,12],[877,12]]},"416":{"position":[[170,12],[667,12],[759,12]]},"418":{"position":[[228,12]]},"426":{"position":[[80,12]]}}}],["integr",{"_index":921,"t":{"96":{"position":[[12,12]]},"98":{"position":[[539,13]]},"148":{"position":[[318,11]]},"208":{"position":[[112,11]]},"382":{"position":[[214,11]]},"384":{"position":[[16,11]]}}}],["intel/amd",{"_index":2312,"t":{"394":{"position":[[40,11]]}}}],["intend",{"_index":1668,"t":{"234":{"position":[[1087,8],[1265,8]]},"238":{"position":[[169,8]]}}}],["intention",{"_index":937,"t":{"96":{"position":[[594,13]]}}}],["interact",{"_index":1944,"t":{"329":{"position":[[1514,11],[2278,11],[2722,11]]},"331":{"position":[[676,10]]},"342":{"position":[[861,11]]}}}],["interaction/consider",{"_index":2461,"t":{"453":{"position":[[95,25]]}}}],["intercept",{"_index":1277,"t":{"176":{"position":[[2398,11]]}}}],["interest",{"_index":1665,"t":{"234":{"position":[[977,10]]},"236":{"position":[[374,10]]},"256":{"position":[[120,10]]}}}],["interfac",{"_index":1044,"t":{"106":{"position":[[81,9]]},"112":{"position":[[76,9]]},"160":{"position":[[20,9],[253,9]]},"192":{"position":[[46,9],[75,10],[210,9],[228,10],[252,9],[341,9],[359,10],[508,9],[594,9],[697,9],[2023,10]]},"325":{"position":[[205,10]]},"327":{"position":[[102,10],[156,9]]},"331":{"position":[[534,10]]},"337":{"position":[[117,9]]},"340":{"position":[[28,9],[465,9],[877,9],[975,9],[1164,9],[1195,10],[1967,9]]},"346":{"position":[[441,9],[542,10]]},"372":{"position":[[2027,9]]},"374":{"position":[[186,9],[204,9],[488,9]]},"430":{"position":[[914,9]]}}}],["intern",{"_index":424,"t":{"24":{"position":[[165,8]]},"176":{"position":[[1175,8]]},"234":{"position":[[1050,13]]},"236":{"position":[[447,13]]},"342":{"position":[[662,9],[747,9]]},"344":{"position":[[1408,9]]},"355":{"position":[[188,11]]},"394":{"position":[[1337,8]]},"416":{"position":[[1442,8]]}}}],["internalconfig",{"_index":2023,"t":{"342":{"position":[[314,15],[672,15]]}}}],["internet",{"_index":1391,"t":{"196":{"position":[[584,9]]}}}],["interpol",{"_index":194,"t":{"8":{"position":[[58,11],[1243,13],[1706,13]]}}}],["interpret",{"_index":583,"t":{"51":{"position":[[266,9]]},"58":{"position":[[348,9]]}}}],["interv",{"_index":124,"t":{"4":{"position":[[2759,11]]},"67":{"position":[[1569,11],[1618,8]]},"69":{"position":[[501,11]]},"178":{"position":[[462,11],[814,11]]}}}],["introduc",{"_index":2463,"t":{"453":{"position":[[181,9]]}}}],["intruct",{"_index":556,"t":{"47":{"position":[[70,11]]},"424":{"position":[[254,11]]}}}],["intuit",{"_index":1588,"t":{"226":{"position":[[663,11]]}}}],["invalid",{"_index":1435,"t":{"208":{"position":[[925,11],[1256,12]]},"376":{"position":[[159,11],[811,10],[1008,11]]}}}],["invok",{"_index":1928,"t":{"329":{"position":[[291,7],[1051,6],[1546,7],[1786,6],[3033,6]]}}}],["involv",{"_index":1299,"t":{"176":{"position":[[3772,8]]}}}],["io.github.foxxmd.multiscrobbl",{"_index":2211,"t":{"368":{"position":[[113,31]]}}}],["io.github.foxxmd.multiscrobbler.yml",{"_index":2176,"t":{"361":{"position":[[68,35]]},"366":{"position":[[950,35]]}}}],["ip",{"_index":513,"t":{"35":{"position":[[1590,2]]},"168":{"position":[[362,2]]},"176":{"position":[[1184,3]]},"372":{"position":[[1827,2]]},"394":{"position":[[2681,2],[2718,2]]},"396":{"position":[[189,2]]},"412":{"position":[[197,2]]},"424":{"position":[[2298,2]]}}}],["ipv4/v6",{"_index":1179,"t":{"156":{"position":[[167,7]]}}}],["isn't",{"_index":606,"t":{"51":{"position":[[1169,5]]},"58":{"position":[[1243,5]]},"234":{"position":[[884,5]]},"236":{"position":[[281,5]]}}}],["iso2",{"_index":1792,"t":{"256":{"position":[[978,4]]}}}],["iso8601",{"_index":2073,"t":{"346":{"position":[[888,7]]}}}],["isrc",{"_index":1736,"t":{"251":{"position":[[1042,4],[1181,4]]}}}],["issu",{"_index":3,"t":{"2":{"position":[[34,6]]},"16":{"position":[[211,5]]},"24":{"position":[[530,6]]},"96":{"position":[[143,5]]},"98":{"position":[[270,5],[347,5],[381,6],[3198,7],[3379,6]]},"180":{"position":[[156,6]]},"192":{"position":[[2242,5]]},"208":{"position":[[482,6]]},"267":{"position":[[202,6],[279,5],[338,5]]},"372":{"position":[[1317,5],[1407,6]]},"384":{"position":[[408,6],[633,6]]},"388":{"position":[[20,5]]},"390":{"position":[[1224,7],[1269,6],[1354,6],[2676,5],[3253,5],[3339,6]]},"400":{"position":[[675,5]]},"446":{"position":[[7,6],[82,6]]}}}],["it'",{"_index":588,"t":{"51":{"position":[[400,5]]},"58":{"position":[[482,5]]},"80":{"position":[[657,4]]},"92":{"position":[[425,4]]},"176":{"position":[[3631,4]]},"218":{"position":[[726,4]]},"224":{"position":[[982,4]]},"251":{"position":[[1425,4]]},"258":{"position":[[748,4]]}}}],["itself",{"_index":133,"t":{"4":{"position":[[3600,7]]},"222":{"position":[[390,6]]}}}],["i’m",{"_index":2283,"t":{"390":{"position":[[1802,3]]}}}],["javascript",{"_index":1461,"t":{"208":{"position":[[2271,10]]},"430":{"position":[[2,10]]}}}],["javascript'",{"_index":1841,"t":{"282":{"position":[[917,12]]}}}],["jellyfin",{"_index":702,"t":{"65":{"position":[[838,8]]},"67":{"position":[[2392,11]]},"71":{"position":[[136,9]]},"73":{"position":[[240,8]]},"130":{"position":[[14,8],[84,8],[428,8],[482,8],[789,8],[1033,8],[1296,8],[1663,9],[1753,9],[3311,10]]},"247":{"position":[[1314,8],[1764,8],[1861,8]]},"274":{"position":[[514,8]]},"276":{"position":[[549,8]]},"309":{"position":[[563,8],[881,8],[978,8]]},"355":{"position":[[1207,9],[1603,9]]},"396":{"position":[[94,8]]},"400":{"position":[[941,11]]},"412":{"position":[[317,9]]},"416":{"position":[[96,8],[147,8],[370,8],[504,8]]},"418":{"position":[[896,8]]},"422":{"position":[[113,8]]},"430":{"position":[[185,8]]},"434":{"position":[[188,9]]}}}],["jellyfin.json",{"_index":819,"t":{"80":{"position":[[183,13]]},"274":{"position":[[536,13]]},"276":{"position":[[571,13]]}}}],["jellyfin/plex",{"_index":1945,"t":{"329":{"position":[[1678,13]]},"337":{"position":[[999,13]]}}}],["jellyfin_apikey",{"_index":1109,"t":{"130":{"position":[[1393,15]]},"394":{"position":[[587,16]]}}}],["jellyfin_apikey=c9fae8756fbf481ebd9c5bb56b",{"_index":1718,"t":{"247":{"position":[[1617,42]]},"309":{"position":[[744,42]]},"416":{"position":[[384,42]]}}}],["jellyfin_apikey=c9fae8756fbf481ebd9c5bb56bd6540c",{"_index":2351,"t":{"396":{"position":[[399,50],[1167,48]]},"400":{"position":[[723,48]]}}}],["jellyfin_devices_allow",{"_index":1114,"t":{"130":{"position":[[1788,22]]}}}],["jellyfin_devices_block",{"_index":1115,"t":{"130":{"position":[[1863,22]]}}}],["jellyfin_libraries_allow",{"_index":1102,"t":{"130":{"position":[[855,24],[1948,24]]}}}],["jellyfin_libraries_block",{"_index":1116,"t":{"130":{"position":[[2034,24]]}}}],["jellyfin_password",{"_index":1110,"t":{"130":{"position":[[1491,17]]}}}],["jellyfin_transforms=musicbrainz",{"_index":1720,"t":{"247":{"position":[[1685,31]]},"418":{"position":[[1047,31]]},"422":{"position":[[264,31]]}}}],["jellyfin_transforms=n",{"_index":1882,"t":{"309":{"position":[[812,26]]}}}],["jellyfin_url",{"_index":1107,"t":{"130":{"position":[[1264,12]]},"394":{"position":[[607,13]]}}}],["jellyfin_url=192.168.0.101:8096",{"_index":2352,"t":{"396":{"position":[[453,33],[1218,31]]},"400":{"position":[[772,31]]}}}],["jellyfin_url=192.168.0.110:8096",{"_index":1717,"t":{"247":{"position":[[1583,31]]},"309":{"position":[[710,31]]},"416":{"position":[[329,31]]}}}],["jellyfin_us",{"_index":1108,"t":{"130":{"position":[[1337,13]]},"394":{"position":[[624,14]]}}}],["jellyfin_user=myus",{"_index":1719,"t":{"247":{"position":[[1662,20]]},"309":{"position":[[789,20]]},"396":{"position":[[490,22],[1252,20]]},"400":{"position":[[804,20]]},"416":{"position":[[464,20]]}}}],["jellyfin_users_allow",{"_index":1099,"t":{"130":{"position":[[652,21],[1599,20]]}}}],["jellyfin_users_block",{"_index":1112,"t":{"130":{"position":[[1689,20]]}}}],["join",{"_index":1755,"t":{"251":{"position":[[3284,8]]}}}],["joiner",{"_index":1867,"t":{"301":{"position":[[514,6],[591,6]]},"316":{"position":[[73,7]]}}}],["journey",{"_index":1524,"t":{"214":{"position":[[100,7]]}}}],["jq0t1mbbkl",{"_index":492,"t":{"35":{"position":[[400,10]]},"424":{"position":[[1571,10]]}}}],["jriver",{"_index":780,"t":{"73":{"position":[[273,6]]},"106":{"position":[[49,6],[123,6]]},"108":{"position":[[27,7],[388,6],[730,7]]},"110":{"position":[[143,6],[687,8]]},"430":{"position":[[194,6]]}}}],["jriver.mydomain.com",{"_index":1052,"t":{"108":{"position":[[801,19]]}}}],["jriver_password",{"_index":1059,"t":{"110":{"position":[[223,15]]}}}],["jriver_url",{"_index":1057,"t":{"110":{"position":[[81,10]]}}}],["jriver_usernam",{"_index":1058,"t":{"110":{"position":[[157,15]]}}}],["json",{"_index":13,"t":{"4":{"position":[[95,4],[127,4],[2074,6]]},"8":{"position":[[104,4],[342,4],[914,4],[1293,5]]},"24":{"position":[[478,4]]},"51":{"position":[[411,6],[752,4]]},"58":{"position":[[493,6],[834,4]]},"348":{"position":[[2539,4]]},"379":{"position":[[291,4]]},"430":{"position":[[1153,4]]}}}],["jsonlint",{"_index":2255,"t":{"379":{"position":[[388,8]]}}}],["jtrnwqwd__xmjf8st3jc",{"_index":731,"t":{"67":{"position":[[1768,23],[1938,23],[2295,23]]},"69":{"position":[[615,23],[769,23],[929,23]]}}}],["keep",{"_index":195,"t":{"8":{"position":[[150,4]]},"39":{"position":[[308,4]]},"76":{"position":[[905,5]]},"208":{"position":[[1567,4]]},"218":{"position":[[522,4]]},"251":{"position":[[5609,4]]},"316":{"position":[[127,4]]},"350":{"position":[[298,4]]},"355":{"position":[[2235,5]]},"376":{"position":[[721,4]]},"430":{"position":[[1894,4],[2278,4]]}}}],["key",{"_index":225,"t":{"8":{"position":[[1217,4]]},"22":{"position":[[1724,7]]},"35":{"position":[[171,3],[255,4],[273,3],[311,3],[355,3]]},"37":{"position":[[102,3]]},"41":{"position":[[105,3]]},"47":{"position":[[388,4],[452,3],[484,3],[537,3]]},"49":{"position":[[150,3]]},"53":{"position":[[244,3]]},"56":{"position":[[618,3],[767,6],[1033,6]]},"130":{"position":[[53,3],[158,4],[251,3],[306,3],[376,3],[1420,3]]},"174":{"position":[[542,6],[808,6]]},"192":{"position":[[907,4]]},"247":{"position":[[1069,5]]},"309":{"position":[[324,5]]},"327":{"position":[[326,5]]},"416":{"position":[[205,4],[433,3],[3466,3]]},"424":{"position":[[572,4],[639,3],[671,3],[1342,3],[1426,4],[1444,3],[1482,3],[1526,3]]}}}],["keys/environment",{"_index":246,"t":{"8":{"position":[[1720,18]]}}}],["keyword",{"_index":1334,"t":{"190":{"position":[[502,7]]}}}],["kfa",{"_index":1493,"t":{"208":{"position":[[5125,3]]}}}],["kind",{"_index":803,"t":{"76":{"position":[[697,4]]},"196":{"position":[[719,4]]},"263":{"position":[[82,5]]}}}],["kitchensink",{"_index":100,"t":{"4":{"position":[[2199,11],[3824,11]]},"428":{"position":[[350,11]]}}}],["know",{"_index":603,"t":{"51":{"position":[[985,5]]},"56":{"position":[[292,4]]},"58":{"position":[[1063,5]]},"63":{"position":[[387,4]]},"69":{"position":[[66,5]]},"98":{"position":[[1804,4]]},"251":{"position":[[5271,4]]},"265":{"position":[[62,4]]},"342":{"position":[[524,4]]},"355":{"position":[[2986,4]]},"430":{"position":[[1555,7]]}}}],["knower",{"_index":2282,"t":{"390":{"position":[[1793,6]]}}}],["known",{"_index":598,"t":{"51":{"position":[[826,5]]},"58":{"position":[[908,5]]},"180":{"position":[[150,5]]},"278":{"position":[[203,5]]},"329":{"position":[[3185,5]]}}}],["kodi",{"_index":781,"t":{"73":{"position":[[304,4]]},"112":{"position":[[49,4],[119,4]]},"114":{"position":[[27,5],[384,4],[722,5]]},"116":{"position":[[139,4],[656,6]]},"430":{"position":[[201,4]]}}}],["kodi.mydomain.com",{"_index":1067,"t":{"114":{"position":[[789,17]]}}}],["kodi_password",{"_index":1074,"t":{"116":{"position":[[185,13]]}}}],["kodi_url",{"_index":1072,"t":{"116":{"position":[[81,8]]}}}],["kodi_usernam",{"_index":1073,"t":{"116":{"position":[[151,13]]}}}],["koito",{"_index":447,"t":{"28":{"position":[[42,5]]},"35":{"position":[[54,5],[77,5],[100,5],[185,5],[429,5],[486,5],[535,5],[708,5],[761,5],[802,5],[898,5],[1483,5],[1546,5]]},"37":{"position":[[116,5],[150,5],[199,5],[259,6],[550,6],[718,7]]},"73":{"position":[[333,5]]},"76":{"position":[[1111,6]]},"118":{"position":[[23,5],[147,5],[170,5],[193,5],[463,5],[510,5],[612,5],[678,6],[969,6],[1137,7]]},"265":{"position":[[310,7]]},"274":{"position":[[204,7]]},"412":{"position":[[435,5]]},"424":{"position":[[178,5],[1271,5],[1356,5],[1600,5],[1653,5],[1702,5],[2191,5],[2254,5]]},"430":{"position":[[90,6],[206,5],[516,5]]}}}],["koito_allowed_host",{"_index":512,"t":{"35":{"position":[[1563,19]]},"424":{"position":[[2271,19]]}}}],["koito_token",{"_index":514,"t":{"37":{"position":[[82,11]]}}}],["koito_token=mytoken",{"_index":2434,"t":{"424":{"position":[[2117,19]]}}}],["koito_url",{"_index":499,"t":{"35":{"position":[[662,9],[986,9]]},"37":{"position":[[165,9]]}}}],["koito_url=myurl",{"_index":2436,"t":{"424":{"position":[[2159,15]]}}}],["koito_us",{"_index":495,"t":{"35":{"position":[[459,11]]},"37":{"position":[[130,10]]}}}],["koito_user=myus",{"_index":2435,"t":{"424":{"position":[[2139,17]]}}}],["label",{"_index":1101,"t":{"130":{"position":[[818,8]]},"168":{"position":[[1454,8]]}}}],["languag",{"_index":1651,"t":{"234":{"position":[[707,10]]},"236":{"position":[[104,10]]}}}],["larg",{"_index":1669,"t":{"234":{"position":[[1107,5]]},"238":{"position":[[11,5]]},"261":{"position":[[355,5]]}}}],["largest",{"_index":1677,"t":{"234":{"position":[[1486,7]]},"238":{"position":[[390,7]]}}}],["last",{"_index":1346,"t":{"190":{"position":[[1191,9]]},"230":{"position":[[192,4]]},"390":{"position":[[1760,4]]},"455":{"position":[[186,4]]}}}],["last.fm",{"_index":197,"t":{"8":{"position":[[176,7],[489,7]]},"26":{"position":[[133,8]]},"28":{"position":[[17,7]]},"39":{"position":[[58,7],[83,7],[172,8],[190,7]]},"51":{"position":[[1200,7]]},"58":{"position":[[1274,7]]},"65":{"position":[[304,7]]},"73":{"position":[[362,7],[393,7]]},"76":{"position":[[1122,7]]},"120":{"position":[[97,7],[139,8],[157,7],[220,7],[246,7]]},"122":{"position":[[76,7],[148,7],[229,7]]},"126":{"position":[[26,7],[130,8],[148,7],[237,8],[255,7],[370,7]]},"128":{"position":[[76,7],[125,7],[229,7]]},"190":{"position":[[1019,8],[1916,9],[2231,9]]},"251":{"position":[[1615,8],[1645,7]]},"350":{"position":[[152,7]]},"355":{"position":[[296,8],[548,9]]},"382":{"position":[[28,7],[86,7],[206,7]]},"412":{"position":[[351,7]]},"416":{"position":[[128,7],[3078,7],[3235,7],[3256,7],[3335,8],[3695,7],[4077,7]]},"418":{"position":[[928,7]]},"422":{"position":[[145,7]]},"424":{"position":[[170,7],[926,8]]},"430":{"position":[[63,8],[212,7],[220,7],[522,7],[2153,7],[2401,7]]},"436":{"position":[[133,8]]},"444":{"position":[[267,7]]}}}],["last.fm'",{"_index":827,"t":{"82":{"position":[[274,9]]}}}],["last.fm/listenbrainz",{"_index":2455,"t":{"430":{"position":[[2087,21]]}}}],["lastfm",{"_index":258,"t":{"12":{"position":[[97,6],[479,6],[576,6]]},"41":{"position":[[1035,8]]},"67":{"position":[[3540,9]]},"128":{"position":[[875,8]]},"230":{"position":[[684,7]]},"412":{"position":[[412,7]]}}}],["lastfm.json",{"_index":212,"t":{"8":{"position":[[510,11],[946,11]]},"216":{"position":[[367,11]]},"218":{"position":[[1295,11]]},"284":{"position":[[62,11]]},"416":{"position":[[3525,11]]},"418":{"position":[[1509,11]]},"422":{"position":[[726,11]]}}}],["lastfm/callback",{"_index":537,"t":{"41":{"position":[[290,15]]}}}],["lastfm_api_key",{"_index":533,"t":{"41":{"position":[[82,14]]}}}],["lastfm_api_key=myapikey",{"_index":2430,"t":{"424":{"position":[[1211,23]]}}}],["lastfm_redirect_uri",{"_index":536,"t":{"41":{"position":[[185,19]]}}}],["lastfm_secret",{"_index":534,"t":{"41":{"position":[[131,13]]}}}],["lastfm_secret=myapisecret",{"_index":2431,"t":{"424":{"position":[[1237,25]]}}}],["lastfm_sess",{"_index":539,"t":{"41":{"position":[[322,14]]}}}],["later",{"_index":1547,"t":{"218":{"position":[[629,5],[855,5]]},"416":{"position":[[1067,6],[3955,6]]}}}],["latest",{"_index":2470,"t":{"457":{"position":[[96,6]]}}}],["launch",{"_index":1909,"t":{"323":{"position":[[98,6]]}}}],["lead",{"_index":1759,"t":{"251":{"position":[[5213,4]]}}}],["learn",{"_index":1248,"t":{"170":{"position":[[264,5]]},"184":{"position":[[343,5]]},"428":{"position":[[121,5],[294,5]]}}}],["leav",{"_index":237,"t":{"8":{"position":[[1469,5]]},"208":{"position":[[2251,5],[2387,5]]}}}],["left",{"_index":487,"t":{"35":{"position":[[237,4]]},"192":{"position":[[136,4]]},"424":{"position":[[1408,4]]}}}],["length",{"_index":832,"t":{"82":{"position":[[595,6]]},"86":{"position":[[62,6]]},"102":{"position":[[804,7]]},"176":{"position":[[258,6]]},"204":{"position":[[140,7]]},"224":{"position":[[570,7]]}}}],["less",{"_index":950,"t":{"98":{"position":[[489,4]]},"350":{"position":[[1434,4]]}}}],["let'",{"_index":1522,"t":{"214":{"position":[[7,5]]}}}],["level",{"_index":239,"t":{"8":{"position":[[1516,6]]},"18":{"position":[[351,5]]},"22":{"position":[[261,5]]},"222":{"position":[[79,5]]},"226":{"position":[[543,5]]},"261":{"position":[[227,5]]}}}],["lfm",{"_index":1085,"t":{"124":{"position":[[108,3],[278,3]]}}}],["lfm/lz",{"_index":2338,"t":{"394":{"position":[[2182,6]]}}}],["lfm_slug",{"_index":1087,"t":{"124":{"position":[[219,8]]}}}],["lfmendpoint_en",{"_index":1084,"t":{"124":{"position":[[82,18]]}}}],["librari",{"_index":698,"t":{"65":{"position":[[631,7],[670,7],[769,7]]},"106":{"position":[[207,10]]},"130":{"position":[[798,9],[2000,9],[2086,9]]},"168":{"position":[[1346,9],[1435,9],[2117,9],[2199,9]]},"208":{"position":[[1476,7]]},"376":{"position":[[583,7]]},"390":{"position":[[2997,7]]},"416":{"position":[[2967,7]]}}}],["librariesallow",{"_index":737,"t":{"67":{"position":[[2114,17],[2349,17]]},"69":{"position":[[851,17],[983,17]]},"130":{"position":[[837,14],[2478,17],[3093,17]]},"168":{"position":[[1473,14],[2534,17],[3082,17]]}}}],["librariesblock",{"_index":1123,"t":{"130":{"position":[[2511,17],[3128,17]]},"168":{"position":[[2569,17],[3117,17]]}}}],["licens",{"_index":1661,"t":{"234":{"position":[[904,9]]},"236":{"position":[[301,9]]}}}],["lifecycl",{"_index":1511,"t":{"212":{"position":[[201,10]]},"214":{"position":[[23,9]]},"216":{"position":[[220,9]]},"218":{"position":[[584,9],[642,9]]}}}],["limit",{"_index":818,"t":{"80":{"position":[[3,5]]},"98":{"position":[[1073,11]]},"208":{"position":[[893,5]]},"241":{"position":[[14,9]]},"301":{"position":[[147,7]]},"376":{"position":[[969,5]]},"382":{"position":[[10,10]]}}}],["line",{"_index":1357,"t":{"192":{"position":[[763,4],[953,4]]},"261":{"position":[[786,4]]},"386":{"position":[[164,5]]}}}],["link",{"_index":840,"t":{"84":{"position":[[433,4]]},"86":{"position":[[1117,4]]},"208":{"position":[[5160,4],[5460,4]]},"224":{"position":[[660,6]]},"376":{"position":[[514,4]]},"444":{"position":[[406,4]]}}}],["lint",{"_index":1910,"t":{"323":{"position":[[241,7]]}}}],["linux",{"_index":961,"t":{"98":{"position":[[990,5],[1139,5]]},"160":{"position":[[70,5],[106,5]]},"372":{"position":[[549,5],[760,5]]},"394":{"position":[[737,5],[836,5],[3104,5],[3172,5]]},"396":{"position":[[304,5]]},"404":{"position":[[67,5]]},"426":{"position":[[59,5]]},"430":{"position":[[322,6]]}}}],["list",{"_index":481,"t":{"33":{"position":[[1175,4],[1266,4]]},"51":{"position":[[880,4]]},"58":{"position":[[958,4]]},"76":{"position":[[1326,5]]},"98":{"position":[[2238,4],[2740,4]]},"100":{"position":[[330,5],[441,4],[521,5],[624,4]]},"130":{"position":[[1639,4],[1729,4],[1830,4],[1905,4],[1992,4],[2078,4]]},"150":{"position":[[193,4]]},"152":{"position":[[231,5]]},"162":{"position":[[202,4],[279,4]]},"168":{"position":[[593,4],[1780,4],[1862,4],[1955,4],[2026,4],[2109,4],[2191,4]]},"180":{"position":[[703,4]]},"190":{"position":[[33,5],[216,4]]},"202":{"position":[[241,4],[330,4]]},"247":{"position":[[309,4]]},"251":{"position":[[378,4]]},"301":{"position":[[232,4]]},"303":{"position":[[66,4],[182,4],[211,4],[378,4],[473,4],[519,4],[1272,5],[1311,4]]},"329":{"position":[[312,7]]},"337":{"position":[[440,5]]},"340":{"position":[[1181,4],[1671,4]]},"350":{"position":[[2515,4]]},"353":{"position":[[871,4]]},"355":{"position":[[2970,4],[4040,4]]},"390":{"position":[[165,4],[232,4],[598,4],[641,4],[750,4],[847,4],[1770,5]]},"416":{"position":[[2814,4]]},"434":{"position":[[364,4]]}}}],["listen",{"_index":797,"t":{"76":{"position":[[292,9],[634,9],[653,9],[715,9],[823,8],[1257,9]]},"82":{"position":[[30,9],[115,10],[143,8],[208,8],[486,8],[552,8]]},"84":{"position":[[182,9]]},"86":{"position":[[124,9],[1659,8]]},"88":{"position":[[292,9],[312,9]]},"92":{"position":[[179,9]]},"96":{"position":[[101,9]]},"102":{"position":[[573,9],[928,9]]},"134":{"position":[[142,7]]},"148":{"position":[[244,6]]},"160":{"position":[[171,9],[238,6],[1520,9]]},"204":{"position":[[190,9]]},"208":{"position":[[277,9]]},"212":{"position":[[618,6]]},"214":{"position":[[132,8],[499,6]]},"251":{"position":[[5486,6],[5781,8]]},"319":{"position":[[168,6]]},"331":{"position":[[63,6],[264,6]]},"350":{"position":[[332,9],[2702,8]]},"355":{"position":[[3405,6]]},"390":{"position":[[1001,6],[2728,9],[2836,9],[2874,9],[2934,8]]},"412":{"position":[[363,9]]},"416":{"position":[[76,9]]},"424":{"position":[[77,9]]},"430":{"position":[[39,8],[1656,6]]},"434":{"position":[[88,8]]}}}],["listen:6644,reuseaddr,fork",{"_index":1215,"t":{"160":{"position":[[1610,26]]}}}],["listenbrainz",{"_index":445,"t":{"26":{"position":[[142,15]]},"28":{"position":[[27,12]]},"43":{"position":[[55,12],[85,12],[181,12],[211,12],[265,12]]},"45":{"position":[[780,14]]},"51":{"position":[[1211,13]]},"58":{"position":[[1285,13]]},"65":{"position":[[956,12]]},"73":{"position":[[436,12],[472,12]]},"76":{"position":[[1097,13]]},"132":{"position":[[97,12],[144,13],[167,12],[235,12],[266,12]]},"134":{"position":[[76,12],[174,12],[539,12],[707,12],[752,12]]},"136":{"position":[[5,12]]},"140":{"position":[[23,12],[154,12],[184,12],[280,12],[310,12],[364,12]]},"142":{"position":[[76,12],[130,12],[239,12],[818,14]]},"180":{"position":[[356,12],[410,12]]},"265":{"position":[[326,13]]},"350":{"position":[[135,12]]},"355":{"position":[[282,13],[533,14]]},"372":{"position":[[115,12]]},"416":{"position":[[1357,13],[1629,12],[1657,12],[1700,12],[2384,12],[2426,12]]},"430":{"position":[[72,13],[239,12],[252,12],[530,12],[2176,12]]},"436":{"position":[[142,15]]}}}],["listenbrainz.baseurl",{"_index":1131,"t":{"134":{"position":[[405,20]]},"416":{"position":[[2030,20]]}}}],["listenbrainzfoxx",{"_index":754,"t":{"67":{"position":[[3080,19]]},"69":{"position":[[1480,19]]}}}],["liter",{"_index":1832,"t":{"282":{"position":[[69,8]]}}}],["live",{"_index":522,"t":{"37":{"position":[[464,4],[774,4]]},"41":{"position":[[722,4],[1092,4]]},"45":{"position":[[506,4],[843,4]]},"49":{"position":[[377,4],[658,4]]},"56":{"position":[[893,4],[1180,4]]},"63":{"position":[[1014,4],[1285,4]]},"86":{"position":[[1612,4]]},"88":{"position":[[602,4],[888,4]]},"94":{"position":[[398,4],[720,4]]},"100":{"position":[[841,4],[1108,4]]},"104":{"position":[[257,4],[475,4]]},"110":{"position":[[489,4],[744,4]]},"116":{"position":[[436,4],[711,4]]},"118":{"position":[[883,4],[1193,4]]},"124":{"position":[[445,4],[656,4]]},"128":{"position":[[562,4],[932,4]]},"130":{"position":[[2728,4],[3370,4]]},"138":{"position":[[524,4],[735,4]]},"142":{"position":[[544,4],[881,4]]},"146":{"position":[[471,4],[752,4]]},"154":{"position":[[259,4],[532,4]]},"158":{"position":[[349,4],[632,4]]},"162":{"position":[[533,4],[780,4]]},"166":{"position":[[376,4],[628,4]]},"168":{"position":[[2744,4],[3310,4]]},"174":{"position":[[668,4],[955,4]]},"178":{"position":[[525,4],[898,4]]},"182":{"position":[[432,4],[746,4]]},"190":{"position":[[1976,4],[2311,4]]},"194":{"position":[[301,4],[535,4]]},"202":{"position":[[524,4],[771,4]]},"206":{"position":[[281,4],[499,4]]},"210":{"position":[[670,4],[1048,4]]}}}],["live|remast",{"_index":1846,"t":{"287":{"position":[[180,15]]}}}],["load",{"_index":559,"t":{"47":{"position":[[157,10]]},"241":{"position":[[547,4]]},"424":{"position":[[341,10]]}}}],["local",{"_index":70,"t":{"4":{"position":[[1271,5],[2931,5]]},"14":{"position":[[3346,5]]},"160":{"position":[[463,5],[511,5],[780,5]]},"168":{"position":[[244,5],[259,5],[356,5],[629,5],[799,5],[1005,5],[1304,5]]},"176":{"position":[[1356,7],[2228,5]]},"196":{"position":[[627,5]]},"321":{"position":[[91,7]]},"430":{"position":[[1201,7]]}}}],["local/nod",{"_index":59,"t":{"4":{"position":[[1002,10]]}}}],["localhost",{"_index":1050,"t":{"108":{"position":[[575,9]]},"114":{"position":[[567,9]]},"148":{"position":[[885,9]]},"154":{"position":[[137,12],[390,12]]},"176":{"position":[[1161,9]]},"196":{"position":[[333,10]]},"372":{"position":[[1914,9]]},"374":{"position":[[563,9]]},"412":{"position":[[545,10],[654,10]]}}}],["localhost:6600",{"_index":1183,"t":{"158":{"position":[[93,14]]}}}],["localhost:8080",{"_index":1379,"t":{"194":{"position":[[93,14],[212,17],[429,17]]}}}],["localhost:9078",{"_index":532,"t":{"39":{"position":[[395,14]]}}}],["locat",{"_index":65,"t":{"4":{"position":[[1167,7],[1980,7],[2827,7]]},"51":{"position":[[832,8]]},"58":{"position":[[914,8]]},"176":{"position":[[2286,8]]},"204":{"position":[[434,7]]},"364":{"position":[[155,7]]},"396":{"position":[[166,7]]},"430":{"position":[[2383,9]]}}}],["lock.json",{"_index":2197,"t":{"366":{"position":[[332,9],[518,9]]}}}],["log",{"_index":238,"t":{"8":{"position":[[1496,3]]},"12":{"position":[[123,7]]},"16":{"position":[[107,3],[242,4],[347,4]]},"92":{"position":[[204,7]]},"98":{"position":[[3107,4],[3304,7],[3324,3]]},"192":{"position":[[1829,4],[2272,7],[2309,4]]},"208":{"position":[[2852,3],[5034,6],[5356,3]]},"210":{"position":[[326,3]]},"230":{"position":[[7,3],[121,4],[126,6],[266,6],[454,6],[585,4]]},"267":{"position":[[148,7],[299,7],[323,4],[479,6],[659,6]]},"327":{"position":[[507,7]]},"329":{"position":[[638,3]]},"372":{"position":[[233,3],[313,4],[882,4],[1164,4],[1428,8],[1458,7],[2419,5],[2474,4]]},"379":{"position":[[39,5]]},"384":{"position":[[439,7],[501,4],[559,6]]},"386":{"position":[[105,4]]},"388":{"position":[[43,7]]},"390":{"position":[[1688,3],[2205,8],[2234,4],[2283,3],[2296,4],[2498,4],[2521,4],[3225,4],[3278,4],[3319,5]]},"426":{"position":[[596,3]]},"430":{"position":[[963,4]]},"444":{"position":[[38,5]]}}}],["logauthupdatechang",{"_index":1442,"t":{"208":{"position":[[1159,23],[2749,23],[4052,23]]}}}],["logdiff",{"_index":1443,"t":{"208":{"position":[[1189,10],[2779,10],[4082,10]]},"210":{"position":[[606,10],[963,10]]},"390":{"position":[[1491,7],[1592,10],[2427,10]]}}}],["logfilenamepattern",{"_index":1375,"t":{"192":{"position":[[1889,22]]}}}],["logfilterfailur",{"_index":146,"t":{"4":{"position":[[4141,19]]},"130":{"position":[[2652,19],[3272,19]]},"168":{"position":[[2638,19],[3186,19]]}}}],["logic",{"_index":1892,"t":{"319":{"position":[[128,6]]}}}],["login",{"_index":892,"t":{"92":{"position":[[59,5]]},"168":{"position":[[387,7]]},"176":{"position":[[590,5]]},"208":{"position":[[1769,5]]},"404":{"position":[[185,6]]},"408":{"position":[[248,5]]}}}],["logpayload",{"_index":145,"t":{"4":{"position":[[4120,13]]},"98":{"position":[[3556,13]]},"130":{"position":[[2632,13],[3252,13]]},"168":{"position":[[2618,13],[3166,13]]}}}],["logplayerst",{"_index":148,"t":{"4":{"position":[[4169,17]]}}}],["logtofil",{"_index":2301,"t":{"390":{"position":[[2334,9],[2444,12]]}}}],["long",{"_index":1526,"t":{"214":{"position":[[144,4]]},"350":{"position":[[1381,4],[1471,4],[2714,4]]}}}],["longer",{"_index":1262,"t":{"176":{"position":[[1074,6],[1207,6]]},"208":{"position":[[1386,6]]},"402":{"position":[[44,6]]}}}],["look",{"_index":202,"t":{"8":{"position":[[290,4]]},"63":{"position":[[432,4]]},"192":{"position":[[1730,4]]},"216":{"position":[[44,5]]},"247":{"position":[[1184,4]]},"251":{"position":[[4080,5]]},"309":{"position":[[438,4]]},"342":{"position":[[556,5]]},"353":{"position":[[886,5]]},"372":{"position":[[321,5]]},"416":{"position":[[67,4]]}}}],["lookup",{"_index":1336,"t":{"190":{"position":[[626,6]]}}}],["lose",{"_index":460,"t":{"31":{"position":[[338,4]]}}}],["lost",{"_index":2336,"t":{"394":{"position":[[1736,4]]}}}],["lower",{"_index":1806,"t":{"258":{"position":[[334,5]]}}}],["ltj",{"_index":1614,"t":{"230":{"position":[[843,3]]}}}],["lua",{"_index":1352,"t":{"192":{"position":[[373,3],[380,3]]}}}],["lz",{"_index":549,"t":{"45":{"position":[[116,2],[144,2],[217,2]]},"138":{"position":[[107,2],[230,2],[358,2]]}}}],["lz_token",{"_index":548,"t":{"45":{"position":[[82,8]]}}}],["lz_url",{"_index":551,"t":{"45":{"position":[[156,6]]}}}],["lz_user",{"_index":550,"t":{"45":{"position":[[127,7]]}}}],["lze_slug",{"_index":1141,"t":{"138":{"position":[[299,8]]}}}],["lze_token",{"_index":1140,"t":{"138":{"position":[[217,9]]},"416":{"position":[[2479,9]]}}}],["lze_token=mycooltoken",{"_index":2409,"t":{"416":{"position":[[1900,21]]}}}],["lze_transforms=musicbrainz",{"_index":2427,"t":{"418":{"position":[[1332,26]]},"422":{"position":[[549,26]]}}}],["lzendpoint_en",{"_index":1139,"t":{"138":{"position":[[82,17]]}}}],["machin",{"_index":956,"t":{"98":{"position":[[874,7],[1020,7]]},"108":{"position":[[538,7]]},"114":{"position":[[530,7]]},"176":{"position":[[1987,7],[2368,7],[2577,7]]},"350":{"position":[[233,7],[558,7],[968,7],[2607,7]]},"355":{"position":[[52,7],[682,7],[1576,7]]},"372":{"position":[[1788,7],[2189,7],[2389,8]]},"374":{"position":[[336,7]]},"394":{"position":[[1006,7],[2609,7],[2696,8]]},"396":{"position":[[254,7]]},"412":{"position":[[176,7],[494,7]]}}}],["made",{"_index":1553,"t":{"218":{"position":[[1258,4]]},"220":{"position":[[13,4]]},"256":{"position":[[1120,4]]},"329":{"position":[[2504,4]]}}}],["magic",{"_index":986,"t":{"98":{"position":[[1794,9]]}}}],["main",{"_index":1324,"t":{"188":{"position":[[62,4]]},"192":{"position":[[223,4],[354,4]]},"394":{"position":[[753,4],[852,4]]}}}],["mainstream",{"_index":1647,"t":{"234":{"position":[[587,10],[944,10]]},"236":{"position":[[341,10]]}}}],["major",{"_index":969,"t":{"98":{"position":[[1133,5]]},"102":{"position":[[168,8]]},"251":{"position":[[1366,5]]},"256":{"position":[[1759,8]]},"350":{"position":[[4,8]]},"453":{"position":[[140,8]]}}}],["major/minor",{"_index":2462,"t":{"453":{"position":[[152,11]]}}}],["majorli",{"_index":1924,"t":{"327":{"position":[[468,7]]}}}],["make",{"_index":295,"t":{"14":{"position":[[113,4]]},"24":{"position":[[308,4]]},"67":{"position":[[264,4],[639,4],[2213,6],[2235,4],[2449,6],[2471,4]]},"76":{"position":[[197,5]]},"92":{"position":[[116,4]]},"108":{"position":[[404,4]]},"114":{"position":[[398,4]]},"136":{"position":[[136,4]]},"148":{"position":[[762,4]]},"160":{"position":[[976,4],[1543,4]]},"168":{"position":[[25,4]]},"208":{"position":[[4370,4],[4418,4]]},"251":{"position":[[686,4],[818,6]]},"329":{"position":[[1814,4],[3165,4]]},"366":{"position":[[168,4]]},"372":{"position":[[2313,4]]},"390":{"position":[[271,5]]},"416":{"position":[[1981,6],[2323,6],[2523,4],[3445,4]]}}}],["maloja",{"_index":42,"t":{"4":{"position":[[626,6],[1662,6],[3345,6],[4682,9]]},"26":{"position":[[125,7]]},"28":{"position":[[50,6]]},"47":{"position":[[8,6],[57,6],[511,6]]},"49":{"position":[[601,8]]},"65":{"position":[[99,6]]},"67":{"position":[[3186,9],[3304,9],[3422,9]]},"73":{"position":[[520,6]]},"144":{"position":[[28,6],[52,6],[76,6]]},"146":{"position":[[76,6],[124,6],[228,6],[695,8]]},"247":{"position":[[1325,6],[1822,6]]},"309":{"position":[[574,6],[939,6]]},"394":{"position":[[1295,6],[1389,6]]},"396":{"position":[[110,6]]},"400":{"position":[[1145,9]]},"412":{"position":[[420,7]]},"424":{"position":[[163,6],[192,6],[241,6]]},"430":{"position":[[55,7],[276,6],[543,6]]},"436":{"position":[[125,7]]}}}],["maloja'",{"_index":557,"t":{"47":{"position":[[88,8]]},"424":{"position":[[272,8]]}}}],["maloja.json",{"_index":112,"t":{"4":{"position":[[2493,11]]}}}],["maloja_api_key",{"_index":574,"t":{"49":{"position":[[127,14]]},"394":{"position":[[676,15]]}}}],["maloja_api_key=1234",{"_index":58,"t":{"4":{"position":[[964,19]]},"396":{"position":[[578,21],[1349,19]]}}}],["maloja_api_key=myapikey",{"_index":1722,"t":{"247":{"position":[[1872,23]]},"309":{"position":[[989,23]]},"424":{"position":[[871,23]]}}}],["maloja_force_password=change_m",{"_index":563,"t":{"47":{"position":[[213,31]]},"424":{"position":[[397,31]]}}}],["maloja_url",{"_index":573,"t":{"49":{"position":[[82,10]]}}}],["maloja_url=\"http://domain.tld",{"_index":2370,"t":{"400":{"position":[[825,30]]}}}],["maloja_url=http://192.168.0.100:42010",{"_index":1721,"t":{"247":{"position":[[1782,37]]},"309":{"position":[[899,37]]},"424":{"position":[[831,37]]}}}],["maloja_url=http://domain.tld",{"_index":2354,"t":{"396":{"position":[[544,30]]}}}],["maloja_url=http://domain.tld:42010",{"_index":57,"t":{"4":{"position":[[927,34]]},"396":{"position":[[1312,34]]}}}],["maloja_url=http://maloja:42010",{"_index":2326,"t":{"394":{"position":[[642,30]]}}}],["malojadata",{"_index":564,"t":{"47":{"position":[[291,12]]},"424":{"position":[[475,12]]}}}],["malojadata/dock",{"_index":558,"t":{"47":{"position":[[125,19]]},"424":{"position":[[309,19]]}}}],["manag",{"_index":1901,"t":{"321":{"position":[[144,6]]},"404":{"position":[[30,7]]},"410":{"position":[[85,9]]},"430":{"position":[[1749,6]]}}}],["mani",{"_index":75,"t":{"4":{"position":[[1453,4],[1475,4],[3136,4],[3158,4]]},"96":{"position":[[87,4]]},"98":{"position":[[1177,4]]},"148":{"position":[[67,4]]},"212":{"position":[[159,4]]},"234":{"position":[[764,4]]},"236":{"position":[[161,4]]},"251":{"position":[[5436,4]]},"337":{"position":[[131,4]]},"390":{"position":[[2255,4]]},"418":{"position":[[332,4]]},"420":{"position":[[65,4]]},"430":{"position":[[122,4],[503,4],[1680,4]]}}}],["manual",{"_index":862,"t":{"86":{"position":[[1045,9],[1902,8]]},"98":{"position":[[758,8]]},"100":{"position":[[18,8]]},"102":{"position":[[1434,8]]},"176":{"position":[[2461,8]]},"366":{"position":[[47,8]]}}}],["map",{"_index":402,"t":{"22":{"position":[[791,9],[1144,9]]},"394":{"position":[[2077,3]]}}}],["mari",{"_index":689,"t":{"65":{"position":[[68,4],[287,4],[548,4]]},"67":{"position":[[2045,4]]}}}],["mark",{"_index":1752,"t":{"251":{"position":[[2135,6]]}}}],["maryapikey",{"_index":761,"t":{"67":{"position":[[3512,12],[3589,13]]},"69":{"position":[[1870,12],[1955,13]]}}}],["marylfm",{"_index":762,"t":{"67":{"position":[[3558,10]]},"69":{"position":[[1924,10]]}}}],["marymaloja",{"_index":720,"t":{"67":{"position":[[1231,15],[1903,15],[3440,13]]},"69":{"position":[[274,15],[734,15],[1798,13]]}}}],["maryplex",{"_index":735,"t":{"67":{"position":[[1880,11]]},"69":{"position":[[711,11]]}}}],["marysecret",{"_index":763,"t":{"67":{"position":[[3613,13]]},"69":{"position":[[1979,13]]}}}],["maryspot",{"_index":719,"t":{"67":{"position":[[1208,11]]},"69":{"position":[[251,11]]}}}],["maryus",{"_index":736,"t":{"67":{"position":[[2006,13]]},"69":{"position":[[837,13]]}}}],["match",{"_index":21,"t":{"4":{"position":[[218,5]]},"8":{"position":[[382,8],[1632,8]]},"51":{"position":[[1591,7],[1738,8]]},"108":{"position":[[430,7]]},"114":{"position":[[424,7]]},"148":{"position":[[801,5]]},"150":{"position":[[219,7]]},"190":{"position":[[294,9]]},"192":{"position":[[1378,8],[1502,7]]},"198":{"position":[[64,7],[560,7]]},"212":{"position":[[96,8]]},"220":{"position":[[363,5]]},"226":{"position":[[1361,5]]},"228":{"position":[[243,5],[550,8],[632,8],[728,8],[810,8],[892,5],[969,5],[1457,7]]},"234":{"position":[[22,7],[83,5],[140,5]]},"243":{"position":[[31,8]]},"247":{"position":[[533,8],[736,7]]},"249":{"position":[[146,8],[310,7],[356,5]]},"251":{"position":[[994,8],[1157,5],[1466,8],[1523,5],[2275,7],[5094,5],[5549,7],[5630,7],[5730,6]]},"254":{"position":[[5,5],[186,8],[234,7]]},"256":{"position":[[222,5],[493,6],[1203,7],[1776,7],[1806,8],[1997,5]]},"258":{"position":[[168,7],[210,7],[291,5],[362,6],[484,8],[525,5]]},"261":{"position":[[130,8],[154,5],[295,5]]},"263":{"position":[[156,5],[267,5],[395,8],[441,5],[537,7]]},"265":{"position":[[31,5],[218,7]]},"267":{"position":[[32,7],[75,5]]},"274":{"position":[[150,5],[229,5]]},"276":{"position":[[177,7],[789,5]]},"282":{"position":[[59,7],[203,7],[227,6],[366,5],[484,5],[690,7]]},"287":{"position":[[94,7]]},"303":{"position":[[456,7]]},"418":{"position":[[39,5],[690,7]]},"420":{"position":[[423,7]]},"430":{"position":[[1940,5]]},"453":{"position":[[536,5]]}}}],["max",{"_index":717,"t":{"67":{"position":[[1133,3]]}}}],["maxpollretri",{"_index":154,"t":{"4":{"position":[[4251,17]]},"67":{"position":[[45,17]]}}}],["maxrequestretri",{"_index":156,"t":{"4":{"position":[[4272,20],[4342,20]]},"67":{"position":[[180,20],[555,20],[1089,20]]}}}],["mayb",{"_index":1826,"t":{"274":{"position":[[462,5]]}}}],["mb_contact",{"_index":1697,"t":{"247":{"position":[[166,10]]}}}],["mb_contact=contact@mydomain.com",{"_index":1698,"t":{"247":{"position":[[211,31],[1461,31]]}}}],["mb_contact=mycoolname@emailprovider.com",{"_index":2425,"t":{"418":{"position":[[611,39]]},"420":{"position":[[344,39]]}}}],["mb_preset",{"_index":1699,"t":{"247":{"position":[[275,10]]}}}],["mb_presets=sensible,n",{"_index":1715,"t":{"247":{"position":[[1495,26]]},"418":{"position":[[700,26]]},"420":{"position":[[433,26]]}}}],["mbid",{"_index":1576,"t":{"224":{"position":[[644,7]]},"234":{"position":[[515,5]]},"245":{"position":[[435,5]]},"251":{"position":[[91,5],[590,5]]},"265":{"position":[[243,5]]},"274":{"position":[[811,5]]}}}],["mc_password",{"_index":1229,"t":{"166":{"position":[[145,11]]}}}],["mc_url",{"_index":1228,"t":{"166":{"position":[[82,6]]}}}],["mcast_url",{"_index":1417,"t":{"206":{"position":[[82,9]]}}}],["mdn",{"_index":955,"t":{"98":{"position":[[843,5],[849,4],[934,4]]}}}],["mean",{"_index":30,"t":{"4":{"position":[[408,5]]},"51":{"position":[[1112,7]]},"58":{"position":[[1186,7]]},"108":{"position":[[306,5]]},"114":{"position":[[302,5]]},"148":{"position":[[659,5]]},"208":{"position":[[96,5]]},"251":{"position":[[1324,5],[5066,5]]},"303":{"position":[[1201,5]]},"372":{"position":[[38,5],[1299,5]]},"379":{"position":[[281,5]]}}}],["mechan",{"_index":2152,"t":{"355":{"position":[[1241,9]]}}}],["media",{"_index":939,"t":{"98":{"position":[[8,5],[1559,5],[1617,5],[1739,5],[1818,5],[1936,5],[1988,5],[2000,5],[2032,5],[2189,5],[2451,5],[2483,5],[2525,5],[2565,5],[2632,5],[2878,5],[2968,5],[3038,5]]},"106":{"position":[[155,5],[179,5]]},"108":{"position":[[479,5]]},"130":{"position":[[774,5],[1027,5],[1102,5]]},"160":{"position":[[157,5],[297,5]]},"168":{"position":[[1415,5]]},"337":{"position":[[60,5]]},"386":{"position":[[77,5],[138,5],[216,5],[294,5],[363,5],[407,5]]}}}],["meet",{"_index":811,"t":{"76":{"position":[[988,5]]}}}],["memori",{"_index":299,"t":{"14":{"position":[[188,6],[2038,7]]}}}],["memorysourc",{"_index":2021,"t":{"342":{"position":[[266,12],[378,12],[485,12]]},"346":{"position":[[382,12]]},"348":{"position":[[403,12],[1663,12],[2301,12]]},"350":{"position":[[584,12],[949,12],[1025,12],[1730,12]]},"353":{"position":[[485,12]]},"355":{"position":[[928,12],[1584,12]]}}}],["memorysource.j",{"_index":2022,"t":{"342":{"position":[[284,20]]}}}],["mendhak/http",{"_index":1279,"t":{"176":{"position":[[2611,12],[2766,12],[3392,12]]}}}],["mention",{"_index":1066,"t":{"114":{"position":[[477,9]]},"251":{"position":[[2239,9]]}}}],["menu",{"_index":1348,"t":{"192":{"position":[[102,4]]}}}],["messag",{"_index":400,"t":{"22":{"position":[[737,7],[1090,7]]},"24":{"position":[[496,8]]},"348":{"position":[[2607,7]]}}}],["met",{"_index":869,"t":{"86":{"position":[[1815,4]]},"254":{"position":[[179,3]]}}}],["meta",{"_index":1575,"t":{"224":{"position":[[588,7],[639,4]]},"228":{"position":[[1067,4]]},"230":{"position":[[985,4]]},"245":{"position":[[402,7]]},"265":{"position":[[255,4],[606,7]]},"274":{"position":[[257,4],[760,7]]},"346":{"position":[[935,5]]}}}],["metadata",{"_index":325,"t":{"14":{"position":[[1843,10],[2372,11],[3798,11]]},"51":{"position":[[1471,8]]},"98":{"position":[[1652,8]]},"102":{"position":[[6,8],[204,8],[263,8],[1117,8],[1266,8],[1513,8]]},"164":{"position":[[99,8],[343,8]]},"166":{"position":[[129,8]]},"192":{"position":[[2263,8]]},"234":{"position":[[534,9]]},"274":{"position":[[797,8]]},"331":{"position":[[271,8]]},"388":{"position":[[34,8]]}}}],["metdata",{"_index":613,"t":{"51":{"position":[[1394,7]]}}}],["method",{"_index":29,"t":{"4":{"position":[[401,6]]},"76":{"position":[[100,7]]},"90":{"position":[[36,7],[146,7]]},"92":{"position":[[240,7]]},"160":{"position":[[1308,6]]},"176":{"position":[[1245,7],[1869,6]]},"208":{"position":[[523,7],[4896,6]]},"340":{"position":[[2101,7]]},"364":{"position":[[140,6]]},"390":{"position":[[496,6]]},"394":{"position":[[1811,6]]},"416":{"position":[[721,6]]},"428":{"position":[[58,7]]}}}],["metric",{"_index":825,"t":{"82":{"position":[[56,7]]}}}],["million",{"_index":1649,"t":{"234":{"position":[[640,8],[658,8],[678,8]]},"236":{"position":[[37,8],[55,8],[75,8]]}}}],["mind",{"_index":1544,"t":{"218":{"position":[[530,4]]},"430":{"position":[[1550,4]]}}}],["mini",{"_index":1011,"t":{"100":{"position":[[339,4]]}}}],["minim",{"_index":1562,"t":{"220":{"position":[[547,9]]},"350":{"position":[[3033,9]]}}}],["minimum",{"_index":1771,"t":{"254":{"position":[[152,7]]},"327":{"position":[[58,7]]}}}],["minut",{"_index":454,"t":{"31":{"position":[[128,7]]},"82":{"position":[[223,7]]},"208":{"position":[[4197,7]]},"390":{"position":[[3308,7]]}}}],["mirror",{"_index":1815,"t":{"261":{"position":[[311,6]]},"416":{"position":[[3098,6]]}}}],["miss",{"_index":234,"t":{"8":{"position":[[1358,7],[1545,7]]},"108":{"position":[[246,7]]},"114":{"position":[[242,7]]},"148":{"position":[[599,7]]},"208":{"position":[[338,6]]},"234":{"position":[[169,7]]},"251":{"position":[[258,7],[620,7],[788,7]]},"353":{"position":[[36,8]]},"418":{"position":[[92,7]]},"428":{"position":[[452,7]]}}}],["mistak",{"_index":1828,"t":{"278":{"position":[[337,8]]}}}],["mit",{"_index":2460,"t":{"450":{"position":[[0,3]]}}}],["mix",{"_index":20,"t":{"4":{"position":[[210,3]]},"130":{"position":[[962,5]]},"176":{"position":[[195,7]]},"230":{"position":[[828,4]]}}}],["mixcloud",{"_index":1171,"t":{"152":{"position":[[388,11]]}}}],["mkdir",{"_index":2382,"t":{"406":{"position":[[70,5]]}}}],["mobil",{"_index":2304,"t":{"390":{"position":[[2751,7]]},"430":{"position":[[1293,6]]}}}],["mode",{"_index":358,"t":{"16":{"position":[[17,4],[285,4],[323,4],[418,4]]},"98":{"position":[[3450,5]]},"251":{"position":[[3123,5],[3172,4],[3492,4],[4075,4],[4359,4]]},"261":{"position":[[668,4]]},"267":{"position":[[176,4]]},"344":{"position":[[927,5]]}}}],["modif",{"_index":1198,"t":{"160":{"position":[[750,13]]},"218":{"position":[[1240,13]]},"226":{"position":[[205,12]]},"267":{"position":[[393,12],[510,12]]},"280":{"position":[[542,12]]},"287":{"position":[[27,12]]},"307":{"position":[[210,12]]}}}],["modifi",{"_index":925,"t":{"96":{"position":[[149,6]]},"160":{"position":[[1081,6]]},"176":{"position":[[298,8]]},"192":{"position":[[858,6]]},"216":{"position":[[234,6]]},"218":{"position":[[26,6],[91,6],[186,6],[264,6],[329,6],[421,6],[540,9],[706,6],[801,6],[902,8],[926,6],[1176,9],[1203,6],[1414,6],[1479,6]]},"220":{"position":[[100,9]]},"251":{"position":[[2332,8]]},"274":{"position":[[44,8]]},"303":{"position":[[490,9]]},"316":{"position":[[418,6]]},"344":{"position":[[191,6]]},"394":{"position":[[297,9]]},"400":{"position":[[445,6],[1324,8]]},"416":{"position":[[2198,6]]},"418":{"position":[[1498,6]]},"422":{"position":[[715,6]]}}}],["modify/replac",{"_index":1827,"t":{"278":{"position":[[72,14]]}}}],["modul",{"_index":1347,"t":{"192":{"position":[[56,6],[262,7]]}}}],["monitor",{"_index":386,"t":{"20":{"position":[[85,7]]},"24":{"position":[[16,10]]},"33":{"position":[[62,10]]},"35":{"position":[[14,7]]},"39":{"position":[[15,7]]},"43":{"position":[[15,7]]},"51":{"position":[[14,7]]},"58":{"position":[[14,7]]},"76":{"position":[[284,7],[1244,8]]},"78":{"position":[[156,7]]},"82":{"position":[[14,8]]},"98":{"position":[[102,7]]},"100":{"position":[[203,10]]},"118":{"position":[[12,8]]},"120":{"position":[[177,7]]},"126":{"position":[[12,8]]},"132":{"position":[[192,7]]},"140":{"position":[[12,8]]},"170":{"position":[[158,8]]},"184":{"position":[[237,8]]},"204":{"position":[[0,7]]},"208":{"position":[[248,10],[5474,11]]},"342":{"position":[[978,9]]},"350":{"position":[[27,8],[382,10]]},"412":{"position":[[297,10]]},"416":{"position":[[55,8],[1252,10],[4149,10]]},"426":{"position":[[304,7]]},"430":{"position":[[668,7]]},"432":{"position":[[78,8]]}}}],["monitoring/webhook",{"_index":128,"t":{"4":{"position":[[3424,19]]}}}],["monitorwhenl",{"_index":864,"t":{"86":{"position":[[1639,16]]},"88":{"position":[[503,18],[787,18]]}}}],["monitorwhenlisten",{"_index":867,"t":{"86":{"position":[[1698,21]]},"88":{"position":[[528,23],[812,23]]}}}],["monoloth",{"_index":1873,"t":{"303":{"position":[[426,10]]}}}],["mopidi",{"_index":782,"t":{"73":{"position":[[550,6]]},"148":{"position":[[0,6],[197,6],[279,6],[375,6],[741,6],[828,6],[1031,7]]},"150":{"position":[[82,6],[434,6]]},"152":{"position":[[33,6]]},"154":{"position":[[475,8]]},"430":{"position":[[283,6]]}}}],["mopidy.conf",{"_index":1152,"t":{"148":{"position":[[854,12]]}}}],["mopidy.mydomain.com",{"_index":1154,"t":{"148":{"position":[[1100,19]]}}}],["mopidy.mydomain.com:80/mopw",{"_index":1157,"t":{"148":{"position":[[1215,28]]}}}],["more",{"_index":84,"t":{"4":{"position":[[1596,4],[1741,4],[3279,4]]},"82":{"position":[[163,5],[234,5],[516,4],[575,4]]},"92":{"position":[[407,4]]},"96":{"position":[[666,4]]},"130":{"position":[[945,4]]},"170":{"position":[[270,4]]},"180":{"position":[[515,4],[541,4]]},"184":{"position":[[349,4]]},"208":{"position":[[407,4]]},"216":{"position":[[254,4]]},"220":{"position":[[31,4]]},"228":{"position":[[1005,4]]},"234":{"position":[[577,4],[769,4],[1001,4],[1139,4],[1222,4],[1360,4]]},"236":{"position":[[166,4],[398,4]]},"238":{"position":[[43,4],[126,4],[264,4]]},"241":{"position":[[477,4]]},"247":{"position":[[344,4]]},"251":{"position":[[1485,4]]},"261":{"position":[[278,4]]},"297":{"position":[[385,4]]},"303":{"position":[[1320,4]]},"331":{"position":[[697,4]]},"350":{"position":[[1426,4]]},"384":{"position":[[329,4]]},"396":{"position":[[888,4]]},"400":{"position":[[685,4]]},"402":{"position":[[119,4]]},"416":{"position":[[3024,4],[3140,4]]},"424":{"position":[[1880,4]]},"428":{"position":[[4,4],[182,4]]},"430":{"position":[[1476,4]]},"432":{"position":[[37,4],[61,4]]}}}],["mount",{"_index":309,"t":{"14":{"position":[[561,5],[597,7],[1318,5],[1354,7]]},"160":{"position":[[916,5]]},"319":{"position":[[135,6]]}}}],["move",{"_index":2198,"t":{"366":{"position":[[342,4],[528,4]]},"390":{"position":[[1837,5],[1927,5],[2027,5],[2110,5]]}}}],["movi",{"_index":2262,"t":{"386":{"position":[[355,7]]}}}],["mozilla/5.0",{"_index":2218,"t":{"372":{"position":[[531,11],[742,11]]}}}],["mpd",{"_index":783,"t":{"73":{"position":[[581,3]]},"156":{"position":[[21,3],[117,3]]},"158":{"position":[[578,5]]},"162":{"position":[[449,5],[677,5]]},"430":{"position":[[290,3]]}}}],["mpd_password",{"_index":1184,"t":{"158":{"position":[[108,12]]}}}],["mpd_url",{"_index":1182,"t":{"158":{"position":[[82,7]]}}}],["mpri",{"_index":1190,"t":{"160":{"position":[[0,5],[211,6],[357,6],[376,5],[575,5],[877,6]]},"162":{"position":[[102,5],[724,7]]},"430":{"position":[[316,5]]}}}],["mpris_blacklist",{"_index":1219,"t":{"162":{"position":[[167,15]]}}}],["mpris_en",{"_index":1218,"t":{"162":{"position":[[82,12]]}}}],["mpris_whitelist",{"_index":1220,"t":{"162":{"position":[[244,15]]}}}],["ms",{"_index":17,"t":{"4":{"position":[[144,2],[314,2],[414,2],[515,2],[569,2],[1133,2],[2780,2],[3597,2]]},"12":{"position":[[277,2]]},"14":{"position":[[2689,2]]},"35":{"position":[[996,2]]},"76":{"position":[[187,2],[270,2],[329,2],[571,2]]},"84":{"position":[[329,2]]},"86":{"position":[[358,2],[424,2],[727,2],[1749,2]]},"96":{"position":[[456,2]]},"98":{"position":[[1570,2],[1917,2],[2499,2],[3262,2]]},"156":{"position":[[0,2]]},"164":{"position":[[222,2],[394,2],[447,2]]},"168":{"position":[[404,2]]},"176":{"position":[[112,2],[436,2],[1353,2]]},"192":{"position":[[0,2],[681,3],[1450,2],[1848,2]]},"196":{"position":[[665,2]]},"200":{"position":[[0,2]]},"208":{"position":[[1212,2],[2375,3],[2429,2],[2810,2],[3094,2],[3240,2],[3379,2],[4241,3],[4563,2],[4686,2],[5348,2]]},"230":{"position":[[0,2]]},"251":{"position":[[7,2]]},"256":{"position":[[147,2]]},"303":{"position":[[311,3]]},"329":{"position":[[148,2],[1461,2],[1557,2],[1952,2],[2171,2]]},"331":{"position":[[46,2]]},"335":{"position":[[87,2]]},"337":{"position":[[841,2],[898,2],[1065,3]]},"340":{"position":[[87,2]]},"342":{"position":[[937,2]]},"344":{"position":[[5,2]]},"350":{"position":[[24,2],[211,2],[2854,2]]},"353":{"position":[[57,2],[558,2]]},"355":{"position":[[610,2],[1001,2],[1289,2],[1328,2]]},"361":{"position":[[40,2]]},"366":{"position":[[268,2]]},"368":{"position":[[77,2]]},"376":{"position":[[591,2],[1148,2],[1249,2]]},"384":{"position":[[480,3]]},"386":{"position":[[102,2]]},"388":{"position":[[58,2]]},"390":{"position":[[4,2],[1682,2],[2482,2]]},"394":{"position":[[976,2],[1072,2],[2146,2],[2591,2]]},"402":{"position":[[82,2]]},"432":{"position":[[75,2],[158,2]]}}}],["ms'",{"_index":1254,"t":{"176":{"position":[[350,4]]},"200":{"position":[[205,4]]},"208":{"position":[[426,4],[3311,4]]},"220":{"position":[[260,4]]},"376":{"position":[[524,4]]},"390":{"position":[[1297,4]]}}}],["msdata",{"_index":2437,"t":{"426":{"position":[[221,8]]}}}],["msdata/config/lastfm.json",{"_index":2421,"t":{"416":{"position":[[3725,27]]},"418":{"position":[[1672,27]]},"422":{"position":[[889,27]]}}}],["msdata/dock",{"_index":2400,"t":{"414":{"position":[[107,15]]},"416":{"position":[[299,15],[896,15],[1870,15],[2675,15]]},"418":{"position":[[515,15],[1017,15],[1160,15],[1302,15],[1440,15]]},"420":{"position":[[248,15]]},"422":{"position":[[234,15],[377,15],[519,15],[657,15]]},"424":{"position":[[801,15],[1181,15],[2087,15]]}}}],["mtg8v6xa2nc",{"_index":2286,"t":{"390":{"position":[[1864,13]]}}}],["much",{"_index":1657,"t":{"234":{"position":[[819,4],[996,4],[1355,4]]},"236":{"position":[[216,4],[393,4]]},"238":{"position":[[259,4]]}}}],["multi",{"_index":52,"t":{"4":{"position":[[803,5]]},"8":{"position":[[38,5],[269,5],[919,5],[1371,5],[1814,5],[1919,5]]},"10":{"position":[[21,5]]},"14":{"position":[[0,5],[409,5],[3089,5],[3144,5],[3211,5],[3460,5]]},"20":{"position":[[0,5]]},"22":{"position":[[693,5],[1046,5],[1449,5]]},"31":{"position":[[3,5]]},"33":{"position":[[0,5],[223,5]]},"35":{"position":[[591,5],[821,5],[1526,5],[1597,5]]},"39":{"position":[[152,5],[285,5]]},"43":{"position":[[159,5]]},"51":{"position":[[689,5]]},"56":{"position":[[21,5],[342,5]]},"58":{"position":[[771,5],[1646,5]]},"63":{"position":[[33,5],[480,5]]},"67":{"position":[[1355,5]]},"73":{"position":[[29,5]]},"76":{"position":[[27,5],[389,5],[442,5],[889,5],[1228,5]]},"80":{"position":[[509,5]]},"84":{"position":[[139,5],[238,5]]},"86":{"position":[[181,5],[1503,5]]},"92":{"position":[[78,5]]},"98":{"position":[[82,5],[890,5]]},"102":{"position":[[287,5],[515,5],[815,5],[1562,5]]},"106":{"position":[[13,5]]},"108":{"position":[[254,5],[691,5]]},"112":{"position":[[13,5]]},"114":{"position":[[250,5],[683,5]]},"118":{"position":[[486,5]]},"120":{"position":[[20,5]]},"122":{"position":[[48,5]]},"126":{"position":[[217,5]]},"128":{"position":[[101,5]]},"130":{"position":[[61,5],[269,5],[547,5],[739,5],[992,5],[1069,5]]},"132":{"position":[[20,5]]},"134":{"position":[[48,5],[342,5],[861,5],[995,5]]},"136":{"position":[[186,5]]},"140":{"position":[[258,5]]},"142":{"position":[[106,5]]},"146":{"position":[[100,5]]},"148":{"position":[[145,5],[607,5],[992,5]]},"150":{"position":[[162,5],[398,5]]},"152":{"position":[[146,5],[237,5],[505,5]]},"160":{"position":[[218,5],[405,5],[479,5],[696,5],[831,5],[1702,5]]},"168":{"position":[[121,5],[1380,5]]},"174":{"position":[[290,5]]},"176":{"position":[[485,5],[1016,5],[1326,5],[1539,5],[1694,5],[1797,5],[1923,5],[2132,5],[2234,5],[2304,5],[2520,5],[2826,5],[2930,5],[3205,5],[3471,5],[3996,5],[4240,5]]},"190":{"position":[[1550,5]]},"192":{"position":[[1078,5],[2038,5]]},"196":{"position":[[517,5]]},"204":{"position":[[247,5],[329,5]]},"208":{"position":[[4945,5]]},"212":{"position":[[0,5],[183,5],[896,5]]},"214":{"position":[[50,5]]},"218":{"position":[[768,5]]},"234":{"position":[[115,5],[1538,5]]},"241":{"position":[[514,5],[658,5]]},"247":{"position":[[1367,5],[1430,5]]},"251":{"position":[[904,5],[1075,5],[2283,5],[2449,5],[2889,5]]},"258":{"position":[[1050,5]]},"267":{"position":[[40,5]]},"280":{"position":[[437,5]]},"297":{"position":[[45,5]]},"303":{"position":[[156,5]]},"305":{"position":[[415,5]]},"307":{"position":[[80,5]]},"309":{"position":[[616,5],[679,5]]},"319":{"position":[[0,5]]},"321":{"position":[[316,5]]},"350":{"position":[[3078,5]]},"372":{"position":[[49,5],[148,5],[179,5],[212,5],[1216,5],[1271,5],[1470,5],[1745,5],[1858,5],[2041,5],[2197,5]]},"374":{"position":[[166,5],[293,5]]},"376":{"position":[[21,5],[927,5],[1216,5]]},"382":{"position":[[150,5],[275,5]]},"384":{"position":[[277,5]]},"390":{"position":[[40,5],[289,5],[414,5],[552,5]]},"394":{"position":[[366,5],[429,5],[1473,5],[1946,5],[2391,5],[2919,5]]},"396":{"position":[[380,5],[711,5],[947,5],[1010,5]]},"398":{"position":[[47,5]]},"400":{"position":[[137,5]]},"406":{"position":[[30,5],[216,5]]},"408":{"position":[[72,5],[119,5],[190,5]]},"410":{"position":[[51,5]]},"412":{"position":[[44,5],[281,5],[382,5],[453,5]]},"414":{"position":[[24,5],[145,5],[208,5]]},"416":{"position":[[39,5],[1089,5],[1215,5],[1605,5],[1732,5],[1959,5],[2887,5],[3216,5],[3977,5],[4112,5]]},"418":{"position":[[0,5]]},"424":{"position":[[43,5],[776,5],[1156,5],[1758,5],[2062,5],[2234,5],[2305,5]]},"426":{"position":[[28,5],[264,5],[606,5]]},"428":{"position":[[150,5]]},"430":{"position":[[1347,5],[2112,5]]},"453":{"position":[[11,5],[457,5]]},"455":{"position":[[92,5],[128,5],[162,5],[247,5]]},"457":{"position":[[132,5]]}}}],["multipl",{"_index":85,"t":{"4":{"position":[[1653,8],[3336,8]]},"22":{"position":[[277,8]]},"33":{"position":[[699,8]]},"122":{"position":[[220,8]]},"134":{"position":[[530,8]]},"180":{"position":[[163,8],[558,9]]},"192":{"position":[[1461,8]]},"198":{"position":[[22,8]]},"222":{"position":[[985,8]]},"241":{"position":[[756,8]]},"251":{"position":[[1575,8],[2929,8]]},"261":{"position":[[711,8]]},"267":{"position":[[384,8]]},"416":{"position":[[1495,8]]},"418":{"position":[[814,8]]},"422":{"position":[[31,8]]},"430":{"position":[[846,8]]}}}],["multipli",{"_index":708,"t":{"67":{"position":[[401,10],[429,10],[776,10],[804,10]]}}}],["music",{"_index":438,"t":{"24":{"position":[[678,6]]},"51":{"position":[[97,5]]},"65":{"position":[[247,5],[916,5]]},"71":{"position":[[88,5],[160,6]]},"73":{"position":[[585,6],[951,5]]},"98":{"position":[[134,5],[429,5],[2666,6]]},"130":{"position":[[830,6]]},"148":{"position":[[21,5],[56,5]]},"160":{"position":[[53,5]]},"168":{"position":[[1466,6]]},"170":{"position":[[72,5]]},"190":{"position":[[148,5],[445,5]]},"204":{"position":[[39,5]]},"208":{"position":[[30,5],[188,5],[4978,5],[5384,5]]},"212":{"position":[[365,5]]},"234":{"position":[[384,5],[839,5],[955,5]]},"236":{"position":[[236,5],[352,5]]},"251":{"position":[[5392,5],[5476,5]]},"261":{"position":[[361,5],[736,5]]},"265":{"position":[[77,5]]},"350":{"position":[[81,5],[115,5],[183,5],[273,5]]},"355":{"position":[[362,5],[512,5],[572,5]]},"386":{"position":[[95,6]]},"390":{"position":[[1060,6],[2887,5]]},"430":{"position":[[29,5],[294,6],[474,5],[2078,5]]},"434":{"position":[[58,5],[128,5],[151,5],[212,6]]},"436":{"position":[[77,5]]}}}],["musicbrainz",{"_index":327,"t":{"14":{"position":[[1904,12]]},"220":{"position":[[336,11],[388,11]]},"226":{"position":[[1072,14],[1261,11],[1333,11],[1387,14]]},"230":{"position":[[768,11]]},"232":{"position":[[92,11]]},"234":{"position":[[4,11],[54,11],[449,11],[564,12],[607,11],[1178,11],[1654,11]]},"236":{"position":[[4,11]]},"238":{"position":[[82,11]]},"241":{"position":[[24,11],[254,14],[365,11],[407,11],[609,11],[700,11],[823,14],[926,11]]},"243":{"position":[[45,11],[174,14]]},"245":{"position":[[135,14],[423,11]]},"247":{"position":[[547,11],[1727,11]]},"249":{"position":[[200,11],[249,11]]},"251":{"position":[[217,11],[847,11],[1254,11],[1439,11],[1857,11],[3466,11],[3833,11],[4220,11],[4572,11],[4931,11],[5077,11]]},"254":{"position":[[23,11]]},"256":{"position":[[1032,11]]},"261":{"position":[[15,11]]},"263":{"position":[[230,11]]},"265":{"position":[[19,11],[293,11],[502,14]]},"267":{"position":[[3,11],[218,11],[699,14]]},"270":{"position":[[74,14],[321,14]]},"272":{"position":[[162,14],[593,14]]},"274":{"position":[[138,11],[351,14],[656,14]]},"276":{"position":[[0,11],[165,11],[259,14],[689,11],[761,11],[815,14]]},"418":{"position":[[24,11],[210,11],[251,11],[361,11],[405,11],[574,11],[657,11],[758,11],[783,11],[1955,13]]},"420":{"position":[[94,11],[138,11],[307,11],[390,11]]},"422":{"position":[[0,11],[1172,13]]},"428":{"position":[[403,11]]},"430":{"position":[[647,11],[1970,11]]}}}],["musicbrainz'",{"_index":622,"t":{"51":{"position":[[1626,13]]}}}],["musiccast",{"_index":789,"t":{"73":{"position":[[909,9]]},"204":{"position":[[8,9],[99,9],[386,9],[414,9]]},"206":{"position":[[100,9],[439,11]]},"430":{"position":[[456,9]]}}}],["musicservicebasedomain",{"_index":1339,"t":{"190":{"position":[[724,22]]}}}],["musictrack",{"_index":989,"t":{"98":{"position":[[1962,11]]}}}],["musicvideo",{"_index":1125,"t":{"130":{"position":[[2576,16],[3197,13]]}}}],["musikcub",{"_index":785,"t":{"73":{"position":[[631,9]]},"164":{"position":[[16,9],[166,9]]},"166":{"position":[[212,12],[249,12],[462,12],[499,12]]},"344":{"position":[[684,12],[1274,12]]},"430":{"position":[[338,9]]}}}],["musl",{"_index":967,"t":{"98":{"position":[[1112,4]]}}}],["mutli",{"_index":1367,"t":{"192":{"position":[[1203,5],[2140,5]]}}}],["mvp",{"_index":2156,"t":{"355":{"position":[[2084,3]]}}}],["mx",{"_index":1794,"t":{"256":{"position":[[1021,3]]}}}],["my\",\"optional\",\"tag",{"_index":417,"t":{"22":{"position":[[1841,24]]}}}],["my.domain.local:80",{"_index":278,"t":{"12":{"position":[[854,18]]}}}],["my.domain.local:9000",{"_index":280,"t":{"12":{"position":[[913,20]]}}}],["my.domain.tld/api",{"_index":1477,"t":{"208":{"position":[[3561,20]]}}}],["my_api_key_placedhold",{"_index":2422,"t":{"416":{"position":[[3828,26]]},"418":{"position":[[1775,26]]},"422":{"position":[[992,26]]}}}],["my_apikey",{"_index":215,"t":{"8":{"position":[[597,16]]}}}],["my_apikey=a89cba1569901a0671d5a9875fed4be1",{"_index":220,"t":{"8":{"position":[[814,42]]}}}],["my_env",{"_index":208,"t":{"8":{"position":[[391,10],[463,6]]}}}],["my_password",{"_index":1188,"t":{"158":{"position":[[245,13],[511,13]]},"166":{"position":[[314,13],[564,13]]}}}],["my_secret",{"_index":217,"t":{"8":{"position":[[624,16]]}}}],["my_secret=ec42e09d5ae0ee0f0816ca151008412a",{"_index":221,"t":{"8":{"position":[[857,42]]}}}],["my_secret_placehold",{"_index":2423,"t":{"416":{"position":[[3865,24]]},"418":{"position":[[1812,24]]},"422":{"position":[[1029,24]]}}}],["my_token",{"_index":1979,"t":{"337":{"position":[[399,8]]}}}],["myapprisefriendlynameforlog",{"_index":413,"t":{"22":{"position":[[1583,31]]}}}],["mybasicsourc",{"_index":2161,"t":{"355":{"position":[[2822,13]]}}}],["mybasicsourcesourc",{"_index":2167,"t":{"355":{"position":[[3494,19]]}}}],["mycast",{"_index":992,"t":{"98":{"position":[[2301,9],[2833,9],[3492,9]]},"100":{"position":[[676,9],[919,9]]}}}],["myconfig",{"_index":160,"t":{"4":{"position":[[4453,13],[4716,11]]},"327":{"position":[[166,8]]},"400":{"position":[[964,13],[1163,11]]}}}],["mydeez",{"_index":929,"t":{"96":{"position":[[303,11]]}}}],["mydomain.com",{"_index":645,"t":{"56":{"position":[[235,12]]},"63":{"position":[[326,12]]}}}],["mydomain.com:80/jriverreverse/mcws/v1",{"_index":1056,"t":{"108":{"position":[[917,38],[956,38]]}}}],["mydomain.com:80/kodireverse/jsonrpc",{"_index":1070,"t":{"114":{"position":[[898,35]]}}}],["mygotifyfriendlynameforlog",{"_index":403,"t":{"22":{"position":[[849,30]]}}}],["mygotifytoken",{"_index":171,"t":{"4":{"position":[[4906,16]]}}}],["myici",{"_index":1037,"t":{"102":{"position":[[1314,8]]},"104":{"position":[[138,8],[335,8]]}}}],["myjellyfin",{"_index":820,"t":{"80":{"position":[[207,13]]},"130":{"position":[[2160,13],[2798,13]]},"274":{"position":[[562,13]]},"276":{"position":[[597,13]]}}}],["myjellyfinsourc",{"_index":2372,"t":{"400":{"position":[[986,19]]}}}],["myjriv",{"_index":1061,"t":{"110":{"position":[[340,11],[575,11]]}}}],["mykodi",{"_index":1076,"t":{"116":{"position":[[265,9],[522,9]]}}}],["mylastfm",{"_index":1538,"t":{"216":{"position":[[391,11]]},"218":{"position":[[1319,11]]},"284":{"position":[[86,11]]}}}],["mylastfmcli",{"_index":213,"t":{"8":{"position":[[534,17],[970,17]]},"33":{"position":[[1039,17]]},"41":{"position":[[458,17],[808,17]]}}}],["mylastfmsourc",{"_index":1094,"t":{"128":{"position":[[298,17],[648,17]]},"416":{"position":[[3765,17]]},"418":{"position":[[1712,17]]},"422":{"position":[[929,17]]}}}],["mylfm",{"_index":1090,"t":{"124":{"position":[[345,8],[531,8]]},"230":{"position":[[694,6]]}}}],["mylz",{"_index":1143,"t":{"138":{"position":[[423,7],[610,7]]}}}],["mymaloja",{"_index":576,"t":{"49":{"position":[[202,9],[463,9]]},"146":{"position":[[296,9],[557,9]]}}}],["mymaloja\",\"koitoa\",\"listenbrainzfoo",{"_index":821,"t":{"80":{"position":[[232,39]]}}}],["mymalojakey",{"_index":165,"t":{"4":{"position":[[4781,13]]},"49":{"position":[[315,13],[576,13]]},"146":{"position":[[409,13],[670,13]]},"400":{"position":[[1228,13]]}}}],["mymb",{"_index":1591,"t":{"226":{"position":[[1095,6],[1410,6]]},"230":{"position":[[780,4]]},"241":{"position":[[277,7],[846,7]]},"243":{"position":[[197,7]]},"245":{"position":[[158,6]]},"265":{"position":[[525,7]]},"267":{"position":[[722,7]]},"270":{"position":[[97,7],[344,6]]},"272":{"position":[[185,7],[616,6]]},"274":{"position":[[374,7],[679,7]]},"276":{"position":[[282,7],[838,6]]}}}],["mymopidi",{"_index":1175,"t":{"154":{"position":[[92,11],[345,11]]}}}],["mympd",{"_index":1186,"t":{"158":{"position":[[185,8],[451,8]]}}}],["mymultiscrobblertop",{"_index":182,"t":{"4":{"position":[[5074,24]]}}}],["myn",{"_index":1592,"t":{"226":{"position":[[1133,10],[1493,10]]}}}],["mynativetransform",{"_index":1565,"t":{"222":{"position":[[536,22],[2021,22],[2397,22]]},"312":{"position":[[92,22],[469,21]]},"314":{"position":[[92,22],[368,21]]}}}],["myntfyfriendlynameforlog",{"_index":179,"t":{"4":{"position":[[5004,28]]},"22":{"position":[[1200,28]]}}}],["myoptionalslug",{"_index":1409,"t":{"202":{"position":[[425,17],[646,17]]}}}],["mypassword",{"_index":1078,"t":{"116":{"position":[[375,12],[632,12]]}}}],["myplexapi",{"_index":1245,"t":{"168":{"position":[[2282,12],[2830,12]]}}}],["myrockskycli",{"_index":653,"t":{"56":{"position":[[713,18],[979,18]]}}}],["myrockskysourc",{"_index":1249,"t":{"174":{"position":[[488,18],[754,18]]}}}],["mysite.com",{"_index":1839,"t":{"282":{"position":[[758,14],[800,14],[854,13]]}}}],["myslug",{"_index":1091,"t":{"124":{"position":[[388,8],[574,8]]}}}],["mysourc",{"_index":1942,"t":{"329":{"position":[[1377,8]]}}}],["myspotifi",{"_index":114,"t":{"4":{"position":[[2556,12]]},"178":{"position":[[259,12],[611,12]]}}}],["myspotify1\",\"myjellyfin2",{"_index":483,"t":{"33":{"position":[[1333,28]]}}}],["myspotifysourc",{"_index":161,"t":{"4":{"position":[[4475,18]]}}}],["mysubson",{"_index":1320,"t":{"182":{"position":[[226,13],[518,13]]},"222":{"position":[[801,13],[1482,13],[2286,13]]},"265":{"position":[[408,13]]},"267":{"position":[[591,13]]},"270":{"position":[[227,13]]},"272":{"position":[[499,13]]},"280":{"position":[[623,13]]},"307":{"position":[[291,13]]},"312":{"position":[[357,13]]},"314":{"position":[[256,13]]},"316":{"position":[[289,13]]}}}],["myteal",{"_index":679,"t":{"63":{"position":[[849,9],[1100,9]]}}}],["mytealsourc",{"_index":1343,"t":{"190":{"position":[[843,15],[1052,15],[1282,15],[1747,15],[2062,15]]}}}],["myth",{"_index":1603,"t":{"230":{"position":[[367,10]]}}}],["mytoken",{"_index":755,"t":{"67":{"position":[[3146,9]]},"69":{"position":[[1546,10]]},"138":{"position":[[466,9],[653,9]]}}}],["myurl",{"_index":2432,"t":{"424":{"position":[[1837,5]]}}}],["myuser",{"_index":1077,"t":{"116":{"position":[[353,9],[610,9]]},"400":{"position":[[1106,8]]},"424":{"position":[[1630,7]]}}}],["myuser.bsky.soci",{"_index":650,"t":{"56":{"position":[[579,18]]},"63":{"position":[[727,18]]}}}],["myvlc",{"_index":1370,"t":{"192":{"position":[[1601,8],[2365,8]]},"194":{"position":[[186,8],[403,8]]},"222":{"position":[[1665,8]]}}}],["mywebscrobbl",{"_index":1408,"t":{"202":{"position":[[389,17],[610,17]]}}}],["myyamaha",{"_index":1419,"t":{"206":{"position":[[172,11],[367,11]]}}}],["myytm",{"_index":1439,"t":{"208":{"position":[[1069,8],[2616,8],[3845,8]]},"390":{"position":[[1553,8],[1740,6],[2388,8]]}}}],["myytm.log",{"_index":2303,"t":{"390":{"position":[[2547,9]]}}}],["myytmus",{"_index":1506,"t":{"210":{"position":[[399,12],[756,12]]}}}],["n+1",{"_index":2271,"t":{"390":{"position":[[788,3]]}}}],["naiv",{"_index":1754,"t":{"251":{"position":[[3117,5],[3150,5],[4061,5],[4067,7],[4353,5],[4757,7]]}}}],["name",{"_index":104,"t":{"4":{"position":[[2312,5],[2548,7],[4467,7],[4708,7],[4818,7],[4996,7]]},"8":{"position":[[457,5],[526,7],[962,7],[1532,5],[1576,5],[1678,4],[1748,5],[1800,5],[1865,4]]},"14":{"position":[[2684,4]]},"22":{"position":[[418,7],[522,7],[581,7],[841,7],[1192,7],[1575,7]]},"24":{"position":[[356,4]]},"28":{"position":[[0,4]]},"33":{"position":[[829,5],[862,4],[1031,7],[1199,5]]},"37":{"position":[[251,7],[542,7]]},"41":{"position":[[450,7],[800,7]]},"45":{"position":[[273,7],[584,7]]},"49":{"position":[[194,7],[455,7]]},"56":{"position":[[705,7],[971,7]]},"63":{"position":[[841,7],[1092,7]]},"67":{"position":[[944,7],[1200,7],[1446,7],[1702,7],[1872,7],[2168,7],[2404,7],[2672,7],[2842,7],[3072,7],[3196,7],[3314,7],[3432,7],[3550,7]]},"69":{"position":[[108,7],[243,7],[378,7],[549,7],[703,7],[889,7],[1046,7],[1234,7],[1472,7],[1590,7],[1690,7],[1790,7],[1916,7]]},"73":{"position":[[0,4]]},"80":{"position":[[126,4],[199,7],[493,5],[549,4],[620,4]]},"88":{"position":[[107,4],[139,4],[417,7],[496,6],[701,7],[780,6]]},"92":{"position":[[500,4],[729,5]]},"94":{"position":[[157,7],[460,7]]},"96":{"position":[[295,7]]},"98":{"position":[[2258,6],[2293,7],[2372,4],[2760,5],[2825,7],[3484,7]]},"100":{"position":[[668,7],[911,7]]},"102":{"position":[[1306,7]]},"104":{"position":[[130,7],[327,7]]},"110":{"position":[[332,7],[567,7]]},"116":{"position":[[257,7],[514,7]]},"118":{"position":[[670,7],[961,7]]},"124":{"position":[[337,7],[523,7]]},"128":{"position":[[290,7],[640,7]]},"130":{"position":[[264,4],[2152,7],[2790,7]]},"138":{"position":[[415,7],[602,7]]},"142":{"position":[[311,7],[622,7]]},"146":{"position":[[288,7],[549,7]]},"152":{"position":[[124,5],[218,4]]},"154":{"position":[[84,7],[337,7]]},"158":{"position":[[177,7],[443,7]]},"162":{"position":[[217,5],[295,5],[383,7],[611,7]]},"166":{"position":[[241,7],[491,7]]},"168":{"position":[[2274,7],[2822,7]]},"174":{"position":[[480,7],[746,7]]},"178":{"position":[[251,7],[603,7]]},"182":{"position":[[218,7],[510,7]]},"190":{"position":[[259,4],[835,7],[1044,7],[1274,7],[1739,7],[2054,7]]},"192":{"position":[[1338,5],[1593,7],[2103,4],[2183,4],[2357,7]]},"194":{"position":[[178,7],[395,7]]},"196":{"position":[[218,5]]},"198":{"position":[[183,7],[267,7]]},"200":{"position":[[89,4]]},"202":{"position":[[381,7],[602,7]]},"206":{"position":[[164,7],[359,7]]},"208":{"position":[[1061,7],[2224,4],[2608,7],[3837,7]]},"210":{"position":[[391,7],[748,7]]},"216":{"position":[[383,7]]},"218":{"position":[[1311,7]]},"222":{"position":[[152,4],[166,4],[528,7],[793,7],[912,6],[1178,7],[1298,7],[1474,7],[1585,7],[1657,7],[1763,7],[2013,7],[2278,7],[2389,7]]},"226":{"position":[[1087,7],[1125,7],[1402,7],[1485,7]]},"230":{"position":[[359,7]]},"241":{"position":[[269,7],[838,7]]},"243":{"position":[[189,7]]},"245":{"position":[[150,7]]},"251":{"position":[[2676,4]]},"256":{"position":[[1290,4]]},"261":{"position":[[265,6]]},"265":{"position":[[400,7],[517,7]]},"267":{"position":[[583,7],[714,7]]},"270":{"position":[[89,7],[219,7],[336,7]]},"272":{"position":[[177,7],[491,7],[608,7]]},"274":{"position":[[366,7],[554,7],[671,7]]},"276":{"position":[[274,7],[589,7],[830,7]]},"278":{"position":[[368,5]]},"280":{"position":[[235,7],[529,4],[615,7],[743,5]]},"284":{"position":[[78,7]]},"301":{"position":[[389,5],[449,4]]},"307":{"position":[[197,4],[283,7],[413,5]]},"312":{"position":[[84,7],[349,7],[461,7]]},"314":{"position":[[84,7],[248,7],[360,7]]},"316":{"position":[[281,7]]},"327":{"position":[[177,5]]},"342":{"position":[[733,5]]},"344":{"position":[[895,5]]},"372":{"position":[[1607,4],[1848,4],[1985,4]]},"390":{"position":[[1545,7],[2380,7],[2533,5],[2579,6]]},"394":{"position":[[507,4]]},"396":{"position":[[375,4],[706,4],[1088,4]]},"400":{"position":[[978,7],[1155,7]]},"414":{"position":[[286,4]]},"416":{"position":[[3519,5],[3757,7]]},"418":{"position":[[1704,7]]},"422":{"position":[[921,7]]},"434":{"position":[[282,5],[379,5]]},"436":{"position":[[203,5]]},"455":{"position":[[157,4]]}}}],["name=[nameofsourc",{"_index":1480,"t":{"208":{"position":[[3660,19]]}}}],["names/interpol",{"_index":224,"t":{"8":{"position":[[1197,19]]}}}],["name}.json",{"_index":1943,"t":{"329":{"position":[[1386,13]]}}}],["nash",{"_index":1884,"t":{"314":{"position":[[165,4]]}}}],["nativ",{"_index":1558,"t":{"220":{"position":[[242,6],[665,8]]},"222":{"position":[[518,9],[895,8],[952,8],[1168,9],[1288,9],[1576,8],[1754,8],[2003,9],[2380,8]]},"224":{"position":[[185,9]]},"226":{"position":[[1006,6],[1044,6],[1115,9],[1303,7],[1323,6],[1475,9]]},"228":{"position":[[1245,6],[1303,9],[1428,6],[1502,6],[1585,9]]},"232":{"position":[[79,6]]},"243":{"position":[[343,9]]},"247":{"position":[[634,6],[673,6],[1555,6]]},"251":{"position":[[3107,6],[3129,6],[3156,6],[3163,8],[3217,6],[3391,6],[3485,6],[4050,8]]},"261":{"position":[[661,6],[877,8]]},"272":{"position":[[429,8]]},"276":{"position":[[99,6],[137,6],[526,9],[731,7],[751,6],[903,8]]},"301":{"position":[[4,6],[670,6]]},"303":{"position":[[1073,6]]},"305":{"position":[[136,9]]},"307":{"position":[[47,6],[385,9],[431,6]]},"309":{"position":[[849,6]]},"312":{"position":[[74,9],[451,9]]},"314":{"position":[[74,9],[350,9]]},"316":{"position":[[383,9]]},"400":{"position":[[424,6]]}}}],["navidrom",{"_index":1130,"t":{"134":{"position":[[386,10]]},"180":{"position":[[139,10],[378,11]]},"412":{"position":[[327,10]]},"416":{"position":[[113,9],[1321,9],[1580,9],[2011,10],[2126,9],[2307,9],[2411,10]]},"418":{"position":[[913,9]]},"422":{"position":[[130,9]]},"430":{"position":[[413,10]]},"434":{"position":[[219,10]]}}}],["navidrome'",{"_index":2408,"t":{"416":{"position":[[1430,11]]}}}],["navig",{"_index":485,"t":{"35":{"position":[[208,8]]},"47":{"position":[[325,8]]},"53":{"position":[[108,8],[182,8]]},"60":{"position":[[65,8]]},"130":{"position":[[108,8]]},"176":{"position":[[691,8],[913,8],[3311,8]]},"192":{"position":[[535,10]]},"208":{"position":[[2117,8]]},"424":{"position":[[509,8],[1379,8]]}}}],["nd_listenbrainz_baseurl",{"_index":1132,"t":{"134":{"position":[[431,24]]},"416":{"position":[[2056,24]]}}}],["nd_listenbrainz_baseurl=http://192.168.0.100:9078/1",{"_index":2411,"t":{"416":{"position":[[2246,52]]}}}],["nearli",{"_index":2259,"t":{"384":{"position":[[599,6]]}}}],["necessari",{"_index":1100,"t":{"130":{"position":[[683,9]]},"176":{"position":[[1002,9]]},"208":{"position":[[1822,10]]},"226":{"position":[[807,9]]},"329":{"position":[[1719,10]]}}}],["necessarili",{"_index":2118,"t":{"350":{"position":[[1327,11]]}}}],["need",{"_index":87,"t":{"4":{"position":[[1727,4],[3410,4]]},"12":{"position":[[414,4]]},"18":{"position":[[14,4]]},"43":{"position":[[244,4]]},"51":{"position":[[1780,4]]},"53":{"position":[[9,4]]},"67":{"position":[[1297,4],[2029,4]]},"86":{"position":[[611,4]]},"100":{"position":[[222,7]]},"106":{"position":[[262,4]]},"112":{"position":[[251,4]]},"122":{"position":[[206,4]]},"134":{"position":[[516,4]]},"140":{"position":[[343,4]]},"162":{"position":[[143,4]]},"168":{"position":[[379,4]]},"190":{"position":[[277,4]]},"202":{"position":[[130,7]]},"208":{"position":[[531,5],[3299,4],[4178,4],[4639,4]]},"212":{"position":[[241,4]]},"218":{"position":[[793,4]]},"267":{"position":[[355,6],[417,4]]},"329":{"position":[[960,6],[2327,5]]},"335":{"position":[[138,4]]},"344":{"position":[[104,4]]},"350":{"position":[[680,4],[1339,4]]},"355":{"position":[[1391,4]]},"372":{"position":[[1805,4]]},"390":{"position":[[112,5]]},"418":{"position":[[287,5]]},"420":{"position":[[20,5]]},"430":{"position":[[1481,4]]},"434":{"position":[[297,6]]},"436":{"position":[[218,6]]},"444":{"position":[[234,4]]}}}],["network",{"_index":592,"t":{"51":{"position":[[522,8]]},"58":{"position":[[604,8]]},"63":{"position":[[780,7]]},"73":{"position":[[5,10]]},"76":{"position":[[203,7]]},"106":{"position":[[161,7],[185,7]]},"108":{"position":[[485,7]]},"160":{"position":[[1362,7],[1418,7]]},"196":{"position":[[633,7]]},"329":{"position":[[366,7],[901,9],[2779,7]]},"372":{"position":[[1331,8],[2296,7]]},"394":{"position":[[1221,10],[1282,7],[1346,10],[1999,11],[2037,7],[2569,7]]},"430":{"position":[[977,7]]}}}],["network/usb/cd",{"_index":1411,"t":{"204":{"position":[[55,14]]}}}],["network/your",{"_index":656,"t":{"58":{"position":[[196,12]]},"184":{"position":[[168,12]]}}}],["never",{"_index":459,"t":{"31":{"position":[[332,5]]},"84":{"position":[[781,5]]},"86":{"position":[[1446,5]]},"256":{"position":[[1695,5]]}}}],["new",{"_index":489,"t":{"35":{"position":[[269,3]]},"47":{"position":[[448,3]]},"60":{"position":[[176,3]]},"76":{"position":[[1309,3]]},"126":{"position":[[68,3]]},"130":{"position":[[247,3]]},"176":{"position":[[4048,3]]},"208":{"position":[[1333,3],[1842,3],[1952,3]]},"214":{"position":[[192,3],[232,3]]},"218":{"position":[[1425,5],[1520,3]]},"323":{"position":[[418,3]]},"335":{"position":[[73,3]]},"337":{"position":[[34,3]]},"340":{"position":[[17,3],[138,3],[1160,3],[1897,3]]},"342":{"position":[[18,3]]},"344":{"position":[[1066,3],[1338,3]]},"348":{"position":[[581,3],[948,3],[1101,3],[1230,3],[2588,3]]},"350":{"position":[[2840,3]]},"353":{"position":[[1070,3]]},"355":{"position":[[726,3],[1039,4],[1841,3],[2688,3],[2911,5]]},"372":{"position":[[473,3]]},"376":{"position":[[1193,3]]},"390":{"position":[[357,3],[705,3],[815,3],[2985,3]]},"406":{"position":[[9,3]]},"408":{"position":[[162,3]]},"414":{"position":[[9,3]]},"416":{"position":[[1696,3],[2917,3],[3510,3]]},"424":{"position":[[635,3],[1440,3]]},"432":{"position":[[124,3]]},"453":{"position":[[196,3]]}}}],["newli",{"_index":1465,"t":{"208":{"position":[[2452,5]]},"350":{"position":[[763,7]]}}}],["newplay",{"_index":2134,"t":{"350":{"position":[[2760,8],[2775,8],[2971,9]]}}}],["newsourc",{"_index":2053,"t":{"344":{"position":[[1219,10],[1320,9]]}}}],["next",{"_index":841,"t":{"84":{"position":[[438,4]]},"86":{"position":[[1122,4]]},"226":{"position":[[55,4],[706,4]]},"251":{"position":[[805,4]]},"348":{"position":[[0,4]]},"355":{"position":[[1880,4]]},"396":{"position":[[277,4]]}}}],["nginx/traefik/caddi",{"_index":1269,"t":{"176":{"position":[[1578,21]]}}}],["nice",{"_index":1518,"t":{"212":{"position":[[797,4]]}}}],["nightmar",{"_index":2292,"t":{"390":{"position":[[1968,10]]}}}],["node",{"_index":1897,"t":{"321":{"position":[[21,4],[165,4],[365,4]]},"359":{"position":[[48,4]]},"366":{"position":[[125,4],[305,4],[483,4]]},"400":{"position":[[188,4],[498,4],[572,6],[856,4]]}}}],["node/npm",{"_index":1196,"t":{"160":{"position":[[545,9]]}}}],["node@^4.9.6",{"_index":2369,"t":{"400":{"position":[[649,12]]}}}],["node_modul",{"_index":2193,"t":{"366":{"position":[[178,12]]}}}],["nodej",{"_index":984,"t":{"98":{"position":[[1513,6]]},"430":{"position":[[1214,6]]}}}],["noisi",{"_index":364,"t":{"16":{"position":[[267,5]]}}}],["non",{"_index":646,"t":{"56":{"position":[[252,3]]},"63":{"position":[[343,3]]},"148":{"position":[[85,3]]},"251":{"position":[[1409,3]]},"301":{"position":[[217,3]]},"355":{"position":[[1135,3]]},"384":{"position":[[349,3]]}}}],["none",{"_index":241,"t":{"8":{"position":[[1641,4]]},"86":{"position":[[531,4]]},"108":{"position":[[758,5]]},"114":{"position":[[748,5]]},"148":{"position":[[1059,5]]},"224":{"position":[[927,4]]},"230":{"position":[[868,6]]},"372":{"position":[[845,8]]}}}],["normal",{"_index":1436,"t":{"208":{"position":[[942,6]]},"251":{"position":[[1278,10],[1413,6],[2202,6]]},"280":{"position":[[243,13]]},"348":{"position":[[487,6],[1341,11]]}}}],["normalizeprotocol",{"_index":2080,"t":{"348":{"position":[[543,18]]}}}],["normalizeurl(v",{"_index":2078,"t":{"348":{"position":[[496,17]]}}}],["note",{"_index":494,"t":{"35":{"position":[[416,4]]},"53":{"position":[[48,4]]},"58":{"position":[[1320,4]]},"80":{"position":[[294,4],[423,4]]},"84":{"position":[[0,4]]},"98":{"position":[[150,4],[388,4]]},"100":{"position":[[13,4]]},"102":{"position":[[73,4]]},"118":{"position":[[416,4]]},"128":{"position":[[29,4]]},"134":{"position":[[697,4]]},"142":{"position":[[29,4]]},"146":{"position":[[29,4]]},"148":{"position":[[260,4]]},"168":{"position":[[30,4]]},"174":{"position":[[218,4]]},"190":{"position":[[1478,4]]},"196":{"position":[[291,4]]},"200":{"position":[[182,4]]},"224":{"position":[[1032,4]]},"249":{"position":[[0,4]]},"251":{"position":[[1003,4],[2033,4]]},"284":{"position":[[387,4]]},"355":{"position":[[3888,4]]},"412":{"position":[[441,4]]},"416":{"position":[[2528,4],[3450,4]]},"418":{"position":[[267,4]]},"420":{"position":[[0,4]]},"424":{"position":[[1587,4]]},"453":{"position":[[380,6]]}}}],["notic",{"_index":1534,"t":{"216":{"position":[[7,6]]}}}],["notif",{"_index":388,"t":{"22":{"position":[[21,12],[745,12],[1098,12]]},"160":{"position":[[123,12]]},"323":{"position":[[360,12]]},"428":{"position":[[314,12]]}}}],["now",{"_index":446,"t":{"28":{"position":[[5,3]]},"33":{"position":[[119,3],[146,3],[260,3],[283,3],[466,3],[936,3],[1238,3],[1305,3]]},"86":{"position":[[272,3]]},"192":{"position":[[657,3]]},"208":{"position":[[2383,3],[2799,4]]},"340":{"position":[[1876,3],[2140,3]]},"346":{"position":[[0,3]]},"350":{"position":[[3063,3]]},"368":{"position":[[69,3]]},"408":{"position":[[286,3]]},"426":{"position":[[283,3],[565,3]]},"430":{"position":[[778,3]]}}}],["now_playing=fals",{"_index":469,"t":{"33":{"position":[[372,17]]}}}],["now_playing=tru",{"_index":468,"t":{"33":{"position":[[352,16]]}}}],["nowplay",{"_index":480,"t":{"33":{"position":[[1136,15],[1317,15]]}}}],["npm",{"_index":63,"t":{"4":{"position":[[1119,3]]},"321":{"position":[[412,3],[424,3]]},"323":{"position":[[387,3]]},"366":{"position":[[320,3],[498,3]]},"400":{"position":[[201,3],[213,3],[237,3],[251,3],[1251,3]]}}}],["npm:@rollup/wasm",{"_index":2368,"t":{"400":{"position":[[631,17]]}}}],["ntfi",{"_index":178,"t":{"4":{"position":[[4988,7]]},"22":{"position":[[614,7],[998,5],[1184,7]]},"430":{"position":[[730,5]]}}}],["ntfyconfig",{"_index":405,"t":{"22":{"position":[[1035,10]]}}}],["ntfyserveron",{"_index":398,"t":{"22":{"position":[[589,16]]}}}],["null",{"_index":1930,"t":{"329":{"position":[[491,4]]},"348":{"position":[[615,4],[857,4],[1004,4]]}}}],["number",{"_index":230,"t":{"8":{"position":[[1323,8]]},"31":{"position":[[142,6]]},"108":{"position":[[423,6]]},"114":{"position":[[417,6]]},"148":{"position":[[794,6]]},"212":{"position":[[329,6]]},"350":{"position":[[2131,6]]}}}],["numer",{"_index":1768,"t":{"254":{"position":[[46,7]]}}}],["nvm",{"_index":1900,"t":{"321":{"position":[[137,3],[332,3]]},"400":{"position":[[153,3]]}}}],["o",{"_index":2182,"t":{"364":{"position":[[263,1],[302,1]]},"390":{"position":[[2079,1]]}}}],["oauth",{"_index":1426,"t":{"208":{"position":[[557,5],[1369,5],[1549,5],[1893,5],[2170,6],[2893,5],[3174,5],[3786,5]]},"210":{"position":[[159,5],[218,5],[284,5]]},"376":{"position":[[409,6],[427,5]]}}}],["obj",{"_index":2065,"t":{"346":{"position":[[407,5],[750,4]]}}}],["object",{"_index":232,"t":{"8":{"position":[[1342,8]]},"218":{"position":[[1110,6]]},"222":{"position":[[236,6],[321,6]]},"224":{"position":[[167,7],[874,6]]},"228":{"position":[[66,6],[117,6],[606,6],[784,6],[1117,7]]},"230":{"position":[[84,6]]},"282":{"position":[[336,6]]},"327":{"position":[[197,6],[214,6]]},"353":{"position":[[939,6]]}}}],["object.values(cp).every(x",{"_index":2046,"t":{"344":{"position":[[809,27]]}}}],["obscur",{"_index":1666,"t":{"234":{"position":[[1030,8]]},"236":{"position":[[427,8]]}}}],["obtain",{"_index":636,"t":{"53":{"position":[[230,6]]},"56":{"position":[[622,8]]},"208":{"position":[[665,6]]}}}],["occasion",{"_index":2464,"t":{"453":{"position":[[218,12]]}}}],["occur",{"_index":474,"t":{"33":{"position":[[631,5]]},"230":{"position":[[56,6]]},"329":{"position":[[2815,8]]},"353":{"position":[[1087,8]]},"390":{"position":[[371,6],[914,5],[2682,9],[3259,8]]}}}],["occurr",{"_index":1742,"t":{"251":{"position":[[1497,10]]}}}],["off",{"_index":933,"t":{"96":{"position":[[450,5]]}}}],["offici",{"_index":544,"t":{"43":{"position":[[311,8]]},"140":{"position":[[410,8]]},"243":{"position":[[305,13]]},"256":{"position":[[356,8],[683,9],[1410,10],[1443,12]]},"258":{"position":[[830,10],[896,12]]},"261":{"position":[[386,8],[447,13]]},"272":{"position":[[295,13]]},"276":{"position":[[392,13]]},"376":{"position":[[768,8]]},"382":{"position":[[189,8]]}}}],["offlin",{"_index":2179,"t":{"364":{"position":[[64,7]]},"416":{"position":[[1516,7]]}}}],["ogg",{"_index":1040,"t":{"102":{"position":[[1405,6],[1619,4]]}}}],["ok",{"_index":422,"t":{"24":{"position":[[128,2]]},"355":{"position":[[2997,2]]},"390":{"position":[[758,4]]}}}],["okay",{"_index":1780,"t":{"256":{"position":[[415,4]]}}}],["old",{"_index":1456,"t":{"208":{"position":[[1922,3]]}}}],["omit",{"_index":739,"t":{"67":{"position":[[2192,8],[2428,8]]},"69":{"position":[[35,4]]},"80":{"position":[[341,7]]},"280":{"position":[[516,8]]},"307":{"position":[[184,8]]},"434":{"position":[[424,7]]}}}],["on",{"_index":16,"t":{"4":{"position":[[123,3],[278,3],[580,3],[604,3],[1606,3],[2804,3],[3289,3]]},"12":{"position":[[211,3]]},"18":{"position":[[330,3]]},"60":{"position":[[61,3]]},"67":{"position":[[1302,3]]},"82":{"position":[[45,3]]},"92":{"position":[[229,3]]},"176":{"position":[[1224,3]]},"180":{"position":[[196,3],[457,4]]},"190":{"position":[[309,3]]},"192":{"position":[[1493,3]]},"208":{"position":[[510,3],[2059,3]]},"218":{"position":[[956,3]]},"220":{"position":[[24,3]]},"241":{"position":[[487,3]]},"247":{"position":[[354,3],[434,3]]},"251":{"position":[[1723,3],[2815,3],[4157,3],[5764,3]]},"258":{"position":[[27,3]]},"280":{"position":[[483,3]]},"297":{"position":[[172,3],[216,3],[559,3],[624,4]]},"301":{"position":[[464,3]]},"303":{"position":[[1158,3],[1330,3]]},"307":{"position":[[117,3]]},"340":{"position":[[1069,3]]},"382":{"position":[[71,3]]},"394":{"position":[[2626,3]]},"416":{"position":[[3133,3]]},"430":{"position":[[1696,3]]},"432":{"position":[[30,3],[54,3]]}}}],["onc",{"_index":972,"t":{"98":{"position":[[1200,4]]},"208":{"position":[[4537,4]]},"418":{"position":[[309,4]]},"420":{"position":[[42,4]]}}}],["one/mi",{"_index":1858,"t":{"297":{"position":[[459,6]]}}}],["onfailur",{"_index":1584,"t":{"226":{"position":[[324,9],[1367,11],[1438,12]]},"251":{"position":[[2152,11]]},"276":{"position":[[795,11],[866,12]]}}}],["onlin",{"_index":875,"t":{"88":{"position":[[224,6]]}}}],["onskip",{"_index":1586,"t":{"226":{"position":[[458,6]]},"228":{"position":[[474,9]]}}}],["onsuccess",{"_index":1583,"t":{"226":{"position":[[247,9],[1417,12]]},"276":{"position":[[845,12]]}}}],["open",{"_index":338,"t":{"14":{"position":[[3035,4]]},"76":{"position":[[509,4]]},"92":{"position":[[331,4],[599,4]]},"98":{"position":[[262,4]]},"192":{"position":[[86,4]]},"196":{"position":[[44,4]]},"323":{"position":[[298,4]]},"329":{"position":[[1880,4]]},"372":{"position":[[2267,5],[2369,4]]},"410":{"position":[[0,4]]},"430":{"position":[[1522,4]]}}}],["oper",{"_index":1191,"t":{"160":{"position":[[76,9],[335,9]]},"325":{"position":[[385,8],[490,8]]},"327":{"position":[[278,7]]},"329":{"position":[[988,8]]},"350":{"position":[[46,7],[160,7]]}}}],["opinion",{"_index":1644,"t":{"234":{"position":[[347,8]]},"261":{"position":[[283,11]]}}}],["oppos",{"_index":1987,"t":{"337":{"position":[[965,7]]},"372":{"position":[[168,7]]}}}],["option",{"_index":130,"t":{"4":{"position":[[3539,7],[3585,7],[5111,11],[5135,11]]},"6":{"position":[[43,7]]},"10":{"position":[[6,7]]},"14":{"position":[[203,9]]},"16":{"position":[[51,8],[72,7]]},"22":{"position":[[709,10],[1062,10],[1306,11],[1330,11]]},"33":{"position":[[1102,10]]},"67":{"position":[[69,9],[207,9],[371,9],[582,9],[746,9],[1076,10]]},"82":{"position":[[341,7],[416,10]]},"84":{"position":[[633,7],[701,10]]},"86":{"position":[[1298,7],[1366,10]]},"96":{"position":[[215,6],[360,10],[421,6]]},"98":{"position":[[3543,10]]},"102":{"position":[[1488,7]]},"106":{"position":[[144,7]]},"108":{"position":[[493,8]]},"124":{"position":[[231,10]]},"130":{"position":[[2334,8],[2619,10],[3239,10]]},"138":{"position":[[311,10]]},"158":{"position":[[262,10],[528,10]]},"162":{"position":[[158,8]]},"168":{"position":[[2605,10],[3153,10]]},"180":{"position":[[615,8]]},"192":{"position":[[782,8],[1646,10],[2410,10]]},"208":{"position":[[1146,10],[2736,10],[4039,10]]},"210":{"position":[[593,10],[950,10]]},"216":{"position":[[464,10]]},"218":{"position":[[1338,10]]},"220":{"position":[[677,9]]},"222":{"position":[[837,10],[1518,10],[1696,10],[2322,10]]},"226":{"position":[[14,10],[924,10],[1205,10]]},"230":{"position":[[397,10]]},"247":{"position":[[520,7]]},"249":{"position":[[46,9]]},"261":{"position":[[64,8]]},"265":{"position":[[444,10]]},"267":{"position":[[627,10]]},"270":{"position":[[263,10]]},"272":{"position":[[535,10]]},"274":{"position":[[598,10]]},"276":{"position":[[633,10]]},"280":{"position":[[659,10]]},"284":{"position":[[143,10]]},"303":{"position":[[657,7]]},"307":{"position":[[327,10]]},"312":{"position":[[393,10]]},"314":{"position":[[292,10]]},"316":{"position":[[325,10]]},"321":{"position":[[342,9]]},"327":{"position":[[204,9],[350,7],[362,8]]},"331":{"position":[[283,8]]},"344":{"position":[[247,7]]},"346":{"position":[[631,8]]},"353":{"position":[[681,9]]},"390":{"position":[[1505,7],[1579,10],[2214,11],[2351,7],[2414,10]]},"394":{"position":[[1236,9],[2286,8],[2445,11],[2994,12]]},"396":{"position":[[893,7]]},"400":{"position":[[163,9]]},"416":{"position":[[1642,7],[2779,9]]},"418":{"position":[[200,9],[1899,10]]},"422":{"position":[[1116,10]]},"426":{"position":[[500,7]]},"428":{"position":[[25,7]]},"434":{"position":[[355,8]]},"444":{"position":[[75,7]]}}}],["order",{"_index":385,"t":{"20":{"position":[[76,5]]},"33":{"position":[[1253,5]]},"98":{"position":[[116,5]]},"106":{"position":[[3,5]]},"112":{"position":[[3,5]]},"164":{"position":[[3,5]]},"176":{"position":[[2014,5]]},"208":{"position":[[2067,5]]},"258":{"position":[[98,5]]},"319":{"position":[[339,5]]},"329":{"position":[[306,5],[2401,5]]},"350":{"position":[[289,5]]},"390":{"position":[[30,5]]},"394":{"position":[[2108,5]]},"418":{"position":[[75,5]]}}}],["organ",{"_index":1762,"t":{"251":{"position":[[5308,9],[5410,9]]},"265":{"position":[[102,9]]}}}],["origin",{"_index":1328,"t":{"190":{"position":[[186,11]]},"208":{"position":[[2282,7]]},"230":{"position":[[148,8],[289,8],[537,8],[757,8],[814,9],[907,9],[962,9]]},"234":{"position":[[1254,10]]},"238":{"position":[[158,10]]},"390":{"position":[[1845,10],[1935,10],[2035,10],[2118,10]]}}}],["os",{"_index":959,"t":{"98":{"position":[[965,2]]}}}],["os/contain",{"_index":27,"t":{"4":{"position":[[367,12]]}}}],["other",{"_index":2452,"t":{"430":{"position":[[1771,6]]}}}],["otherwis",{"_index":823,"t":{"80":{"position":[[601,10]]},"86":{"position":[[601,9]]},"226":{"position":[[405,9]]},"346":{"position":[[505,9]]},"394":{"position":[[1711,10]]}}}],["out",{"_index":199,"t":{"8":{"position":[[199,3]]},"65":{"position":[[739,4]]},"134":{"position":[[937,3]]},"208":{"position":[[1988,3]]},"258":{"position":[[589,3]]},"263":{"position":[[139,3]]},"379":{"position":[[405,3]]},"428":{"position":[[342,3]]}}}],["outcom",{"_index":1581,"t":{"226":{"position":[[122,7]]}}}],["output",{"_index":359,"t":{"16":{"position":[[111,6],[163,6]]},"98":{"position":[[3121,6],[3328,6]]},"192":{"position":[[2292,6]]},"230":{"position":[[141,6],[182,6],[282,6],[323,6],[484,6]]},"329":{"position":[[642,6]]},"372":{"position":[[1557,6]]},"384":{"position":[[516,6]]},"444":{"position":[[121,6]]}}}],["outsid",{"_index":526,"t":{"39":{"position":[[125,7]]},"43":{"position":[[132,7]]},"120":{"position":[[61,7]]},"126":{"position":[[190,7]]},"132":{"position":[[61,7]]},"140":{"position":[[231,7]]},"176":{"position":[[2946,8]]},"196":{"position":[[614,7]]}}}],["outta",{"_index":2294,"t":{"390":{"position":[[2012,5]]}}}],["over",{"_index":1207,"t":{"160":{"position":[[1355,4]]},"234":{"position":[[698,4]]},"236":{"position":[[95,4]]},"258":{"position":[[850,4],[944,4]]},"261":{"position":[[403,4]]},"263":{"position":[[50,4],[349,4]]},"350":{"position":[[1238,4]]},"430":{"position":[[1261,4]]}}}],["overrid",{"_index":268,"t":{"12":{"position":[[312,8]]},"16":{"position":[[27,8]]},"67":{"position":[[1116,8]]},"130":{"position":[[885,8]]},"162":{"position":[[324,9]]},"168":{"position":[[536,10],[1517,8]]},"222":{"position":[[1795,10],[2423,9]]},"400":{"position":[[452,9],[540,12]]}}}],["overridden",{"_index":705,"t":{"67":{"position":[[136,10],[300,10],[488,10],[675,10],[863,10]]},"222":{"position":[[1877,10]]}}}],["overview",{"_index":661,"t":{"58":{"position":[[1497,8]]}}}],["overwrit",{"_index":2186,"t":{"364":{"position":[[318,9]]}}}],["own",{"_index":2343,"t":{"394":{"position":[[3239,4]]}}}],["p",{"_index":1284,"t":{"176":{"position":[[2744,1]]},"394":{"position":[[2311,1]]},"396":{"position":[[631,1],[786,1]]},"406":{"position":[[77,1]]}}}],["packag",{"_index":971,"t":{"98":{"position":[[1159,7]]},"366":{"position":[[324,7]]},"394":{"position":[[114,8]]}}}],["package.json",{"_index":2364,"t":{"400":{"position":[[465,12]]}}}],["page",{"_index":546,"t":{"43":{"position":[[345,4]]},"88":{"position":[[164,4]]},"140":{"position":[[445,4]]},"176":{"position":[[3074,4],[4121,5]]},"355":{"position":[[3192,5]]},"394":{"position":[[134,4],[190,4]]},"444":{"position":[[9,4],[348,6],[372,4]]},"453":{"position":[[419,4]]}}}],["pan",{"_index":1887,"t":{"314":{"position":[[188,4]]}}}],["pandora",{"_index":1017,"t":{"100":{"position":[[539,7]]},"148":{"position":[[114,8]]},"384":{"position":[[147,8]]}}}],["pane",{"_index":907,"t":{"92":{"position":[[558,5]]}}}],["panel",{"_index":566,"t":{"47":{"position":[[347,5]]},"424":{"position":[[531,5]]}}}],["param",{"_index":431,"t":{"24":{"position":[[341,6]]}}}],["paramet",{"_index":1770,"t":{"254":{"position":[[104,11]]}}}],["pars",{"_index":18,"t":{"4":{"position":[[152,5],[322,5],[1141,5],[2788,5]]},"98":{"position":[[515,6]]},"102":{"position":[[0,5],[279,7],[323,5],[1161,7]]},"192":{"position":[[993,8],[2061,7]]},"329":{"position":[[849,5],[1079,5]]},"348":{"position":[[235,5],[1251,5],[2553,5]]},"379":{"position":[[124,7],[271,6]]}}}],["parseconnectionurl(v",{"_index":2077,"t":{"348":{"position":[[447,23]]}}}],["parsedconfig",{"_index":2040,"t":{"344":{"position":[[472,14],[1158,13]]}}}],["part",{"_index":207,"t":{"8":{"position":[[359,4]]},"108":{"position":[[226,4],[324,4]]},"114":{"position":[[222,4],[320,4]]},"148":{"position":[[579,4],[677,4]]},"208":{"position":[[3465,5]]},"224":{"position":[[89,5]]},"228":{"position":[[299,5],[1026,5],[1112,4]]},"230":{"position":[[806,4]]},"249":{"position":[[267,5]]},"251":{"position":[[5112,4]]},"278":{"position":[[87,5]]},"325":{"position":[[187,6],[402,5]]},"430":{"position":[[1845,5]]}}}],["parti",{"_index":616,"t":{"51":{"position":[[1416,5]]},"65":{"position":[[693,5]]},"67":{"position":[[2367,9]]},"69":{"position":[[1001,9]]},"96":{"position":[[6,5]]},"390":{"position":[[2763,5]]}}}],["partial",{"_index":1825,"t":{"274":{"position":[[221,7]]}}}],["partyplex",{"_index":738,"t":{"67":{"position":[[2176,12]]},"69":{"position":[[897,12]]}}}],["pass",{"_index":973,"t":{"98":{"position":[[1231,4]]},"228":{"position":[[352,6],[383,4],[443,4]]},"350":{"position":[[1067,4],[1347,4]]}}}],["password",{"_index":184,"t":{"4":{"position":[[5123,11]]},"22":{"position":[[1318,11]]},"47":{"position":[[261,8]]},"60":{"position":[[107,9],[157,9],[184,8]]},"63":{"position":[[792,8]]},"67":{"position":[[2749,11]]},"106":{"position":[[295,8]]},"110":{"position":[[275,8],[417,11],[652,11]]},"112":{"position":[[228,8]]},"116":{"position":[[206,8],[363,11],[620,11]]},"130":{"position":[[504,9],[1481,9],[1516,8],[1589,9]]},"158":{"position":[[233,11],[499,11]]},"164":{"position":[[121,8]]},"166":{"position":[[302,11],[552,11]]},"180":{"position":[[261,8]]},"182":{"position":[[327,11],[619,11]]},"192":{"position":[[392,8],[410,8],[640,9]]},"194":{"position":[[230,11],[447,11]]},"222":{"position":[[426,9]]},"329":{"position":[[1303,8]]},"424":{"position":[[445,8]]}}}],["past",{"_index":2254,"t":{"379":{"position":[[346,5]]}}}],["path",{"_index":500,"t":{"35":{"position":[[737,4],[885,4]]},"86":{"position":[[454,4],[583,4],[625,4],[655,4]]},"122":{"position":[[163,4]]},"134":{"position":[[194,4],[288,4]]},"204":{"position":[[400,5],[520,4]]},"364":{"position":[[378,4]]}}}],["path/to/flatpak/build/dir",{"_index":2184,"t":{"364":{"position":[[268,26]]}}}],["pattern",{"_index":203,"t":{"8":{"position":[[299,8]]},"212":{"position":[[752,7]]},"216":{"position":[[25,7]]},"251":{"position":[[3300,8]]},"278":{"position":[[185,9]]},"430":{"position":[[608,9]]}}}],["paus",{"_index":806,"t":{"76":{"position":[[760,8]]},"350":{"position":[[2106,11]]}}}],["payload",{"_index":436,"t":{"24":{"position":[[483,7]]},"98":{"position":[[3296,7]]},"384":{"position":[[431,7]]}}}],["pd",{"_index":586,"t":{"51":{"position":[[344,3],[1097,3]]},"58":{"position":[[225,3],[426,3],[1171,3]]},"63":{"position":[[355,3]]},"170":{"position":[[197,3]]},"172":{"position":[[89,3]]},"184":{"position":[[37,4],[197,3],[276,3]]},"186":{"position":[[89,3]]},"190":{"position":[[675,3]]}}}],["pds/repositori",{"_index":595,"t":{"51":{"position":[[574,14]]},"58":{"position":[[656,14]]}}}],["peac",{"_index":2450,"t":{"430":{"position":[[1541,5]]}}}],["percent",{"_index":152,"t":{"4":{"position":[[4234,10]]},"82":{"position":[[126,7],[521,10]]},"102":{"position":[[879,7]]}}}],["perform",{"_index":848,"t":{"86":{"position":[[260,11]]},"251":{"position":[[283,10]]},"418":{"position":[[299,9]]},"420":{"position":[[32,9]]}}}],["period",{"_index":2274,"t":{"390":{"position":[[1033,7]]}}}],["permiss",{"_index":1202,"t":{"160":{"position":[[1041,11]]},"208":{"position":[[1406,10],[4843,11]]},"394":{"position":[[3211,11],[3305,10]]},"426":{"position":[[117,12]]}}}],["persist",{"_index":288,"t":{"14":{"position":[[42,7],[246,12],[380,9],[539,9],[666,10],[1154,11],[1296,9],[1423,10],[2081,9]]},"22":{"position":[[1488,10],[1802,12]]},"31":{"position":[[296,7]]},"51":{"position":[[1334,10],[1762,10]]},"192":{"position":[[459,7]]},"430":{"position":[[1078,12]]}}}],["person",{"_index":33,"t":{"4":{"position":[[499,6]]},"51":{"position":[[319,8],[348,9]]},"58":{"position":[[229,9],[401,8],[430,9]]},"65":{"position":[[78,6],[118,6]]},"176":{"position":[[3562,8]]},"184":{"position":[[201,9]]},"337":{"position":[[683,8]]},"418":{"position":[[557,8]]},"420":{"position":[[290,8]]},"430":{"position":[[1580,8]]}}}],["pgid",{"_index":1201,"t":{"160":{"position":[[995,4]]},"394":{"position":[[3392,5]]}}}],["pgid=1000",{"_index":2329,"t":{"394":{"position":[[794,9]]},"396":{"position":[[618,11],[745,11],[1383,9]]}}}],["phone",{"_index":2305,"t":{"390":{"position":[[2852,8]]}}}],["phone/comput",{"_index":941,"t":{"98":{"position":[[62,14]]}}}],["phrase",{"_index":993,"t":{"98":{"position":[[2399,7],[2922,7]]},"251":{"position":[[1389,7]]},"289":{"position":[[12,6]]},"301":{"position":[[521,7],[598,7]]}}}],["phu7",{"_index":682,"t":{"63":{"position":[[950,4],[1201,4]]},"190":{"position":[[950,4],[1159,4],[1389,4],[1854,4],[2169,4]]}}}],["pi",{"_index":2315,"t":{"394":{"position":[[76,3]]}}}],["pickup",{"_index":2398,"t":{"408":{"position":[[179,6]]}}}],["pin",{"_index":2467,"t":{"453":{"position":[[488,6]]}}}],["ping",{"_index":1948,"t":{"329":{"position":[[1924,4]]}}}],["pip/pipx",{"_index":2174,"t":{"359":{"position":[[86,8]]}}}],["place",{"_index":452,"t":{"31":{"position":[[70,6]]},"374":{"position":[[554,5]]}}}],["placehold",{"_index":2420,"t":{"416":{"position":[[3655,12]]}}}],["plain",{"_index":426,"t":{"24":{"position":[[210,5]]},"282":{"position":[[41,5],[386,5]]}}}],["platform",{"_index":578,"t":{"51":{"position":[[126,8],[1495,9]]},"71":{"position":[[104,9]]},"170":{"position":[[101,8]]},"331":{"position":[[404,8]]},"384":{"position":[[114,8],[303,9]]},"390":{"position":[[2719,8],[2800,8]]},"394":{"position":[[6,8]]},"400":{"position":[[346,8]]},"430":{"position":[[1315,8],[1504,8]]}}}],["platformid",{"_index":2131,"t":{"350":{"position":[[2333,11]]}}}],["play",{"_index":444,"t":{"26":{"position":[[92,6]]},"28":{"position":[[9,7]]},"33":{"position":[[41,7],[123,7],[150,7],[264,7],[287,7],[470,7],[594,8],[940,7],[1242,7],[1309,7]]},"51":{"position":[[722,5]]},"58":{"position":[[804,5]]},"65":{"position":[[31,5],[542,5],[608,5],[713,4],[753,5],[890,5]]},"67":{"position":[[2079,4]]},"71":{"position":[[73,7]]},"76":{"position":[[608,6],[778,8],[850,7]]},"78":{"position":[[34,7],[91,7]]},"86":{"position":[[276,7]]},"98":{"position":[[144,5],[1727,7]]},"102":{"position":[[887,7]]},"148":{"position":[[48,7],[181,6]]},"150":{"position":[[67,6]]},"160":{"position":[[283,6]]},"176":{"position":[[232,4],[307,4],[451,7]]},"190":{"position":[[71,5],[172,4],[412,4]]},"192":{"position":[[1020,6]]},"204":{"position":[[45,6]]},"214":{"position":[[114,4],[202,4],[236,4],[258,5],[292,4],[379,5],[396,5],[442,4],[521,5],[569,4],[613,4],[673,4],[760,4]]},"218":{"position":[[33,4],[98,4],[144,4],[193,4],[271,4],[336,4],[428,4],[1431,4],[1524,4]]},"220":{"position":[[114,4],[369,4],[486,4]]},"224":{"position":[[102,4],[251,4],[326,4],[429,4],[495,4],[556,4],[634,4],[1197,4]]},"226":{"position":[[520,4]]},"228":{"position":[[284,4],[525,4],[601,4],[703,4],[779,4],[876,4],[953,4],[1532,4]]},"230":{"position":[[157,4],[298,4],[546,5],[701,5]]},"234":{"position":[[35,4],[197,4],[263,4]]},"245":{"position":[[221,4],[296,4],[391,4]]},"249":{"position":[[171,4]]},"251":{"position":[[5290,4]]},"256":{"position":[[241,4]]},"261":{"position":[[233,4]]},"263":{"position":[[471,4]]},"267":{"position":[[447,4]]},"278":{"position":[[96,4]]},"289":{"position":[[55,4]]},"301":{"position":[[73,4],[574,4],[694,4]]},"305":{"position":[[202,4],[277,4],[372,4]]},"331":{"position":[[246,6],[332,4],[391,4],[464,6]]},"337":{"position":[[455,6],[501,7]]},"340":{"position":[[2144,7]]},"350":{"position":[[108,6],[408,8],[771,7],[834,5],[1464,6],[1854,6],[1899,7],[1985,9],[2080,9],[2212,5],[2370,5],[2680,6],[2844,5]]},"353":{"position":[[166,6],[934,4],[1119,8]]},"355":{"position":[[1845,5],[2041,6],[2258,7],[2321,4],[2441,4],[2473,6],[3218,4],[3296,5],[3361,4],[3638,5],[3751,4],[3996,4]]},"382":{"position":[[113,5]]},"386":{"position":[[21,7]]},"390":{"position":[[2899,7]]},"426":{"position":[[569,7]]},"430":{"position":[[782,7],[1435,4],[1464,4],[1899,5]]},"432":{"position":[[139,6]]},"434":{"position":[[72,7]]},"436":{"position":[[92,6]]}}}],["play/scrobbl",{"_index":1555,"t":{"218":{"position":[[1501,14]]}}}],["playdat",{"_index":2074,"t":{"346":{"position":[[906,9]]}}}],["playedat",{"_index":2072,"t":{"346":{"position":[[736,9],[873,8]]}}}],["player",{"_index":473,"t":{"33":{"position":[[572,6],[669,6],[730,7]]},"71":{"position":[[94,6]]},"73":{"position":[[592,6]]},"76":{"position":[[747,6],[787,6]]},"98":{"position":[[3265,6]]},"160":{"position":[[59,7],[303,6]]},"162":{"position":[[210,6],[287,7]]},"176":{"position":[[36,6]]},"337":{"position":[[66,6],[85,7],[98,6],[566,6],[593,6],[635,6],[709,6],[924,6]]},"340":{"position":[[47,6],[622,6],[650,6],[791,6],[2120,6]]},"342":{"position":[[775,6]]},"348":{"position":[[1984,6],[2511,6]]},"350":{"position":[[87,6],[279,6],[1085,6],[1194,6],[1356,6],[2200,6],[2277,6],[2437,6],[2456,6],[2580,6],[2642,6]]},"355":{"position":[[578,7]]},"416":{"position":[[31,7]]},"430":{"position":[[301,6]]},"434":{"position":[[116,7],[134,7]]}}}],["player'",{"_index":2060,"t":{"346":{"position":[[92,8],[587,8]]}}}],["playerdata",{"_index":2130,"t":{"350":{"position":[[2301,11]]}}}],["playerst",{"_index":2127,"t":{"350":{"position":[[2064,12]]}}}],["playerstatedata",{"_index":2120,"t":{"350":{"position":[[1591,16],[2313,15]]}}}],["playlist/queu",{"_index":1252,"t":{"176":{"position":[[92,14]]}}}],["playobject",{"_index":1963,"t":{"331":{"position":[[4,10],[523,10],[648,10],[736,10]]},"340":{"position":[[2043,10]]},"346":{"position":[[127,11],[294,10],[671,10]]},"350":{"position":[[742,11],[2496,10]]},"353":{"position":[[375,11]]},"355":{"position":[[2878,11],[3055,12],[3556,11],[3588,12]]}}}],["plays.push(playerdata",{"_index":2133,"t":{"350":{"position":[[2520,23]]}}}],["playtransform",{"_index":1539,"t":{"216":{"position":[[477,16]]},"218":{"position":[[1351,16]]},"222":{"position":[[850,16],[1531,16],[1709,16],[2335,16]]},"226":{"position":[[937,16],[1218,16]]},"228":{"position":[[1258,16],[1542,16]]},"230":{"position":[[70,13],[410,16]]},"265":{"position":[[457,16]]},"267":{"position":[[640,16]]},"270":{"position":[[276,16]]},"272":{"position":[[548,16]]},"274":{"position":[[611,16]]},"276":{"position":[[646,16]]},"280":{"position":[[672,16]]},"284":{"position":[[156,16]]},"307":{"position":[[340,16]]},"312":{"position":[[406,16]]},"314":{"position":[[305,16]]},"316":{"position":[[338,16]]},"418":{"position":[[1912,16]]},"422":{"position":[[1129,16]]}}}],["pleas",{"_index":944,"t":{"98":{"position":[[255,6],[3084,6],[3281,6]]},"176":{"position":[[3528,6]]},"192":{"position":[[2248,6]]},"267":{"position":[[285,6]]},"390":{"position":[[1361,6]]}}}],["plex",{"_index":40,"t":{"4":{"position":[[618,4],[1535,4],[3218,4]]},"65":{"position":[[494,4],[565,4],[681,4]]},"67":{"position":[[1694,7],[1864,7],[2160,7]]},"71":{"position":[[146,5]]},"73":{"position":[[665,4]]},"168":{"position":[[10,4],[79,4],[225,4],[295,4],[341,4],[765,4],[921,4],[967,4],[1085,4],[1233,4],[1257,4],[1430,4],[1656,4],[1713,4],[1804,5],[1886,5],[3255,6]]},"355":{"position":[[266,5],[1177,5]]},"412":{"position":[[338,5]]},"416":{"position":[[123,4],[2508,4],[2577,4],[3001,4]]},"418":{"position":[[923,4]]},"422":{"position":[[140,4]]},"430":{"position":[[348,4]]},"434":{"position":[[198,5]]}}}],["plex.json",{"_index":110,"t":{"4":{"position":[[2470,9]]}}}],["plex_devices_allow",{"_index":1241,"t":{"168":{"position":[[1917,18]]}}}],["plex_devices_block",{"_index":1242,"t":{"168":{"position":[[1988,18]]}}}],["plex_libraries_allow",{"_index":1236,"t":{"168":{"position":[[1491,20],[2069,20]]}}}],["plex_libraries_block",{"_index":1243,"t":{"168":{"position":[[2151,20]]}}}],["plex_local_us",{"_index":1231,"t":{"168":{"position":[[270,17],[1145,18]]}}}],["plex_token",{"_index":1239,"t":{"168":{"position":[[1694,10]]}}}],["plex_token=6c0ihz8j7__f5r18oa0zm8",{"_index":2414,"t":{"416":{"position":[[2743,33]]}}}],["plex_transforms=musicbrainz",{"_index":2428,"t":{"418":{"position":[[1470,27]]},"422":{"position":[[687,27]]}}}],["plex_url",{"_index":1237,"t":{"168":{"position":[[1628,8]]}}}],["plex_url=http://192.168.0.101:32400",{"_index":2413,"t":{"416":{"position":[[2705,35]]}}}],["plex_users_allow",{"_index":1233,"t":{"168":{"position":[[453,16],[723,16],[885,17],[1179,17],[1744,16]]}}}],["plex_users_allow=myplexusernam",{"_index":2415,"t":{"416":{"position":[[2847,31]]}}}],["plex_users_block",{"_index":1240,"t":{"168":{"position":[[1826,16]]}}}],["plexmediaserver/1.24.5.5173",{"_index":2232,"t":{"372":{"position":[[1054,27]]}}}],["plkex",{"_index":2235,"t":{"372":{"position":[[1111,6]]}}}],["plyr",{"_index":1344,"t":{"190":{"position":[[983,9],[1422,8],[1889,6],[2204,6]]}}}],["plyr.fm",{"_index":1341,"t":{"190":{"position":[[810,8],[1228,7]]}}}],["pm195xpv98cdpk0qw47fiior8akatax5dblbf",{"_index":491,"t":{"35":{"position":[[362,37]]},"424":{"position":[[1533,37]]}}}],["podcast",{"_index":697,"t":{"65":{"position":[[623,7]]},"67":{"position":[[2089,10],[2132,12]]},"69":{"position":[[869,12]]}}}],["point",{"_index":1444,"t":{"208":{"position":[[1277,5]]},"216":{"position":[[131,7]]}}}],["poll",{"_index":390,"t":{"22":{"position":[[85,7],[108,7],[129,7]]},"24":{"position":[[660,4],[728,7]]},"67":{"position":[[102,7]]},"208":{"position":[[4601,7]]},"337":{"position":[[877,7]]},"342":{"position":[[418,7]]},"350":{"position":[[645,7]]},"355":{"position":[[31,7],[407,7],[1139,7],[1233,7],[2148,7]]}}}],["pollingopt",{"_index":1990,"t":{"340":{"position":[[236,14],[522,14]]}}}],["polo",{"_index":1886,"t":{"314":{"position":[[180,5]]}}}],["pong",{"_index":1949,"t":{"329":{"position":[[1929,4]]}}}],["pop!_o",{"_index":2379,"t":{"404":{"position":[[107,8]]}}}],["popular",{"_index":1129,"t":{"134":{"position":[[373,7]]},"404":{"position":[[59,7]]}}}],["popup",{"_index":1466,"t":{"208":{"position":[[2473,5]]}}}],["port",{"_index":266,"t":{"12":{"position":[[296,4],[345,4]]},"14":{"position":[[3715,4]]},"76":{"position":[[514,4]]},"98":{"position":[[950,4]]},"108":{"position":[[418,4]]},"114":{"position":[[412,4],[449,4]]},"148":{"position":[[789,4],[895,4]]},"156":{"position":[[183,4]]},"160":{"position":[[1391,4],[1534,5],[1589,4]]},"164":{"position":[[268,4],[374,4]]},"166":{"position":[[116,4]]},"168":{"position":[[50,4]]},"192":{"position":[[711,5],[841,4],[978,5]]},"247":{"position":[[1926,6]]},"309":{"position":[[1043,6]]},"337":{"position":[[668,4]]},"340":{"position":[[775,4]]},"372":{"position":[[2165,4],[2254,4],[2354,4]]},"394":{"position":[[1424,6],[1451,4],[1468,4],[2083,4],[2223,4],[2414,6]]},"396":{"position":[[139,4],[1423,6]]},"400":{"position":[[1301,4],[1343,4]]},"412":{"position":[[156,4]]},"414":{"position":[[487,6]]},"416":{"position":[[2548,4]]}}}],["ports/prefix",{"_index":2076,"t":{"348":{"position":[[269,13]]}}}],["posit",{"_index":807,"t":{"76":{"position":[[794,8]]},"86":{"position":[[72,9]]},"337":{"position":[[600,8]]},"350":{"position":[[2118,9],[2170,8],[2414,8]]}}}],["possibl",{"_index":93,"t":{"4":{"position":[[1876,8]]},"160":{"position":[[629,9]]},"176":{"position":[[3640,8]]},"208":{"position":[[1940,8]]},"251":{"position":[[1430,8],[1755,11],[1953,13],[3525,11],[3873,13],[4392,11],[4612,11]]},"258":{"position":[[441,11]]},"301":{"position":[[753,11],[887,13]]},"329":{"position":[[2866,9]]},"430":{"position":[[2042,9]]}}}],["post",{"_index":2230,"t":{"372":{"position":[[1010,4]]}}}],["postcompar",{"_index":1541,"t":{"216":{"position":[[547,14]]},"218":{"position":[[172,11],[407,11],[1079,12]]}}}],["potenti",{"_index":1564,"t":{"222":{"position":[[192,13]]},"251":{"position":[[882,9]]},"376":{"position":[[1255,11]]}}}],["pr",{"_index":2399,"t":{"410":{"position":[[7,2]]}}}],["practic",{"_index":1726,"t":{"249":{"position":[[127,9]]},"301":{"position":[[640,9]]},"355":{"position":[[3826,8]]}}}],["pre",{"_index":336,"t":{"14":{"position":[[2667,3]]},"228":{"position":[[253,3]]},"303":{"position":[[1180,4]]}}}],["preced",{"_index":1756,"t":{"251":{"position":[[4178,9]]}}}],["precompar",{"_index":1540,"t":{"216":{"position":[[496,13]]},"218":{"position":[[13,10],[251,10],[827,10],[984,10],[1064,10]]},"222":{"position":[[869,13],[1550,13],[1728,13],[2354,13]]},"226":{"position":[[956,13],[1237,13]]},"228":{"position":[[1277,13],[1561,13]]},"230":{"position":[[429,13],[718,12]]},"265":{"position":[[476,13]]},"267":{"position":[[673,13]]},"270":{"position":[[295,13]]},"272":{"position":[[567,13]]},"274":{"position":[[630,13]]},"276":{"position":[[665,13]]},"280":{"position":[[691,13]]},"284":{"position":[[191,13]]},"307":{"position":[[359,13]]},"312":{"position":[[425,13]]},"314":{"position":[[324,13]]},"316":{"position":[[357,13]]},"418":{"position":[[1931,13]]},"422":{"position":[[1148,13]]}}}],["prefer",{"_index":1349,"t":{"192":{"position":[[110,11]]},"234":{"position":[[557,6]]},"256":{"position":[[295,6],[520,6]]},"258":{"position":[[823,6],[915,6]]},"261":{"position":[[464,6],[564,6]]},"263":{"position":[[38,6],[334,6]]},"355":{"position":[[309,6]]}}}],["preferences/set",{"_index":1382,"t":{"196":{"position":[[53,20]]}}}],["prefix",{"_index":1708,"t":{"247":{"position":[[1028,6]]},"309":{"position":[[283,6]]}}}],["premium",{"_index":889,"t":{"90":{"position":[[271,7]]}}}],["present",{"_index":26,"t":{"4":{"position":[[352,7]]},"102":{"position":[[110,10]]},"251":{"position":[[506,7],[738,7]]},"258":{"position":[[1037,7]]},"301":{"position":[[419,7],[481,7]]},"303":{"position":[[706,7],[787,7],[905,7],[992,8]]},"305":{"position":[[402,7]]},"323":{"position":[[376,10]]}}}],["preset",{"_index":1696,"t":{"247":{"position":[[81,7],[317,7],[358,6],[445,7]]},"418":{"position":[[727,7]]},"420":{"position":[[460,7]]}}}],["presid",{"_index":2284,"t":{"390":{"position":[[1810,9]]}}}],["press",{"_index":898,"t":{"92":{"position":[[318,5],[392,5]]}}}],["pretend",{"_index":2248,"t":{"376":{"position":[[676,7]]}}}],["pretransform",{"_index":1706,"t":{"247":{"position":[[965,12],[1748,12]]},"309":{"position":[[220,12],[865,12]]}}}],["prevent",{"_index":936,"t":{"96":{"position":[[586,7]]},"150":{"position":[[390,7]]},"152":{"position":[[138,7]]},"212":{"position":[[866,7]]},"355":{"position":[[2485,8],[4048,7]]}}}],["preview",{"_index":664,"t":{"58":{"position":[[1556,7]]}}}],["previou",{"_index":1561,"t":{"220":{"position":[[505,8]]},"230":{"position":[[518,8]]},"416":{"position":[[448,8]]}}}],["previous",{"_index":2113,"t":{"350":{"position":[[810,10],[2889,10]]}}}],["primari",{"_index":1690,"t":{"241":{"position":[[692,7]]},"256":{"position":[[736,7]]}}}],["primarili",{"_index":2108,"t":{"350":{"position":[[36,9]]}}}],["print",{"_index":2346,"t":{"394":{"position":[[3487,6],[3507,6]]}}}],["priorit",{"_index":1663,"t":{"234":{"position":[[933,10]]},"236":{"position":[[330,10]]}}}],["prioriti",{"_index":172,"t":{"4":{"position":[[4923,13],[5147,13]]},"22":{"position":[[758,8],[944,13],[1111,8],[1342,13]]},"33":{"position":[[1282,8]]},"258":{"position":[[143,8]]}}}],["privaci",{"_index":608,"t":{"51":{"position":[[1237,8]]},"58":{"position":[[1311,8]]},"60":{"position":[[129,7]]}}}],["probabl",{"_index":647,"t":{"56":{"position":[[275,8]]},"63":{"position":[[370,8]]}}}],["problem",{"_index":945,"t":{"98":{"position":[[294,8]]},"376":{"position":[[1279,8]]},"394":{"position":[[3316,9]]},"428":{"position":[[537,8]]}}}],["proce",{"_index":2191,"t":{"364":{"position":[[491,7]]}}}],["process",{"_index":1259,"t":{"176":{"position":[[761,7],[2481,7],[4351,7]]},"216":{"position":[[169,10]]},"218":{"position":[[755,9],[861,9]]},"226":{"position":[[313,10],[390,11],[508,7]]},"228":{"position":[[406,10]]},"234":{"position":[[1687,11]]},"350":{"position":[[2572,7]]}}}],["process.env.cool_token",{"_index":2045,"t":{"344":{"position":[[781,22]]}}}],["process.env.cool_url",{"_index":2044,"t":{"344":{"position":[[752,21]]}}}],["processrecentplay",{"_index":2115,"t":{"350":{"position":[[1001,18],[1134,21],[1272,18]]},"355":{"position":[[1815,19]]}}}],["produc",{"_index":1616,"t":{"230":{"position":[[885,8],[940,8]]}}}],["profil",{"_index":545,"t":{"43":{"position":[[337,7]]},"45":{"position":[[119,7]]},"58":{"position":[[62,7]]},"140":{"position":[[437,7]]},"430":{"position":[[2232,7]]}}}],["project",{"_index":95,"t":{"4":{"position":[[2021,8],[3660,7]]},"134":{"position":[[962,7]]},"208":{"position":[[1846,7]]},"331":{"position":[[772,7]]},"355":{"position":[[1498,7]]},"364":{"position":[[170,7]]},"366":{"position":[[224,7],[271,7]]}}}],["project_dir",{"_index":2196,"t":{"366":{"position":[[285,11],[463,11]]}}}],["project_dir/config",{"_index":71,"t":{"4":{"position":[[1293,18]]}}}],["project_dir/config/config.json",{"_index":126,"t":{"4":{"position":[[2953,30]]}}}],["project_dir/flatpak",{"_index":2200,"t":{"366":{"position":[[375,19],[561,19],[761,19]]}}}],["promise<playobject",{"_index":2124,"t":{"350":{"position":[[1824,21]]},"353":{"position":[[715,21]]}}}],["promise<tru",{"_index":2085,"t":{"348":{"position":[[766,12],[1722,12]]}}}],["promot",{"_index":1786,"t":{"256":{"position":[[693,12]]}}}],["proper",{"_index":1878,"t":{"303":{"position":[[1265,6]]},"426":{"position":[[105,6]]}}}],["properli",{"_index":1425,"t":{"208":{"position":[[463,8]]},"337":{"position":[[298,8]]},"350":{"position":[[668,8]]}}}],["propert",{"_index":1593,"t":{"228":{"position":[[133,9]]}}}],["properti",{"_index":335,"t":{"14":{"position":[[2539,11]]},"18":{"position":[[357,8]]},"22":{"position":[[267,9]]},"33":{"position":[[867,8]]},"67":{"position":[[150,8],[314,8],[502,8],[689,8],[877,8]]},"69":{"position":[[47,8]]},"80":{"position":[[65,8],[131,8],[625,8]]},"98":{"position":[[1661,8]]},"180":{"position":[[635,8]]},"190":{"position":[[747,8]]},"222":{"position":[[2433,8]]},"224":{"position":[[702,8],[841,8],[939,10]]},"226":{"position":[[174,10]]},"228":{"position":[[158,8],[223,8]]},"243":{"position":[[11,10]]},"249":{"position":[[9,10]]},"256":{"position":[[1281,8]]},"258":{"position":[[42,8],[152,9]]},"282":{"position":[[903,8]]},"303":{"position":[[10,10],[531,10]]},"329":{"position":[[1287,10],[2021,11],[2054,10],[3154,10]]},"340":{"position":[[570,11]]},"348":{"position":[[170,10]]}}}],["properties/behavior",{"_index":1917,"t":{"325":{"position":[[441,19]]}}}],["protect",{"_index":2084,"t":{"348":{"position":[[731,9],[1685,9]]},"350":{"position":[[1752,9]]},"353":{"position":[[644,9]]}}}],["protocol",{"_index":263,"t":{"12":{"position":[[232,8],[255,8]]},"51":{"position":[[151,8],[198,8]]},"58":{"position":[[280,8]]},"170":{"position":[[126,8]]}}}],["protocol]://[hostname]:[port]/[path",{"_index":1048,"t":{"108":{"position":[[138,37]]},"114":{"position":[[136,37]]},"148":{"position":[[493,37]]}}}],["provid",{"_index":101,"t":{"4":{"position":[[2224,8],[3849,8]]},"14":{"position":[[1018,11],[1763,11],[2386,11],[2964,11],[3812,11]]},"41":{"position":[[400,9]]},"65":{"position":[[391,8]]},"86":{"position":[[539,9],[686,7]]},"98":{"position":[[440,8]]},"106":{"position":[[270,7]]},"112":{"position":[[259,7]]},"122":{"position":[[17,8]]},"124":{"position":[[202,8]]},"130":{"position":[[1456,7],[1564,7]]},"134":{"position":[[17,8]]},"136":{"position":[[71,8]]},"138":{"position":[[200,8],[260,8]]},"164":{"position":[[382,8],[435,8]]},"180":{"position":[[533,7]]},"204":{"position":[[317,8],[503,7]]},"208":{"position":[[3336,7],[5272,8]]},"278":{"position":[[52,8]]},"303":{"position":[[645,8],[1257,7]]},"335":{"position":[[19,7]]},"348":{"position":[[191,8]]},"353":{"position":[[107,8]]},"364":{"position":[[29,8]]},"390":{"position":[[1320,9],[1388,7],[2586,7],[2614,7],[3213,7]]},"416":{"position":[[1485,9]]},"418":{"position":[[387,7]]},"420":{"position":[[120,7]]},"444":{"position":[[136,8]]}}}],["proxi",{"_index":799,"t":{"76":{"position":[[530,6]]},"86":{"position":[[570,5]]},"134":{"position":[[894,5]]},"176":{"position":[[1572,5]]},"196":{"position":[[703,5]]},"204":{"position":[[474,6]]}}}],["psuedo",{"_index":1764,"t":{"251":{"position":[[5510,6]]}}}],["public",{"_index":605,"t":{"51":{"position":[[1065,6],[1104,7],[1144,6]]},"58":{"position":[[1178,7],[1218,6],[1378,6]]},"88":{"position":[[157,6]]}}}],["publicli",{"_index":1390,"t":{"196":{"position":[[555,8]]}}}],["publish",{"_index":2339,"t":{"394":{"position":[[2278,7]]}}}],["puid",{"_index":1200,"t":{"160":{"position":[[986,4]]},"394":{"position":[[3383,4]]}}}],["puid=1000",{"_index":2327,"t":{"394":{"position":[[695,9]]},"396":{"position":[[603,11],[730,11],[1371,9]]}}}],["pull",{"_index":590,"t":{"51":{"position":[[467,5],[1020,6]]},"58":{"position":[[549,5],[1098,6]]},"455":{"position":[[35,4],[279,4]]},"457":{"position":[[84,7],[115,4]]}}}],["punk",{"_index":1748,"t":{"251":{"position":[[1817,4],[1999,5],[3587,4],[3649,4],[3919,5],[4453,4]]},"301":{"position":[[815,4],[933,5]]}}}],["push",{"_index":387,"t":{"22":{"position":[[14,4]]},"350":{"position":[[2481,4]]}}}],["pwd)/config:/config",{"_index":2337,"t":{"394":{"position":[[1848,23]]},"396":{"position":[[801,23]]}}}],["python",{"_index":2172,"t":{"359":{"position":[[73,6]]}}}],["qualiti",{"_index":1030,"t":{"102":{"position":[[383,7]]}}}],["queri",{"_index":430,"t":{"24":{"position":[[335,5]]},"208":{"position":[[3687,5]]},"249":{"position":[[293,7]]},"251":{"position":[[832,7],[984,5],[2341,8]]}}}],["querystrings/data",{"_index":1296,"t":{"176":{"position":[[3583,17]]}}}],["queu",{"_index":304,"t":{"14":{"position":[[299,6]]},"430":{"position":[[1013,7]]}}}],["queue",{"_index":453,"t":{"31":{"position":[[97,5]]},"176":{"position":[[211,5]]},"390":{"position":[[3048,8]]}}}],["quick",{"_index":1678,"t":{"234":{"position":[[1570,5]]},"396":{"position":[[12,5]]},"430":{"position":[[1221,5]]},"438":{"position":[[8,5]]}}}],["quicker",{"_index":321,"t":{"14":{"position":[[1129,7]]}}}],["quickstart",{"_index":1713,"t":{"247":{"position":[[1345,11]]},"309":{"position":[[594,11]]},"430":{"position":[[2420,10]]}}}],["rang",{"_index":1659,"t":{"234":{"position":[[830,5]]},"236":{"position":[[227,5]]}}}],["rank",{"_index":1804,"t":{"258":{"position":[[71,4]]}}}],["rariti",{"_index":1618,"t":{"230":{"position":[[898,8],[953,8]]}}}],["raspberri",{"_index":2314,"t":{"394":{"position":[[66,9]]}}}],["rate",{"_index":1680,"t":{"241":{"position":[[9,4]]}}}],["raw",{"_index":666,"t":{"58":{"position":[[1602,3]]},"98":{"position":[[3117,3]]},"190":{"position":[[658,3]]},"192":{"position":[[1163,3]]},"384":{"position":[[550,3]]}}}],["re",{"_index":484,"t":{"35":{"position":[[26,2]]},"39":{"position":[[27,2]]},"43":{"position":[[27,2]]},"51":{"position":[[26,2]]},"58":{"position":[[26,2]]},"118":{"position":[[65,2]]},"120":{"position":[[189,2]]},"126":{"position":[[55,2]]},"132":{"position":[[204,2]]},"140":{"position":[[72,2]]},"170":{"position":[[210,2]]},"184":{"position":[[289,2]]},"208":{"position":[[4647,2]]},"329":{"position":[[2846,2]]},"376":{"position":[[1132,2]]},"390":{"position":[[1162,3]]}}}],["re)authent",{"_index":1307,"t":{"176":{"position":[[4296,16]]},"208":{"position":[[4270,16]]},"376":{"position":[[497,16]]},"416":{"position":[[1165,16],[4053,16]]}}}],["re)start",{"_index":2410,"t":{"416":{"position":[[1949,9]]}}}],["reach",{"_index":1475,"t":{"208":{"position":[[3084,5]]},"374":{"position":[[474,5]]}}}],["reachabl",{"_index":2237,"t":{"372":{"position":[[1877,9]]}}}],["read",{"_index":604,"t":{"51":{"position":[[998,4],[1151,5]]},"58":{"position":[[1076,4],[1225,5]]},"329":{"position":[[386,7],[1317,4],[3230,4]]},"337":{"position":[[857,4]]},"344":{"position":[[18,5]]},"348":{"position":[[1889,4]]}}}],["readi",{"_index":1355,"t":{"192":{"position":[[661,5]]}}}],["readm",{"_index":2328,"t":{"394":{"position":[[758,6],[857,6]]}}}],["real",{"_index":804,"t":{"76":{"position":[[705,4],[924,4]]},"134":{"position":[[778,4]]},"346":{"position":[[433,4]]},"426":{"position":[[586,4]]}}}],["realiz",{"_index":1820,"t":{"263":{"position":[[170,9]]}}}],["reason",{"_index":1513,"t":{"212":{"position":[[339,8]]},"251":{"position":[[5717,7]]},"329":{"position":[[711,6]]},"355":{"position":[[3873,6]]}}}],["reauthent",{"_index":1962,"t":{"329":{"position":[[3313,14]]},"376":{"position":[[370,14]]}}}],["recap",{"_index":1523,"t":{"214":{"position":[[13,5]]}}}],["receiv",{"_index":995,"t":{"98":{"position":[[2457,10],[3044,10]]},"214":{"position":[[558,8]]},"218":{"position":[[60,8],[298,8],[876,7]]},"220":{"position":[[477,8]]},"247":{"position":[[1829,8]]},"309":{"position":[[946,8]]},"331":{"position":[[562,8]]},"355":{"position":[[215,8],[1627,8],[1787,8]]},"372":{"position":[[449,8],[814,8],[1001,8]]},"384":{"position":[[73,8]]}}}],["recent",{"_index":1981,"t":{"337":{"position":[[446,8]]},"353":{"position":[[1110,8]]},"355":{"position":[[762,8],[4019,9]]},"444":{"position":[[31,6]]}}}],["recentlyplayedopt",{"_index":2123,"t":{"350":{"position":[[1795,21]]},"353":{"position":[[691,23]]}}}],["reciev",{"_index":1282,"t":{"176":{"position":[[2717,9]]}}}],["recogn",{"_index":2225,"t":{"372":{"position":[[942,10]]},"382":{"position":[[103,9]]}}}],["recommend",{"_index":951,"t":{"98":{"position":[[590,11]]},"130":{"position":[[353,11]]},"196":{"position":[[768,13]]},"208":{"position":[[826,11]]},"251":{"position":[[3136,13]]},"364":{"position":[[130,9]]},"394":{"position":[[1538,11]]},"453":{"position":[[393,11]]}}}],["record",{"_index":1340,"t":{"190":{"position":[[765,6]]},"251":{"position":[[1869,9],[5122,9],[5153,9]]},"256":{"position":[[59,9],[200,9],[1560,9],[1670,9],[1817,9]]}}}],["recov",{"_index":1955,"t":{"329":{"position":[[2938,7]]}}}],["redi",{"_index":340,"t":{"14":{"position":[[3055,6]]}}}],["redirect",{"_index":256,"t":{"12":{"position":[[49,8],[430,8],[486,8],[607,8],[841,8]]},"176":{"position":[[791,8],[843,8],[871,8],[1272,8],[1485,8],[1655,8],[2115,8],[2809,8],[2961,8],[3052,8],[3979,8],[4158,8]]},"208":{"position":[[2307,8],[2941,8],[3033,8],[3210,8],[3362,8],[3442,8],[3750,8],[4132,8]]},"210":{"position":[[267,8]]},"394":{"position":[[926,8],[2498,9]]},"416":{"position":[[617,8],[737,8]]}}}],["redirecturi",{"_index":122,"t":{"4":{"position":[[2710,14],[4604,14]]},"8":{"position":[[641,14],[1115,14]]},"12":{"position":[[547,11]]},"41":{"position":[[619,14],[969,14]]},"67":{"position":[[3627,14]]},"69":{"position":[[1993,14]]},"128":{"position":[[459,14],[809,14]]},"178":{"position":[[413,14],[765,14]]},"208":{"position":[[3963,14]]},"416":{"position":[[3890,14]]},"418":{"position":[[1837,14]]},"422":{"position":[[1054,14]]}}}],["redis://192.168.0.120:6379",{"_index":355,"t":{"14":{"position":[[3738,26],[3848,28]]}}}],["redis://host_ip:host_port",{"_index":352,"t":{"14":{"position":[[3532,25]]}}}],["redis://valkey:6379",{"_index":349,"t":{"14":{"position":[[3356,19]]}}}],["reduc",{"_index":291,"t":{"14":{"position":[[82,6]]},"86":{"position":[[113,6]]},"204":{"position":[[179,6]]}}}],["refer",{"_index":189,"t":{"6":{"position":[[98,9],[156,9]]},"22":{"position":[[649,5],[1004,5],[1404,5]]},"247":{"position":[[1075,5]]},"249":{"position":[[109,5]]},"309":{"position":[[330,5]]},"325":{"position":[[28,9],[128,8]]},"331":{"position":[[702,5]]},"355":{"position":[[1509,10]]},"386":{"position":[[271,5],[392,5]]},"416":{"position":[[631,5],[2945,5]]}}}],["refin",{"_index":1728,"t":{"249":{"position":[[301,8]]}}}],["refresh",{"_index":692,"t":{"65":{"position":[[429,7]]},"208":{"position":[[5432,11]]},"376":{"position":[[456,7]]}}}],["refreshtoken",{"_index":725,"t":{"67":{"position":[[1532,15]]},"69":{"position":[[464,15]]}}}],["regardless",{"_index":997,"t":{"98":{"position":[[2551,10],[2954,10]]},"148":{"position":[[220,10]]},"234":{"position":[[274,10]]},"251":{"position":[[5171,10]]},"355":{"position":[[744,10]]},"418":{"position":[[314,10]]},"420":{"position":[[47,10]]},"430":{"position":[[1440,10],[1632,10]]}}}],["regex",{"_index":1845,"t":{"287":{"position":[[129,5],[196,5]]},"297":{"position":[[281,5]]}}}],["regist",{"_index":527,"t":{"39":{"position":[[209,8]]},"416":{"position":[[3304,8]]},"424":{"position":[[895,8]]}}}],["registr",{"_index":1093,"t":{"126":{"position":[[312,12]]}}}],["regular",{"_index":641,"t":{"56":{"position":[[92,7]]},"63":{"position":[[184,7]]},"102":{"position":[[1182,7]]},"192":{"position":[[1182,7]]},"228":{"position":[[186,7],[898,7]]},"282":{"position":[[179,7],[402,7]]},"303":{"position":[[401,7]]},"350":{"position":[[2488,7]]}}}],["relat",{"_index":1965,"t":{"331":{"position":[[308,7]]},"414":{"position":[[40,7]]}}}],["relay",{"_index":1211,"t":{"160":{"position":[[1467,5]]}}}],["releas",{"_index":1702,"t":{"247":{"position":[[625,8]]},"251":{"position":[[5141,8],[5517,9],[5581,9],[5638,8],[5741,7]]},"256":{"position":[[49,7],[371,8],[536,7],[556,7],[625,7],[722,7],[785,7],[822,7],[889,7],[938,7],[1000,8],[1096,7],[1108,7],[1395,7],[1538,9],[1598,9],[1723,8],[1787,8],[1839,8],[2043,8]]},"258":{"position":[[5,7],[76,8],[234,8],[251,7],[345,8],[841,8]]},"261":{"position":[[395,7],[581,7]]},"263":{"position":[[61,8],[208,7]]},"453":{"position":[[172,8],[372,7],[542,7]]}}}],["release/album/ep",{"_index":1785,"t":{"256":{"position":[[666,16]]}}}],["releaseallowempti",{"_index":1695,"t":{"243":{"position":[[353,20]]},"256":{"position":[[1881,17],[1953,20]]}}}],["releasecountri",{"_index":1791,"t":{"256":{"position":[[954,16]]}}}],["releasecountryprior",{"_index":1816,"t":{"261":{"position":[[589,25]]},"272":{"position":[[371,25]]},"276":{"position":[[468,25]]}}}],["releasegroup",{"_index":1635,"t":{"230":{"position":[[1167,13]]}}}],["releasegroupprimarytyp",{"_index":1787,"t":{"256":{"position":[[749,25]]}}}],["releasegroupprimarytypeprior",{"_index":1812,"t":{"258":{"position":[[965,34]]},"261":{"position":[[499,34]]},"272":{"position":[[309,34]]},"276":{"position":[[406,34]]}}}],["releasegroupsecondarytyp",{"_index":1788,"t":{"256":{"position":[[851,27]]}}}],["releasegroupsecondarytypedeni",{"_index":1802,"t":{"256":{"position":[[1483,32]]}}}],["releasestatu",{"_index":1784,"t":{"256":{"position":[[640,15]]}}}],["releasestatusallow",{"_index":1801,"t":{"256":{"position":[[1421,21]]}}}],["releasestatusprior",{"_index":1693,"t":{"243":{"position":[[280,24]]},"258":{"position":[[871,24]]},"261":{"position":[[422,24]]},"272":{"position":[[270,24]]},"276":{"position":[[367,24]]}}}],["reli",{"_index":949,"t":{"98":{"position":[[405,6],[672,7]]},"376":{"position":[[599,6]]},"384":{"position":[[28,6]]}}}],["reload",{"_index":1385,"t":{"196":{"position":[[244,6]]},"408":{"position":[[41,6]]}}}],["remain",{"_index":1805,"t":{"258":{"position":[[200,9]]}}}],["remast",{"_index":1599,"t":{"228":{"position":[[854,18]]}}}],["rememb",{"_index":1481,"t":{"208":{"position":[[3700,8]]},"340":{"position":[[542,8]]}}}],["remix",{"_index":1790,"t":{"256":{"position":[[924,6]]}}}],["remot",{"_index":1064,"t":{"112":{"position":[[173,6]]},"160":{"position":[[608,6],[647,6],[1275,6]]},"372":{"position":[[477,6]]}}}],["remov",{"_index":886,"t":{"90":{"position":[[133,6]]},"251":{"position":[[3734,7]]},"256":{"position":[[1988,6]]},"258":{"position":[[305,8]]},"278":{"position":[[234,8],[275,8]]},"280":{"position":[[799,7]]},"282":{"position":[[83,7],[215,7]]},"284":{"position":[[223,7],[268,7],[500,8]]},"287":{"position":[[202,6]]},"289":{"position":[[0,7]]},"390":{"position":[[1086,8]]},"412":{"position":[[564,6]]}}}],["removetrailingslash",{"_index":2079,"t":{"348":{"position":[[514,21]]}}}],["renam",{"_index":96,"t":{"4":{"position":[[2057,8]]},"366":{"position":[[399,6],[585,6]]}}}],["render",{"_index":591,"t":{"51":{"position":[[502,6],[1050,6]]},"58":{"position":[[584,6],[1128,6]]},"319":{"position":[[348,6]]}}}],["repeat",{"_index":934,"t":{"96":{"position":[[484,8],[608,8]]},"212":{"position":[[400,9],[742,9]]}}}],["replac",{"_index":209,"t":{"8":{"position":[[405,8]]},"39":{"position":[[387,7]]},"176":{"position":[[3153,7]]},"212":{"position":[[109,9]]},"220":{"position":[[201,7]]},"224":{"position":[[1174,9]]},"278":{"position":[[31,7]]},"280":{"position":[[49,7]]},"282":{"position":[[13,7],[434,7],[524,10],[549,7],[747,10],[776,7],[895,7],[930,9]]},"284":{"position":[[41,7],[301,8],[349,10]]},"287":{"position":[[61,7],[142,7],[285,10]]},"293":{"position":[[49,10]]},"295":{"position":[[52,10]]},"297":{"position":[[93,7],[106,7],[294,7],[726,10]]},"303":{"position":[[287,8]]},"366":{"position":[[653,7]]},"400":{"position":[[516,11]]},"412":{"position":[[618,7]]},"416":{"position":[[3645,9]]},"424":{"position":[[1829,7]]}}}],["repo",{"_index":2320,"t":{"394":{"position":[[285,5]]}}}],["repo=/home/youruser/multi",{"_index":2205,"t":{"366":{"position":[[799,25]]}}}],["report",{"_index":362,"t":{"16":{"position":[[217,10]]},"33":{"position":[[20,6],[272,10],[494,8],[618,9],[779,9],[1231,6],[1295,9]]},"78":{"position":[[13,6]]},"86":{"position":[[49,6]]},"96":{"position":[[65,6]]},"98":{"position":[[1597,6],[1681,8],[1758,6],[1855,6],[1950,8],[2622,7],[2979,8]]},"102":{"position":[[791,6]]},"176":{"position":[[286,6],[439,7]]},"180":{"position":[[184,8]]},"192":{"position":[[1270,8],[1940,10],[1987,9],[2129,10],[2229,9]]},"204":{"position":[[127,6]]},"208":{"position":[[472,6],[1447,8]]},"301":{"position":[[140,6],[180,7]]},"350":{"position":[[423,8]]},"386":{"position":[[63,9],[147,8]]},"388":{"position":[[7,9]]},"390":{"position":[[1201,9],[1412,7]]}}}],["repositori",{"_index":585,"t":{"51":{"position":[[328,10],[488,10],[736,10],[1036,10]]},"58":{"position":[[209,10],[410,10],[570,10],[818,10],[1114,10]]},"172":{"position":[[93,10]]},"184":{"position":[[181,10]]},"186":{"position":[[93,10]]},"321":{"position":[[190,10]]},"323":{"position":[[5,10],[307,10]]},"394":{"position":[[123,10],[179,10]]},"400":{"position":[[11,10]]},"457":{"position":[[13,10]]}}}],["repres",{"_index":1769,"t":{"254":{"position":[[60,12]]},"256":{"position":[[1072,9]]},"346":{"position":[[556,9]]}}}],["request",{"_index":322,"t":{"14":{"position":[[1137,8]]},"35":{"position":[[1512,8]]},"67":{"position":[[235,7],[610,7]]},"76":{"position":[[211,8]]},"92":{"position":[[132,8]]},"176":{"position":[[2706,7],[3609,8]]},"329":{"position":[[374,8],[1821,7],[2496,7],[3172,7]]},"337":{"position":[[907,8]]},"348":{"position":[[1516,7],[2154,7],[2381,7]]},"350":{"position":[[1543,7],[1951,7]]},"353":{"position":[[339,7],[767,7]]},"372":{"position":[[458,7],[1015,7],[2522,9]]},"376":{"position":[[110,7]]},"424":{"position":[[2220,8]]}}}],["request.get(`${this.baseurl}/health",{"_index":2101,"t":{"348":{"position":[[1784,38]]}}}],["requir",{"_index":31,"t":{"4":{"position":[[426,7]]},"14":{"position":[[873,9],[1630,9],[2254,9],[2750,9],[3597,9]]},"24":{"position":[[566,7]]},"35":{"position":[[788,9]]},"37":{"position":[[52,9]]},"41":{"position":[[52,9]]},"45":{"position":[[52,9]]},"49":{"position":[[52,9]]},"56":{"position":[[471,9]]},"63":{"position":[[609,9]]},"76":{"position":[[429,7]]},"84":{"position":[[272,7]]},"86":{"position":[[459,8]]},"88":{"position":[[36,9]]},"94":{"position":[[36,9]]},"98":{"position":[[1470,9],[1544,9]]},"100":{"position":[[131,9]]},"104":{"position":[[36,9]]},"110":{"position":[[52,8]]},"116":{"position":[[52,8]]},"124":{"position":[[52,9],[171,8]]},"130":{"position":[[1234,9]]},"134":{"position":[[737,7]]},"136":{"position":[[26,7]]},"138":{"position":[[52,9],[169,8]]},"158":{"position":[[52,9]]},"160":{"position":[[396,8],[598,9],[768,11]]},"162":{"position":[[52,9]]},"166":{"position":[[52,9]]},"168":{"position":[[1598,9]]},"178":{"position":[[52,9]]},"182":{"position":[[52,9]]},"194":{"position":[[52,9]]},"196":{"position":[[399,9]]},"198":{"position":[[117,8]]},"202":{"position":[[52,9]]},"206":{"position":[[52,9]]},"210":{"position":[[52,9]]},"222":{"position":[[348,8]]},"241":{"position":[[36,8]]},"251":{"position":[[181,8],[322,8],[489,8],[771,8]]},"316":{"position":[[194,8]]},"321":{"position":[[12,8]]},"327":{"position":[[250,8],[449,8]]},"329":{"position":[[516,8],[1278,8],[1977,8],[2293,8],[2374,8],[2446,8],[2708,8]]},"331":{"position":[[99,8]]},"337":{"position":[[340,7]]},"340":{"position":[[355,8],[2065,8],[2092,8]]},"342":{"position":[[782,8],[848,7]]},"344":{"position":[[1048,10]]},"348":{"position":[[34,8]]},"359":{"position":[[64,8]]},"394":{"position":[[707,8],[806,8]]},"453":{"position":[[76,7]]}}}],["requiresauth",{"_index":1951,"t":{"329":{"position":[[2125,12]]}}}],["requiresauthinteract",{"_index":1953,"t":{"329":{"position":[[2216,23]]}}}],["reset",{"_index":2269,"t":{"390":{"position":[[568,6]]}}}],["resolut",{"_index":965,"t":{"98":{"position":[[1094,10]]}}}],["resolv",{"_index":1954,"t":{"329":{"position":[[2737,7]]},"376":{"position":[[1267,7]]},"384":{"position":[[620,7]]},"394":{"position":[[1366,7]]}}}],["resp",{"_index":2100,"t":{"348":{"position":[[1771,4],[2368,4]]},"350":{"position":[[1938,4],[2244,5]]},"353":{"position":[[754,4],[987,5]]}}}],["resp.body.vers",{"_index":2103,"t":{"348":{"position":[[2000,22]]}}}],["respect",{"_index":1304,"t":{"176":{"position":[[4178,10]]},"327":{"position":[[82,12]]}}}],["respons",{"_index":435,"t":{"24":{"position":[[459,8]]},"76":{"position":[[251,8]]},"348":{"position":[[1894,8]]}}}],["restart",{"_index":290,"t":{"14":{"position":[[72,9],[397,8],[1173,9],[2098,8]]},"31":{"position":[[312,7]]},"67":{"position":[[110,8]]},"192":{"position":[[480,7]]},"208":{"position":[[4233,7],[4675,10]]},"247":{"position":[[1947,8]]},"309":{"position":[[1064,8]]},"329":{"position":[[180,10],[1611,7]]},"376":{"position":[[1241,7]]},"394":{"position":[[1514,8]]},"396":{"position":[[1444,8]]},"414":{"position":[[508,8]]},"416":{"position":[[2299,7],[2879,7]]},"457":{"position":[[124,7]]}}}],["restart=no",{"_index":2394,"t":{"406":{"position":[[395,10]]}}}],["restrict",{"_index":432,"t":{"24":{"position":[[364,8]]},"160":{"position":[[1399,10]]},"180":{"position":[[678,8]]},"208":{"position":[[4826,11]]},"234":{"position":[[890,10]]},"236":{"position":[[287,10]]},"416":{"position":[[2789,8]]}}}],["result",{"_index":222,"t":{"8":{"position":[[904,9]]},"224":{"position":[[51,9],[1130,6]]},"226":{"position":[[451,6]]},"228":{"position":[[1492,6]]},"234":{"position":[[1494,7]]},"238":{"position":[[398,7]]},"249":{"position":[[188,6],[318,7]]},"251":{"position":[[2109,7],[2759,7],[3809,9],[4548,9],[4842,8],[5221,7]]},"261":{"position":[[117,7]]},"267":{"position":[[88,9]]},"329":{"position":[[624,6]]}}}],["retri",{"_index":391,"t":{"22":{"position":[[116,5]]},"31":{"position":[[112,7],[207,8],[253,7]]},"67":{"position":[[243,7],[389,5],[412,6],[470,10],[618,7],[764,5],[787,6],[845,10],[1137,7]]},"251":{"position":[[1208,7],[2073,7],[2182,8],[2469,5]]},"430":{"position":[[1041,6]]}}}],["retriev",{"_index":894,"t":{"92":{"position":[[170,8],[257,8]]},"94":{"position":[[102,9]]},"376":{"position":[[1182,8]]}}}],["retrymultipli",{"_index":157,"t":{"4":{"position":[[4296,18],[4366,18]]},"67":{"position":[[344,18],[719,18]]}}}],["return",{"_index":420,"t":{"24":{"position":[[116,7],[320,6],[468,7],[602,6]]},"76":{"position":[[241,7]]},"251":{"position":[[1662,7],[2098,6],[2264,6],[2748,7],[4835,6]]},"254":{"position":[[11,8]]},"267":{"position":[[22,9]]},"329":{"position":[[459,6],[484,6],[525,6],[560,6],[2586,7],[2903,6],[3274,7]]},"337":{"position":[[260,7],[523,7]]},"346":{"position":[[73,8],[109,6],[755,6]]},"348":{"position":[[717,6],[1381,6],[1823,6],[1850,8],[1907,6],[1971,6],[2473,6],[2518,8]]},"350":{"position":[[521,8],[734,7],[1098,8],[2449,6],[2750,6],[2833,6],[2964,6]]},"353":{"position":[[908,8],[993,6]]},"355":{"position":[[429,8],[702,6],[2182,8],[2943,8]]},"384":{"position":[[322,6]]}}}],["revers",{"_index":798,"t":{"76":{"position":[[522,7]]},"86":{"position":[[562,7]]},"134":{"position":[[886,7]]},"176":{"position":[[1564,7]]},"196":{"position":[[695,7]]},"204":{"position":[[466,7]]}}}],["review",{"_index":1972,"t":{"335":{"position":[[229,6]]},"428":{"position":[[91,6]]}}}],["rich",{"_index":617,"t":{"51":{"position":[[1480,4]]},"430":{"position":[[2034,4]]}}}],["right",{"_index":490,"t":{"35":{"position":[[342,5]]},"47":{"position":[[367,5]]},"92":{"position":[[774,5]]},"234":{"position":[[1383,6]]},"238":{"position":[[287,6]]},"251":{"position":[[5670,5]]},"355":{"position":[[71,5]]},"424":{"position":[[551,5],[1513,5]]}}}],["risk",{"_index":888,"t":{"90":{"position":[[219,5]]},"176":{"position":[[3767,4],[3838,4]]}}}],["rm",{"_index":1283,"t":{"176":{"position":[[2740,2]]},"455":{"position":[[125,2]]}}}],["robin",{"_index":1688,"t":{"241":{"position":[[541,5]]}}}],["rock",{"_index":1749,"t":{"251":{"position":[[1822,4],[2005,4],[3592,4],[3654,4],[3925,4],[4458,4]]},"301":{"position":[[820,4],[939,4]]}}}],["rockski",{"_index":448,"t":{"28":{"position":[[59,7]]},"51":{"position":[[52,7],[69,7],[86,7],[948,8],[1270,7]]},"53":{"position":[[39,8],[75,7],[198,7]]},"56":{"position":[[636,7],[1122,9]]},"73":{"position":[[694,7]]},"170":{"position":[[26,8],[44,7],[61,7],[171,7],[285,7],[315,7]]},"172":{"position":[[37,7]]},"174":{"position":[[8,7],[265,7],[314,7],[418,7],[897,9]]},"265":{"position":[[340,8]]},"274":{"position":[[191,8]]},"430":{"position":[[353,7],[550,7]]}}}],["rocksky'",{"_index":597,"t":{"51":{"position":[[787,9],[845,9],[1345,9]]}}}],["rocksky.app",{"_index":632,"t":{"53":{"position":[[120,11]]}}}],["rocksky_handl",{"_index":649,"t":{"56":{"position":[[501,14]]}}}],["rocksky_key",{"_index":651,"t":{"56":{"position":[[598,11]]}}}],["rollup",{"_index":2361,"t":{"400":{"position":[[265,6],[431,6],[532,7],[621,9]]}}}],["rollup/wasm",{"_index":2365,"t":{"400":{"position":[[485,12]]}}}],["romanian",{"_index":2288,"t":{"390":{"position":[[1889,8]]}}}],["root",{"_index":2195,"t":{"366":{"position":[[279,5]]}}}],["round",{"_index":1687,"t":{"241":{"position":[[535,5]]}}}],["rout",{"_index":2234,"t":{"372":{"position":[[1104,6]]}}}],["router",{"_index":2240,"t":{"372":{"position":[[2328,6]]}}}],["row",{"_index":913,"t":{"92":{"position":[[709,3]]},"390":{"position":[[2961,4]]}}}],["rule",{"_index":1578,"t":{"224":{"position":[[1054,5],[1102,5]]},"226":{"position":[[240,6]]},"228":{"position":[[26,5],[147,5],[1387,4]]},"245":{"position":[[5,4]]},"247":{"position":[[992,5]]},"258":{"position":[[1025,4]]},"265":{"position":[[4,5]]},"274":{"position":[[235,5]]},"280":{"position":[[87,6],[124,5]]},"284":{"position":[[5,4]]},"287":{"position":[[165,4]]},"305":{"position":[[5,4],[390,4]]},"309":{"position":[[247,5]]}}}],["run",{"_index":28,"t":{"4":{"position":[[391,4],[443,4],[679,3],[1050,10],[1123,3]]},"12":{"position":[[375,7]]},"43":{"position":[[252,3]]},"98":{"position":[[882,7],[1051,7],[1214,7],[1304,3],[3349,7]]},"140":{"position":[[351,3]]},"160":{"position":[[102,3],[498,7],[715,7],[825,3]]},"176":{"position":[[1349,3],[1531,7],[1919,3],[2328,4],[2660,4],[2734,3],[3384,3]]},"226":{"position":[[147,7],[695,3],[734,4],[1016,3],[1060,3],[1299,3],[1319,3]]},"228":{"position":[[103,4],[1241,3],[1424,3]]},"251":{"position":[[2778,3],[3444,7],[4863,4]]},"276":{"position":[[133,3],[727,3],[747,3]]},"287":{"position":[[125,3],[176,3]]},"321":{"position":[[83,7],[383,7],[428,3]]},"323":{"position":[[253,7],[407,3]]},"337":{"position":[[290,7]]},"348":{"position":[[67,8]]},"364":{"position":[[199,3]]},"368":{"position":[[73,3],[106,3]]},"372":{"position":[[1689,7],[2216,7]]},"374":{"position":[[316,7]]},"384":{"position":[[476,3],[533,4]]},"394":{"position":[[719,7],[818,7],[986,7],[1837,3],[2274,3],[2302,3],[2808,3],[3132,7],[3442,3]]},"396":{"position":[[369,3],[700,3]]},"398":{"position":[[66,3]]},"400":{"position":[[217,3],[241,3],[255,3],[1255,3]]},"404":{"position":[[177,4]]},"406":{"position":[[385,3]]},"408":{"position":[[19,4],[241,3]]},"412":{"position":[[31,7]]},"426":{"position":[[15,7],[287,8]]},"455":{"position":[[151,3],[243,3]]}}}],["run/debug",{"_index":1908,"t":{"323":{"position":[[88,9]]}}}],["run/start",{"_index":1932,"t":{"329":{"position":[[759,9]]}}}],["run/user/uid/bus:/run/user/uid/bus:ro",{"_index":1205,"t":{"160":{"position":[[1236,38]]}}}],["runtim",{"_index":2458,"t":{"444":{"position":[[53,7]]}}}],["rv:139.0",{"_index":2221,"t":{"372":{"position":[[563,9],[774,9]]}}}],["rvowkj1xtivmxglr",{"_index":407,"t":{"22":{"position":[[1274,19]]}}}],["rxbcaiyysxm",{"_index":2291,"t":{"390":{"position":[[1954,13]]}}}],["s",{"_index":1847,"t":{"287":{"position":[[243,7],[346,8]]},"291":{"position":[[49,16],[96,16]]}}}],["s)et",{"_index":1224,"t":{"164":{"position":[[179,10]]}}}],["s*(?<artist",{"_index":1373,"t":{"192":{"position":[[1774,21]]}}}],["safeti",{"_index":1485,"t":{"208":{"position":[[4410,7]]}}}],["salt",{"_index":1940,"t":{"329":{"position":[[1312,4]]}}}],["same",{"_index":471,"t":{"33":{"position":[[510,4]]},"96":{"position":[[76,4]]},"102":{"position":[[1237,4],[1473,4]]},"108":{"position":[[533,4]]},"114":{"position":[[525,4]]},"126":{"position":[[307,4]]},"136":{"position":[[157,4]]},"160":{"position":[[562,4],[864,4]]},"164":{"position":[[280,4]]},"176":{"position":[[1982,4],[2363,4],[2572,4]]},"192":{"position":[[921,4]]},"208":{"position":[[1308,4],[2346,4],[3283,4],[3499,5]]},"218":{"position":[[735,4]]},"222":{"position":[[1008,4]]},"224":{"position":[[1071,4]]},"226":{"position":[[645,4]]},"247":{"position":[[503,4]]},"372":{"position":[[1730,4],[1783,4],[1975,4]]},"374":{"position":[[125,4],[331,4]]},"382":{"position":[[176,4]]},"384":{"position":[[192,4]]},"394":{"position":[[1001,4],[1270,4]]},"412":{"position":[[235,4],[489,4]]},"426":{"position":[[139,4]]},"455":{"position":[[206,4]]}}}],["sampl",{"_index":2356,"t":{"396":{"position":[[871,6]]}}}],["satisfi",{"_index":1573,"t":{"224":{"position":[[352,9]]},"245":{"position":[[322,9]]},"305":{"position":[[303,9]]}}}],["save",{"_index":669,"t":{"60":{"position":[[197,4]]},"176":{"position":[[4038,4]]},"192":{"position":[[437,4]]},"208":{"position":[[2076,5],[2479,4],[4695,5]]},"408":{"position":[[0,4]]},"412":{"position":[[222,5]]}}}],["scagg",{"_index":1852,"t":{"293":{"position":[[65,7]]}}}],["scan",{"_index":2397,"t":{"408":{"position":[[153,4]]}}}],["scenario",{"_index":219,"t":{"8":{"position":[[745,8]]},"65":{"position":[[0,9]]},"160":{"position":[[892,8]]},"176":{"position":[[2048,8]]},"212":{"position":[[725,8]]},"226":{"position":[[864,9]]},"278":{"position":[[223,10]]},"297":{"position":[[397,10]]},"316":{"position":[[7,8]]},"355":{"position":[[15,9]]},"396":{"position":[[84,9]]},"428":{"position":[[213,9]]}}}],["schema",{"_index":136,"t":{"4":{"position":[[3936,6]]},"22":{"position":[[669,6],[1024,6],[1424,6]]},"37":{"position":[[437,6],[747,6]]},"41":{"position":[[695,6],[1065,6]]},"45":{"position":[[479,6],[816,6]]},"49":{"position":[[350,6],[631,6]]},"56":{"position":[[866,6],[1153,6]]},"63":{"position":[[987,6],[1258,6]]},"88":{"position":[[575,6],[861,6]]},"94":{"position":[[371,6],[693,6]]},"100":{"position":[[814,6],[1081,6]]},"104":{"position":[[230,6],[448,6]]},"110":{"position":[[462,6],[717,6]]},"116":{"position":[[409,6],[684,6]]},"118":{"position":[[856,6],[1166,6]]},"124":{"position":[[418,6],[629,6]]},"128":{"position":[[535,6],[905,6]]},"130":{"position":[[2701,6],[3343,6]]},"138":{"position":[[497,6],[708,6]]},"142":{"position":[[517,6],[854,6]]},"146":{"position":[[444,6],[725,6]]},"154":{"position":[[232,6],[505,6]]},"158":{"position":[[322,6],[605,6]]},"162":{"position":[[506,6],[753,6]]},"166":{"position":[[349,6],[601,6]]},"168":{"position":[[2717,6],[3283,6]]},"174":{"position":[[641,6],[928,6]]},"178":{"position":[[498,6],[871,6]]},"182":{"position":[[405,6],[719,6]]},"190":{"position":[[1949,6],[2284,6]]},"194":{"position":[[274,6],[508,6]]},"202":{"position":[[497,6],[744,6]]},"206":{"position":[[254,6],[472,6]]},"210":{"position":[[643,6],[1021,6]]}}}],["schvitz",{"_index":2290,"t":{"390":{"position":[[1916,7]]}}}],["scope",{"_index":1137,"t":{"134":{"position":[[948,5]]}}}],["scopes/permissions/gr",{"_index":1486,"t":{"208":{"position":[[4442,25]]}}}],["score",{"_index":1641,"t":{"234":{"position":[[89,5]]},"251":{"position":[[5614,5]]},"254":{"position":[[54,5],[120,5],[160,5],[219,8],[247,5]]},"261":{"position":[[147,6]]},"263":{"position":[[260,6]]}}}],["scrape",{"_index":2247,"t":{"376":{"position":[[609,8]]},"390":{"position":[[170,7],[517,11]]}}}],["screen",{"_index":1455,"t":{"208":{"position":[[1907,6],[4347,6]]}}}],["screenshot",{"_index":1225,"t":{"164":{"position":[[314,10]]}}}],["script",{"_index":2178,"t":{"364":{"position":[[19,6]]}}}],["scrobbabl",{"_index":801,"t":{"76":{"position":[[622,11]]},"82":{"position":[[90,10],[472,10],[538,10]]}}}],["scrobbl",{"_index":34,"t":{"4":{"position":[[521,10],[584,8],[1515,8],[1610,8],[1638,8],[1694,8],[3198,8],[3293,8],[3321,8],[3377,8]]},"6":{"position":[[108,8],[166,8]]},"14":{"position":[[259,9],[317,9],[353,9],[1004,11],[1879,10],[1969,8],[2950,11]]},"22":{"position":[[154,8],[170,8]]},"26":{"position":[[99,12]]},"31":{"position":[[41,8],[81,8],[220,8],[286,9],[345,8]]},"33":{"position":[[81,8],[549,8],[747,8]]},"35":{"position":[[29,8],[1025,8]]},"39":{"position":[[30,8],[110,9]]},"43":{"position":[[30,8],[117,9]]},"51":{"position":[[29,8],[705,11],[924,8],[1125,9],[1249,10],[1308,8],[1379,9],[1531,8],[1604,8],[1677,8],[1713,8],[1790,9],[1836,8],[1862,8]]},"58":{"position":[[29,8],[154,9],[787,11],[1002,8],[1199,9],[1420,9],[1514,9]]},"65":{"position":[[22,8],[207,8],[273,8],[338,8],[519,8],[595,8],[783,9],[867,8],[935,8]]},"67":{"position":[[2104,9],[2252,8],[2488,8]]},"73":{"position":[[16,8],[47,8],[86,8]]},"76":{"position":[[314,10],[961,9],[1002,8],[1085,11],[1138,8],[1192,9],[1284,9]]},"80":{"position":[[37,8],[170,8],[387,8]]},"82":{"position":[[284,8]]},"84":{"position":[[196,8],[361,9],[453,8],[556,10],[739,8],[787,8]]},"86":{"position":[[0,10],[153,8],[197,9],[970,8],[1024,10],[1137,8],[1221,10],[1404,8],[1452,8],[1540,10],[1771,8],[1855,8]]},"88":{"position":[[192,8],[264,8]]},"96":{"position":[[635,10]]},"98":{"position":[[125,8],[706,11],[1573,10]]},"100":{"position":[[280,8],[391,8],[472,8],[575,8]]},"102":{"position":[[61,11],[495,10],[618,10],[679,8],[709,10],[743,9],[753,10],[861,8],[957,8]]},"118":{"position":[[39,8],[68,9],[133,8]]},"120":{"position":[[46,9],[127,8],[192,8]]},"122":{"position":[[84,9],[172,10]]},"124":{"position":[[282,9]]},"126":{"position":[[34,8],[58,9],[118,8],[175,9]]},"130":{"position":[[573,8],[708,8],[765,8],[1018,8],[1088,8],[1676,8],[1775,8],[1849,8],[1933,9],[2019,9],[2108,9]]},"132":{"position":[[46,9],[132,8],[207,8]]},"134":{"position":[[89,9],[203,11],[330,8]]},"138":{"position":[[276,10],[361,9]]},"140":{"position":[[46,8],[75,9],[140,8],[216,9]]},"144":{"position":[[14,8]]},"148":{"position":[[165,8]]},"150":{"position":[[38,10],[419,10]]},"152":{"position":[[264,8],[422,9],[534,8]]},"160":{"position":[[267,8]]},"162":{"position":[[230,8],[309,8]]},"168":{"position":[[156,8],[410,8],[676,9],[818,9],[948,9],[1028,9],[1323,9],[1406,8],[1813,8],[1904,8],[1974,8],[2054,9],[2136,9],[2221,9]]},"170":{"position":[[14,8],[179,9],[213,9],[293,9]]},"172":{"position":[[108,8]]},"176":{"position":[[366,8]]},"180":{"position":[[342,10],[479,8],[687,10]]},"184":{"position":[[14,8],[126,9],[258,9],[292,9],[372,9]]},"186":{"position":[[108,8]]},"190":{"position":[[81,9],[575,9],[795,9],[1004,9],[1213,9]]},"200":{"position":[[29,9],[46,9]]},"202":{"position":[[180,8],[269,8]]},"204":{"position":[[78,10],[219,8],[263,9]]},"208":{"position":[[216,8],[345,10]]},"212":{"position":[[55,8],[302,8],[708,9],[884,11]]},"214":{"position":[[38,8],[457,9],[482,8],[635,9],[746,9],[783,8],[817,8]]},"216":{"position":[[211,8]]},"218":{"position":[[221,8],[397,9],[445,10],[508,9],[935,8]]},"234":{"position":[[524,9]]},"245":{"position":[[444,8]]},"247":{"position":[[1847,8]]},"249":{"position":[[281,8]]},"251":{"position":[[36,8],[967,8],[1016,8],[1343,8],[1529,8],[1653,8],[2369,8],[2787,8],[3350,8],[4964,8]]},"267":{"position":[[107,8],[238,8]]},"274":{"position":[[24,8],[122,8],[161,8],[788,8]]},"301":{"position":[[710,8]]},"303":{"position":[[1135,8]]},"309":{"position":[[964,8]]},"331":{"position":[[112,11]]},"337":{"position":[[938,8]]},"350":{"position":[[355,10],[914,9],[1486,9],[2732,9],[2954,9]]},"353":{"position":[[27,8]]},"355":{"position":[[131,10],[169,8],[241,9],[330,8],[455,9],[1026,8],[1644,10],[1904,11],[2032,8],[2302,11],[2504,10],[2561,10],[3026,10],[3198,11],[3264,8],[3656,9],[3759,9],[3899,10],[3949,10],[3964,8],[4029,10]]},"382":{"position":[[243,9]]},"390":{"position":[[99,9],[361,9],[709,9],[895,9],[1215,8],[1250,8],[3103,9],[3164,9]]},"412":{"position":[[398,10]]},"416":{"position":[[1340,10],[1451,10],[1524,10],[1593,8],[2397,10],[2798,10],[3064,10],[3110,10],[3202,8]]},"418":{"position":[[155,9]]},"424":{"position":[[32,10],[64,8]]},"426":{"position":[[343,8]]},"428":{"position":[[376,8],[487,9]]},"430":{"position":[[20,8],[106,10],[489,10],[582,8],[794,8],[861,11],[1021,9],[1411,8],[1666,8],[1756,10],[1781,8],[1951,9],[2001,9],[2066,8],[2212,9],[2296,8]]},"432":{"position":[[202,10]]},"434":{"position":[[408,8],[448,9]]},"436":{"position":[[99,12]]}}}],["scrobblabl",{"_index":1528,"t":{"214":{"position":[[162,12]]}}}],["scrobble'",{"_index":1642,"t":{"234":{"position":[[252,10]]},"249":{"position":[[160,10]]}}}],["scrobble/play",{"_index":1545,"t":{"218":{"position":[[550,13]]}}}],["scrobblecli",{"_index":2165,"t":{"355":{"position":[[3309,15]]}}}],["scrobbler",{"_index":53,"t":{"4":{"position":[[809,10],[840,9]]},"8":{"position":[[44,9],[275,9],[925,9],[1377,9],[1820,10],[1925,10]]},"14":{"position":[[6,9],[415,10],[3095,9],[3150,9],[3217,10],[3466,9]]},"20":{"position":[[6,9]]},"22":{"position":[[699,9],[1052,9],[1455,9]]},"31":{"position":[[9,9]]},"33":{"position":[[6,9],[229,9]]},"35":{"position":[[597,9],[827,9],[1532,10],[1603,9]]},"39":{"position":[[158,9],[291,9]]},"43":{"position":[[165,9]]},"51":{"position":[[695,9]]},"56":{"position":[[27,9],[348,9]]},"58":{"position":[[777,9],[1652,9]]},"63":{"position":[[39,9],[486,9]]},"67":{"position":[[1361,9]]},"76":{"position":[[33,9],[395,10],[448,9],[895,9],[1234,9]]},"80":{"position":[[515,9]]},"84":{"position":[[145,9],[244,9]]},"86":{"position":[[187,9],[1509,9]]},"92":{"position":[[84,9]]},"98":{"position":[[88,9],[896,9],[1421,9]]},"102":{"position":[[293,9],[521,9],[821,9],[1568,9]]},"106":{"position":[[19,9]]},"108":{"position":[[260,9],[697,9]]},"112":{"position":[[19,9]]},"114":{"position":[[256,9],[689,9]]},"118":{"position":[[492,9]]},"120":{"position":[[26,9]]},"122":{"position":[[54,9]]},"126":{"position":[[223,9]]},"128":{"position":[[107,9]]},"130":{"position":[[67,9],[275,9],[553,9],[745,9],[998,9],[1075,9]]},"132":{"position":[[26,9]]},"134":{"position":[[54,9],[348,10],[867,9],[1001,10]]},"136":{"position":[[192,9]]},"140":{"position":[[264,9]]},"142":{"position":[[112,9]]},"146":{"position":[[106,9]]},"148":{"position":[[151,9],[613,9],[998,9]]},"150":{"position":[[168,9],[404,9]]},"152":{"position":[[152,9],[243,9],[511,9]]},"160":{"position":[[224,9],[411,9],[485,9],[702,9],[837,9]]},"168":{"position":[[127,9],[1386,9]]},"174":{"position":[[296,9]]},"176":{"position":[[491,10],[1022,9],[1332,10],[1545,9],[1700,9],[1803,9],[1929,10],[2138,9],[2310,9],[2526,9],[2832,9],[2936,9],[3211,9],[3477,9],[4002,9],[4246,10]]},"190":{"position":[[1556,9]]},"192":{"position":[[1084,9],[1209,9],[2044,9],[2146,9]]},"196":{"position":[[523,9]]},"204":{"position":[[253,9],[335,9]]},"208":{"position":[[4951,9]]},"212":{"position":[[6,9],[902,9]]},"214":{"position":[[56,10]]},"218":{"position":[[774,9]]},"234":{"position":[[121,9],[1544,9]]},"241":{"position":[[520,9],[664,9]]},"247":{"position":[[1373,10],[1404,9],[1436,9]]},"251":{"position":[[910,9],[1081,9],[2289,9],[2455,9],[2895,9]]},"258":{"position":[[1056,9]]},"267":{"position":[[46,9]]},"280":{"position":[[443,9]]},"305":{"position":[[421,9]]},"307":{"position":[[86,9]]},"309":{"position":[[622,10],[653,9],[685,9]]},"319":{"position":[[6,9]]},"321":{"position":[[322,9]]},"350":{"position":[[3084,10]]},"366":{"position":[[682,9],[825,9],[881,9],[926,9]]},"372":{"position":[[55,9],[154,10],[185,9],[218,9],[1222,9],[1277,9],[1476,9],[1751,10],[1864,9],[2047,10],[2203,9]]},"374":{"position":[[172,9],[299,9]]},"376":{"position":[[27,9],[933,9],[1222,9]]},"382":{"position":[[156,9]]},"384":{"position":[[283,10]]},"390":{"position":[[46,9],[295,9],[420,9],[558,9]]},"394":{"position":[[372,10],[403,9],[435,9],[1479,9],[1885,9],[1952,10],[2336,9],[2397,10],[2864,9],[2925,10]]},"396":{"position":[[386,9],[683,9],[717,9],[838,9],[953,10],[984,9],[1016,9]]},"398":{"position":[[53,9]]},"400":{"position":[[143,9]]},"406":{"position":[[36,9],[266,9]]},"408":{"position":[[196,9]]},"410":{"position":[[57,9]]},"412":{"position":[[50,9],[287,9],[388,9],[459,9]]},"414":{"position":[[30,9],[151,10],[182,9],[214,9]]},"416":{"position":[[45,9],[1095,10],[1221,9],[1611,9],[1738,9],[1965,9],[2893,9],[3222,9],[3983,10],[4118,9]]},"418":{"position":[[6,9]]},"424":{"position":[[49,9],[782,9],[1162,9],[1764,9],[2068,9],[2240,10],[2311,9]]},"426":{"position":[[34,9],[270,9]]},"428":{"position":[[156,9]]},"430":{"position":[[1304,10],[1353,9],[2118,9]]},"453":{"position":[[17,9],[463,9]]},"455":{"position":[[98,9],[134,9],[168,9],[253,10]]},"457":{"position":[[138,10]]}}}],["scrobbler'",{"_index":253,"t":{"10":{"position":[[27,11]]},"160":{"position":[[1708,11]]},"176":{"position":[[2240,11]]},"212":{"position":[[189,11]]},"303":{"position":[[162,11]]},"426":{"position":[[612,11]]}}}],["scrobbler.app",{"_index":1267,"t":{"176":{"position":[[1390,13]]}}}],["scrobbler.app/callback",{"_index":1302,"t":{"176":{"position":[[3945,22]]}}}],["scrobbler.git",{"_index":1904,"t":{"321":{"position":[[297,13]]},"400":{"position":[[118,13]]}}}],["scrobbler.mydomain.com/callback",{"_index":2406,"t":{"416":{"position":[[1035,31]]}}}],["scrobbler.servic",{"_index":2386,"t":{"406":{"position":[[137,17],[222,18]]},"408":{"position":[[78,17],[125,17]]}}}],["scrobbler/directori",{"_index":2392,"t":{"406":{"position":[[351,19]]}}}],["scrobbler:0.9.7",{"_index":2468,"t":{"453":{"position":[[575,15]]}}}],["scrobbler:latest",{"_index":2318,"t":{"394":{"position":[[162,16],[216,16]]},"455":{"position":[[53,16]]}}}],["scrobblesourc",{"_index":2037,"t":{"344":{"position":[[396,15]]}}}],["scrobblesources.t",{"_index":2033,"t":{"344":{"position":[[198,18]]}}}],["scrobblethreshold",{"_index":149,"t":{"4":{"position":[[4194,21]]},"82":{"position":[[429,21]]}}}],["search",{"_index":249,"t":{"8":{"position":[[1844,6]]},"220":{"position":[[190,6]]},"247":{"position":[[715,6],[775,6],[824,8],[1571,9]]},"249":{"position":[[239,9]]},"251":{"position":[[19,6],[273,6],[467,9],[580,6],[708,7],[825,6],[1096,6],[2081,9],[2191,7],[2209,8],[2318,8],[2479,6],[2644,6],[3064,7],[3845,7],[4232,7],[4584,7],[4818,8],[4906,7],[4924,6],[5036,6],[5356,6]]},"254":{"position":[[97,6]]},"276":{"position":[[61,6]]},"278":{"position":[[20,6]]},"280":{"position":[[38,6]]},"282":{"position":[[2,6],[453,9],[659,9]]},"284":{"position":[[30,6],[328,9]]},"287":{"position":[[54,6],[135,6],[233,9]]},"293":{"position":[[25,9]]},"295":{"position":[[23,9]]},"297":{"position":[[82,6],[681,9]]},"418":{"position":[[669,8]]},"420":{"position":[[402,8]]},"430":{"position":[[601,6]]}}}],["search(",{"_index":1751,"t":{"251":{"position":[[2053,11]]}}}],["searchwhenmiss",{"_index":1732,"t":{"251":{"position":[[338,17]]}}}],["searchwithmiss",{"_index":1734,"t":{"251":{"position":[[628,20]]}}}],["second",{"_index":710,"t":{"67":{"position":[[447,7],[822,7]]},"82":{"position":[[505,7]]},"346":{"position":[[843,7]]},"348":{"position":[[1416,6]]},"350":{"position":[[2141,7]]}}}],["secondari",{"_index":300,"t":{"14":{"position":[[226,9],[458,9],[774,9],[1215,9],[1531,9],[2155,9],[2463,9]]},"256":{"position":[[836,9]]}}}],["secondgotifyserv",{"_index":397,"t":{"22":{"position":[[530,21]]}}}],["secret",{"_index":216,"t":{"8":{"position":[[614,9],[1069,9],[1623,8]]},"41":{"position":[[156,6],[573,9],[923,9]]},"67":{"position":[[3603,9]]},"69":{"position":[[1969,9]]},"128":{"position":[[413,9],[763,9]]},"176":{"position":[[4146,7]]},"208":{"position":[[2509,7],[2929,7]]},"210":{"position":[[207,6]]},"374":{"position":[[24,7]]},"416":{"position":[[3474,6],[3855,9]]},"418":{"position":[[1802,9]]},"422":{"position":[[1019,9]]}}}],["section",{"_index":107,"t":{"4":{"position":[[2366,9]]},"6":{"position":[[270,7]]},"108":{"position":[[464,7]]},"114":{"position":[[469,7]]},"160":{"position":[[666,7]]},"176":{"position":[[4220,7]]},"192":{"position":[[270,7]]},"208":{"position":[[3187,7],[3764,7]]},"232":{"position":[[13,8]]},"243":{"position":[[57,7]]},"247":{"position":[[1127,8]]},"249":{"position":[[34,7],[137,8]]},"309":{"position":[[382,8]]},"353":{"position":[[957,7]]},"355":{"position":[[1885,7]]},"361":{"position":[[57,7]]},"386":{"position":[[305,7],[422,7]]},"416":{"position":[[252,7],[849,7],[1823,7],[2628,7],[3289,7]]},"418":{"position":[[468,7],[970,7],[1113,7],[1255,7],[1393,7],[1587,7],[1650,7]]},"420":{"position":[[201,7]]},"422":{"position":[[187,7],[330,7],[472,7],[610,7],[804,7],[867,7]]},"424":{"position":[[726,7],[1106,7],[2012,7]]}}}],["secur",{"_index":372,"t":{"18":{"position":[[65,8]]},"60":{"position":[[141,8]]},"160":{"position":[[808,6]]}}}],["see",{"_index":72,"t":{"4":{"position":[[1352,3],[3036,3]]},"6":{"position":[[0,3]]},"35":{"position":[[934,3]]},"76":{"position":[[1302,4]]},"84":{"position":[[101,3]]},"96":{"position":[[646,3]]},"98":{"position":[[1647,4]]},"118":{"position":[[185,3]]},"144":{"position":[[68,3]]},"150":{"position":[[201,3]]},"160":{"position":[[639,3]]},"174":{"position":[[0,3]]},"188":{"position":[[0,3]]},"208":{"position":[[356,3],[403,3]]},"218":{"position":[[137,3],[375,3]]},"224":{"position":[[792,3]]},"232":{"position":[[0,3]]},"261":{"position":[[108,3]]},"267":{"position":[[425,3]]},"329":{"position":[[3255,3]]},"350":{"position":[[2867,3]]},"355":{"position":[[1466,3],[1872,3],[2352,3]]},"372":{"position":[[1136,3],[2439,3]]},"376":{"position":[[7,3]]},"379":{"position":[[7,3]]},"388":{"position":[[80,3]]},"392":{"position":[[70,3]]},"394":{"position":[[749,3],[848,3]]},"396":{"position":[[4,3],[848,3]]},"398":{"position":[[19,3]]},"400":{"position":[[666,3]]},"402":{"position":[[115,3]]},"416":{"position":[[3248,3]]},"426":{"position":[[70,3],[410,3]]},"428":{"position":[[0,3],[223,3]]},"438":{"position":[[0,3]]},"440":{"position":[[0,3]]},"442":{"position":[[0,3]]}}}],["seem",{"_index":1448,"t":{"208":{"position":[[1393,4]]}}}],["seen",{"_index":1529,"t":{"214":{"position":[[279,5],[409,4],[660,5],[833,4]]},"218":{"position":[[503,4]]},"350":{"position":[[2900,4]]},"355":{"position":[[480,4],[738,5],[778,5],[2072,4],[2925,4]]},"390":{"position":[[1765,4]]}}}],["select",{"_index":912,"t":{"92":{"position":[[682,6]]},"192":{"position":[[203,6],[334,6]]},"208":{"position":[[4431,6],[4486,6],[4526,6]]},"247":{"position":[[68,9]]},"249":{"position":[[329,6]]},"256":{"position":[[210,8]]},"265":{"position":[[42,12]]},"418":{"position":[[682,7]]},"420":{"position":[[415,7]]}}}],["self",{"_index":1294,"t":{"176":{"position":[[3517,4]]},"220":{"position":[[57,4]]},"337":{"position":[[38,4]]},"430":{"position":[[2371,4]]}}}],["send",{"_index":610,"t":{"51":{"position":[[1321,4]]},"76":{"position":[[376,4]]},"212":{"position":[[289,7]]},"218":{"position":[[210,7]]},"337":{"position":[[901,5],[1052,4]]},"376":{"position":[[91,4]]},"432":{"position":[[193,5]]}}}],["sensibl",{"_index":1700,"t":{"247":{"position":[[559,8],[582,8],[1532,8]]},"249":{"position":[[75,8]]},"261":{"position":[[804,8]]},"272":{"position":[[26,8]]},"274":{"position":[[483,8]]},"276":{"position":[[34,8]]}}}],["sensit",{"_index":196,"t":{"8":{"position":[[155,9]]}}}],["sent",{"_index":1297,"t":{"176":{"position":[[3601,4],[3672,4]]},"265":{"position":[[173,4]]},"355":{"position":[[3006,4]]}}}],["separ",{"_index":1111,"t":{"130":{"position":[[1629,9],[1719,9],[1820,9],[1895,9],[1982,9],[2068,9]]},"168":{"position":[[1770,9],[1852,9],[1945,9],[2016,9],[2099,9],[2181,9]]},"180":{"position":[[220,9]]},"249":{"position":[[378,8]]},"251":{"position":[[1895,9]]},"390":{"position":[[1041,9]]},"430":{"position":[[1905,9]]}}}],["sept",{"_index":1446,"t":{"208":{"position":[[1360,4]]}}}],["serivc",{"_index":1313,"t":{"180":{"position":[[325,7]]}}}],["serv",{"_index":1894,"t":{"319":{"position":[[234,6]]},"394":{"position":[[1494,5]]},"396":{"position":[[124,7]]},"400":{"position":[[1291,6]]},"412":{"position":[[146,6]]}}}],["server",{"_index":86,"t":{"4":{"position":[[1669,7],[3352,7]]},"18":{"position":[[150,6]]},"22":{"position":[[53,7]]},"24":{"position":[[174,6]]},"35":{"position":[[106,6],[191,6]]},"37":{"position":[[205,6]]},"43":{"position":[[194,7],[278,6]]},"45":{"position":[[220,6]]},"47":{"position":[[15,6],[518,6]]},"51":{"position":[[363,8]]},"58":{"position":[[244,8],[445,8]]},"65":{"position":[[106,6],[193,6],[499,6],[570,6],[807,8],[847,6],[969,6]]},"86":{"position":[[232,6]]},"106":{"position":[[74,6]]},"110":{"position":[[150,6]]},"116":{"position":[[144,6]]},"118":{"position":[[153,7]]},"120":{"position":[[105,7]]},"122":{"position":[[156,6]]},"130":{"position":[[1305,6]]},"132":{"position":[[110,7]]},"134":{"position":[[187,6]]},"140":{"position":[[167,7],[293,7],[377,6]]},"144":{"position":[[35,7]]},"148":{"position":[[27,6],[382,7]]},"164":{"position":[[74,6],[108,6],[193,6],[301,6],[352,6]]},"166":{"position":[[138,6]]},"168":{"position":[[1661,6]]},"176":{"position":[[2679,6]]},"182":{"position":[[169,6]]},"184":{"position":[[216,8]]},"241":{"position":[[377,7],[491,6],[621,6],[712,7],[765,8],[938,6],[986,6]]},"319":{"position":[[146,6]]},"329":{"position":[[1846,6]]},"372":{"position":[[259,6],[892,6],[994,6],[1735,6]]},"424":{"position":[[199,6],[1277,6],[1362,6]]},"430":{"position":[[907,6]]}}}],["servers/mirror",{"_index":1686,"t":{"241":{"position":[[419,15]]}}}],["servic",{"_index":51,"t":{"4":{"position":[[793,9]]},"14":{"position":[[1854,8],[3201,9]]},"58":{"position":[[142,7]]},"76":{"position":[[227,7],[479,8],[1147,8]]},"112":{"position":[[141,8]]},"176":{"position":[[3797,7]]},"180":{"position":[[462,7]]},"184":{"position":[[114,7]]},"190":{"position":[[154,7],[251,7],[451,7],[542,8],[1248,9]]},"208":{"position":[[1435,8],[1869,9]]},"212":{"position":[[475,7]]},"214":{"position":[[792,7]]},"218":{"position":[[473,7]]},"234":{"position":[[866,8],[1113,8]]},"236":{"position":[[263,8]]},"238":{"position":[[17,8]]},"247":{"position":[[1357,9]]},"261":{"position":[[367,9]]},"309":{"position":[[606,9]]},"329":{"position":[[1489,7],[2429,7],[2516,7]]},"331":{"position":[[605,7]]},"335":{"position":[[174,7]]},"337":{"position":[[279,7],[1041,7]]},"350":{"position":[[446,8],[539,8],[1123,7],[1310,7]]},"353":{"position":[[83,7]]},"355":{"position":[[153,7],[499,7],[1076,7],[1272,7],[1355,8],[3325,7],[3716,7]]},"372":{"position":[[296,9],[2411,7]]},"374":{"position":[[103,8]]},"376":{"position":[[795,7]]},"394":{"position":[[356,9],[1936,9],[2381,9],[2909,9]]},"396":{"position":[[937,9]]},"404":{"position":[[22,7],[164,7]]},"406":{"position":[[13,7],[297,9]]},"408":{"position":[[166,8],[211,7],[230,7],[278,7]]},"410":{"position":[[77,7]]},"414":{"position":[[135,9]]},"424":{"position":[[12,8]]},"430":{"position":[[1390,7]]},"434":{"position":[[157,8]]}}}],["service'",{"_index":1947,"t":{"329":{"position":[[1836,9]]}}}],["service.md",{"_index":2358,"t":{"398":{"position":[[23,10]]}}}],["service/appl",{"_index":796,"t":{"76":{"position":[[147,20],[353,19]]}}}],["serviceallow",{"_index":1325,"t":{"190":{"position":[[0,12],[346,12],[967,15],[1406,15],[1871,15],[2186,15]]}}}],["servicedeni",{"_index":1326,"t":{"190":{"position":[[17,11],[378,11],[1176,14],[1899,14],[2214,14]]}}}],["services/mus",{"_index":2401,"t":{"416":{"position":[[16,14]]}}}],["session",{"_index":540,"t":{"41":{"position":[[340,7]]},"160":{"position":[[931,7]]},"208":{"position":[[882,7],[914,7],[1247,8]]},"376":{"position":[[855,7],[994,7],[1068,7]]}}}],["sessions/tokens/etc",{"_index":320,"t":{"14":{"position":[[1091,22]]}}}],["set",{"_index":129,"t":{"4":{"position":[[3523,7]]},"8":{"position":[[754,3]]},"12":{"position":[[171,3],[337,3]]},"14":{"position":[[717,7],[1474,7]]},"16":{"position":[[103,3],[408,3],[519,3]]},"22":{"position":[[729,7],[1082,7]]},"33":{"position":[[441,3],[876,3]]},"35":{"position":[[220,8],[675,3],[1559,3]]},"47":{"position":[[248,3]]},"60":{"position":[[117,8]]},"84":{"position":[[585,3],[717,3],[765,3]]},"86":{"position":[[328,8],[1250,3],[1382,3],[1430,3],[1524,3],[1588,8],[1937,3]]},"98":{"position":[[2072,7],[2673,3]]},"100":{"position":[[174,3]]},"102":{"position":[[914,3],[1443,3]]},"108":{"position":[[35,3],[395,8],[764,4]]},"110":{"position":[[219,3],[284,3]]},"112":{"position":[[129,8],[237,4]]},"114":{"position":[[33,3],[389,8],[754,4]]},"116":{"position":[[181,3],[215,3]]},"134":{"position":[[397,3]]},"148":{"position":[[390,3],[1065,4]]},"156":{"position":[[100,8]]},"164":{"position":[[115,3],[144,8]]},"166":{"position":[[121,3]]},"168":{"position":[[559,8]]},"176":{"position":[[815,3],[834,8],[1639,3],[2793,3]]},"192":{"position":[[153,8],[404,3],[685,7],[730,3]]},"198":{"position":[[372,3],[454,3]]},"202":{"position":[[95,3]]},"208":{"position":[[1648,7],[3307,3],[3392,7]]},"222":{"position":[[1068,4],[1851,3]]},"234":{"position":[[1623,3]]},"241":{"position":[[135,3]]},"251":{"position":[[2540,3],[2857,3],[3013,3],[3100,3]]},"254":{"position":[[116,3],[146,3]]},"256":{"position":[[1877,3]]},"321":{"position":[[352,4]]},"323":{"position":[[35,8]]},"327":{"position":[[371,8]]},"329":{"position":[[2044,3],[2156,3],[2258,3]]},"340":{"position":[[660,8]]},"353":{"position":[[221,3],[225,7]]},"355":{"position":[[641,7]]},"361":{"position":[[0,3]]},"364":{"position":[[518,8]]},"372":{"position":[[1489,7]]},"376":{"position":[[1197,3]]},"390":{"position":[[1615,3]]},"394":{"position":[[892,3],[968,3],[1119,3],[2657,3],[3007,3]]},"400":{"position":[[176,3]]},"410":{"position":[[40,7]]},"416":{"position":[[187,7],[605,3],[2022,3]]},"424":{"position":[[432,3],[1391,8],[2267,3]]},"426":{"position":[[97,7],[367,3]]},"428":{"position":[[307,3]]},"432":{"position":[[4,3]]}}}],["set('author",{"_index":2105,"t":{"348":{"position":[[2420,21]]},"350":{"position":[[1995,21]]},"353":{"position":[[806,21]]}}}],["setup",{"_index":37,"t":{"4":{"position":[[559,5],[1735,5],[3418,5],[3456,5]]},"14":{"position":[[2112,5]]},"35":{"position":[[92,5]]},"47":{"position":[[0,5],[64,5]]},"118":{"position":[[234,6],[297,5],[606,5]]},"122":{"position":[[214,5]]},"128":{"position":[[223,5]]},"134":{"position":[[363,5],[524,5],[855,5]]},"136":{"position":[[87,6]]},"142":{"position":[[233,5]]},"144":{"position":[[118,6],[181,5]]},"146":{"position":[[222,5]]},"160":{"position":[[369,6],[589,5],[615,5]]},"164":{"position":[[81,6],[200,5],[308,5]]},"172":{"position":[[11,5]]},"174":{"position":[[51,6],[114,5],[412,5]]},"186":{"position":[[11,5]]},"188":{"position":[[51,6],[115,5]]},"190":{"position":[[1672,5]]},"208":{"position":[[5337,5]]},"234":{"position":[[1585,6]]},"342":{"position":[[57,5]]},"394":{"position":[[772,5],[871,5],[2061,6]]},"404":{"position":[[139,5]]},"416":{"position":[[1574,5],[3038,6],[3275,5]]},"418":{"position":[[222,5],[1545,5]]},"422":{"position":[[762,5]]},"424":{"position":[[184,5],[248,5],[1263,5]]},"428":{"position":[[370,5]]},"430":{"position":[[1830,5],[2305,5]]}}}],["setup.sh",{"_index":2181,"t":{"364":{"position":[[251,10]]},"366":{"position":[[18,8]]},"368":{"position":[[51,9]]}}}],["sevenhtml",{"_index":1041,"t":{"102":{"position":[[1412,12]]}}}],["sever",{"_index":1450,"t":{"208":{"position":[[1498,7]]},"222":{"position":[[1060,7]]},"256":{"position":[[10,7]]}}}],["shape",{"_index":1919,"t":{"327":{"position":[[66,6]]},"329":{"position":[[928,5]]}}}],["share",{"_index":535,"t":{"41":{"position":[[149,6]]},"51":{"position":[[256,5]]},"58":{"position":[[338,5]]},"65":{"position":[[663,6]]},"106":{"position":[[196,5]]},"325":{"position":[[81,6],[423,5]]}}}],["shortcut",{"_index":360,"t":{"16":{"position":[[141,8]]}}}],["shorter",{"_index":1033,"t":{"102":{"position":[[920,7]]},"176":{"position":[[224,7]]}}}],["show",{"_index":314,"t":{"14":{"position":[[817,4],[1574,4],[2198,4]]},"160":{"position":[[146,5]]},"192":{"position":[[148,4]]},"230":{"position":[[491,5]]},"426":{"position":[[461,4],[600,5]]}}}],["shown",{"_index":670,"t":{"60":{"position":[[231,5]]},"88":{"position":[[144,5]]},"92":{"position":[[532,5]]},"102":{"position":[[1249,5]]},"118":{"position":[[450,5]]},"126":{"position":[[361,5]]},"128":{"position":[[63,5]]},"142":{"position":[[63,5]]},"146":{"position":[[63,5]]},"164":{"position":[[288,5]]},"174":{"position":[[252,5]]},"190":{"position":[[1512,5]]},"192":{"position":[[313,5]]},"247":{"position":[[26,5]]},"272":{"position":[[17,5]]},"307":{"position":[[140,5]]},"309":{"position":[[26,5]]}}}],["side",{"_index":2266,"t":{"390":{"position":[[453,4]]}}}],["side(",{"_index":1551,"t":{"218":{"position":[[1140,7]]}}}],["sidebar",{"_index":911,"t":{"92":{"position":[[670,7]]},"232":{"position":[[58,9]]}}}],["sign",{"_index":633,"t":{"53":{"position":[[136,4]]},"208":{"position":[[5098,4]]}}}],["signal",{"_index":2136,"t":{"350":{"position":[[2915,10]]}}}],["silo",{"_index":2454,"t":{"430":{"position":[[1858,4]]}}}],["similar",{"_index":1291,"t":{"176":{"position":[[3244,7]]},"390":{"position":[[1712,7]]}}}],["simpl",{"_index":36,"t":{"4":{"position":[[552,6]]},"58":{"position":[[1484,6]]},"176":{"position":[[2667,6]]},"192":{"position":[[167,6]]},"323":{"position":[[291,6]]}}}],["simpli",{"_index":1199,"t":{"160":{"position":[[909,6]]},"355":{"position":[[591,6]]}}}],["simplifi",{"_index":2157,"t":{"355":{"position":[[2550,10]]}}}],["singl",{"_index":1026,"t":{"102":{"position":[[224,6]]},"220":{"position":[[311,6]]},"256":{"position":[[310,8],[803,7]]},"258":{"position":[[935,8],[1010,9]]},"261":{"position":[[483,7],[544,9]]},"272":{"position":[[354,9]]},"276":{"position":[[451,9]]},"301":{"position":[[201,6]]},"344":{"position":[[933,9]]},"430":{"position":[[836,6]]}}}],["single_user_platform_id",{"_index":2121,"t":{"350":{"position":[[1608,23],[2345,24]]}}}],["site",{"_index":1298,"t":{"176":{"position":[[3626,4],[3857,4]]},"376":{"position":[[626,4]]},"379":{"position":[[378,4]]}}}],["skagg",{"_index":1851,"t":{"293":{"position":[[40,8]]}}}],["skip",{"_index":1587,"t":{"226":{"position":[[578,4]]},"228":{"position":[[466,7]]},"234":{"position":[[1592,4]]},"251":{"position":[[238,8]]},"287":{"position":[[155,4]]},"355":{"position":[[3789,4]]}}}],["slash",{"_index":1856,"t":{"297":{"position":[[264,5],[440,5],[540,5]]}}}],["slice.wisp.plac",{"_index":663,"t":{"58":{"position":[[1533,16]]}}}],["slick",{"_index":1974,"t":{"337":{"position":[[111,5]]}}}],["slight",{"_index":2256,"t":{"384":{"position":[[211,6]]}}}],["slightli",{"_index":1550,"t":{"218":{"position":[[1040,8]]}}}],["slower",{"_index":728,"t":{"67":{"position":[[1605,6]]}}}],["slug",{"_index":1081,"t":{"122":{"position":[[5,4],[189,4],[292,4]]},"124":{"position":[[380,7],[566,7]]},"134":{"position":[[5,4],[499,4],[607,4]]},"198":{"position":[[80,4],[244,7],[328,7],[616,4]]},"202":{"position":[[417,7],[638,7]]},"372":{"position":[[840,4]]}}}],["slug/token",{"_index":1086,"t":{"124":{"position":[[183,10]]},"138":{"position":[[181,10]]}}}],["smart",{"_index":2448,"t":{"430":{"position":[[1048,5]]}}}],["smarttub",{"_index":994,"t":{"98":{"position":[[2428,13],[3015,13]]}}}],["socat",{"_index":1209,"t":{"160":{"position":[[1442,5],[1600,5]]}}}],["social",{"_index":584,"t":{"51":{"position":[[281,6]]},"58":{"position":[[109,6],[363,6]]},"184":{"position":[[81,6]]}}}],["socket",{"_index":975,"t":{"98":{"position":[[1263,6]]},"160":{"position":[[659,6],[791,7],[949,6],[1067,7],[1287,7],[1508,6]]}}}],["sole",{"_index":953,"t":{"98":{"position":[[680,6]]},"102":{"position":[[419,6]]},"134":{"position":[[981,6]]}}}],["solut",{"_index":2443,"t":{"428":{"position":[[517,9]]}}}],["some_ip",{"_index":1939,"t":{"329":{"position":[[1193,9]]}}}],["someguy",{"_index":1870,"t":{"301":{"position":[[629,8]]}}}],["someotherus",{"_index":1126,"t":{"130":{"position":[[2975,15]]},"168":{"position":[[2416,15],[2964,15]]}}}],["someth",{"_index":1472,"t":{"208":{"position":[[2856,9]]},"274":{"position":[[468,9]]},"372":{"position":[[327,9],[1261,9]]},"376":{"position":[[917,9]]},"379":{"position":[[11,9]]},"390":{"position":[[404,9]]}}}],["sometim",{"_index":1803,"t":{"256":{"position":[[1548,9]]},"390":{"position":[[1076,9]]}}}],["someus",{"_index":1234,"t":{"168":{"position":[[869,12],[903,8],[931,8],[1164,11],[1243,9]]}}}],["somewher",{"_index":538,"t":{"41":{"position":[[306,9]]},"60":{"position":[[205,10]]},"321":{"position":[[201,9]]},"400":{"position":[[22,9]]}}}],["song",{"_index":443,"t":{"26":{"position":[[77,5]]},"76":{"position":[[594,4]]},"82":{"position":[[82,4]]},"214":{"position":[[119,5]]},"301":{"position":[[351,4],[617,4]]},"350":{"position":[[319,4]]},"390":{"position":[[85,4],[1907,4],[2950,5],[2989,4],[3036,4],[3113,5],[3174,5]]}}}],["sono",{"_index":922,"t":{"96":{"position":[[37,7]]}}}],["sort",{"_index":1701,"t":{"247":{"position":[[617,7]]},"258":{"position":[[243,7],[327,6],[369,7],[549,7],[676,7]]},"263":{"position":[[341,7],[364,7]]}}}],["sot",{"_index":769,"t":{"73":{"position":[[25,3]]}}}],["sound",{"_index":2295,"t":{"390":{"position":[[2018,5]]}}}],["soundcloud",{"_index":1164,"t":{"150":{"position":[[368,14]]},"152":{"position":[[20,12],[98,12],[373,14],[444,11]]}}}],["soundcloud:song:mysong",{"_index":1165,"t":{"150":{"position":[[474,22]]}}}],["soundtrack",{"_index":1789,"t":{"256":{"position":[[912,11]]}}}],["soup",{"_index":1747,"t":{"251":{"position":[[1810,4],[1992,6],[3580,4],[3644,4],[3912,6],[4447,5],[4542,5],[4667,6]]},"301":{"position":[[808,4],[926,6]]}}}],["sourc",{"_index":5,"t":{"4":{"position":[[0,7],[608,6],[1458,7],[1496,6],[3141,7],[3179,6],[4392,10]]},"6":{"position":[[64,6],[117,7],[134,7]]},"8":{"position":[[1604,9]]},"14":{"position":[[3040,6]]},"16":{"position":[[489,10]]},"18":{"position":[[48,8],[208,7]]},"20":{"position":[[93,7]]},"22":{"position":[[78,6],[101,6],[122,6],[358,10]]},"24":{"position":[[647,7]]},"33":{"position":[[525,6],[708,7],[808,6],[895,6],[988,6],[1183,6]]},"35":{"position":[[83,8]]},"39":{"position":[[91,8]]},"43":{"position":[[98,8]]},"51":{"position":[[77,8],[1545,6]]},"58":{"position":[[87,8]]},"67":{"position":[[253,6],[910,10],[2245,6],[2481,6]]},"71":{"position":[[2,6],[19,6]]},"76":{"position":[[4,7],[122,6],[190,6],[332,6],[421,7],[545,6],[677,7],[881,7],[1028,7],[1220,7]]},"78":{"position":[[5,7],[105,7]]},"80":{"position":[[25,6],[377,6]]},"82":{"position":[[2,6],[654,7]]},"84":{"position":[[55,8],[131,7],[224,7],[522,8]]},"86":{"position":[[999,6]]},"88":{"position":[[649,10]]},"90":{"position":[[13,6],[200,6],[235,6]]},"94":{"position":[[445,10]]},"96":{"position":[[168,6]]},"98":{"position":[[247,7],[398,6],[532,6],[577,6],[3342,6]]},"100":{"position":[[896,10]]},"102":{"position":[[641,7],[986,8],[1063,7],[1204,7],[1386,10],[1453,7],[1535,7]]},"104":{"position":[[312,10]]},"110":{"position":[[552,10]]},"116":{"position":[[499,10]]},"118":{"position":[[5,6],[265,6],[363,8],[623,7],[685,8],[709,9],[946,10],[976,8],[1000,9]]},"120":{"position":[[5,6],[254,8]]},"122":{"position":[[246,7]]},"124":{"position":[[126,6],[508,10]]},"126":{"position":[[5,6],[292,6],[428,8]]},"128":{"position":[[242,7],[347,9],[625,10],[697,9]]},"130":{"position":[[2775,10]]},"132":{"position":[[5,6],[279,8]]},"134":{"position":[[561,7]]},"138":{"position":[[124,6],[587,10]]},"140":{"position":[[5,6]]},"142":{"position":[[257,7],[366,9],[607,10],[677,9]]},"144":{"position":[[149,6],[247,8]]},"146":{"position":[[240,7],[306,8],[346,9],[534,10],[567,8],[607,9]]},"148":{"position":[[98,7],[212,7]]},"150":{"position":[[59,7]]},"152":{"position":[[12,7]]},"154":{"position":[[322,10]]},"158":{"position":[[412,10]]},"162":{"position":[[113,6],[596,10]]},"166":{"position":[[439,10]]},"168":{"position":[[2807,10]]},"170":{"position":[[151,6]]},"174":{"position":[[82,6],[180,8],[431,7],[522,9],[731,10],[788,9]]},"176":{"position":[[1965,7]]},"178":{"position":[[588,10]]},"180":{"position":[[5,6],[434,6]]},"182":{"position":[[495,10]]},"184":{"position":[[230,6]]},"188":{"position":[[83,6],[181,8]]},"190":{"position":[[874,9],[1083,9],[1313,9],[1691,7],[1778,9],[2039,10],[2093,9]]},"194":{"position":[[364,10]]},"198":{"position":[[44,7],[365,6],[447,6],[583,6]]},"202":{"position":[[587,10]]},"206":{"position":[[344,10]]},"208":{"position":[[1667,6],[4302,6]]},"210":{"position":[[733,10]]},"212":{"position":[[272,6],[665,6]]},"214":{"position":[[67,7],[177,6],[211,6],[358,6],[532,8],[581,6]]},"216":{"position":[[151,6],[348,6],[434,9]]},"218":{"position":[[4,8],[968,7]]},"230":{"position":[[674,9]]},"234":{"position":[[292,6],[475,8]]},"247":{"position":[[1172,6],[1773,6]]},"251":{"position":[[1548,7]]},"261":{"position":[[688,7]]},"284":{"position":[[113,9]]},"301":{"position":[[127,7]]},"303":{"position":[[1217,7]]},"309":{"position":[[426,6],[890,6]]},"319":{"position":[[198,6]]},"325":{"position":[[52,7]]},"329":{"position":[[886,7]]},"331":{"position":[[495,7]]},"333":{"position":[[0,6]]},"335":{"position":[[77,6],[131,6]]},"337":{"position":[[885,6],[987,6]]},"340":{"position":[[1124,6],[1210,8],[1641,6],[1901,6]]},"342":{"position":[[22,6],[431,7],[950,6]]},"344":{"position":[[57,6],[912,7],[1090,6]]},"346":{"position":[[943,7]]},"350":{"position":[[16,7],[59,6],[173,6],[653,6],[1116,6],[1187,6],[1303,6]]},"353":{"position":[[13,6],[181,6]]},"355":{"position":[[146,6],[376,7],[391,6],[492,6],[526,6],[617,6],[1147,7],[1163,7],[1374,7],[1483,7],[1753,6],[1922,7],[1947,6],[2228,6],[2576,7]]},"361":{"position":[[50,6]]},"364":{"position":[[72,7],[351,7]]},"366":{"position":[[65,7],[152,8],[454,8]]},"372":{"position":[[6,7],[1178,6],[1947,8],[2404,6]]},"384":{"position":[[468,7]]},"390":{"position":[[120,6],[607,7],[768,6],[2266,8],[2572,6]]},"394":{"position":[[2159,7],[2470,6]]},"396":{"position":[[103,6]]},"400":{"position":[[918,10]]},"402":{"position":[[107,7]]},"416":{"position":[[0,7],[1415,6],[1554,6],[1679,7],[1722,6],[2921,7],[3006,6],[3169,7],[3798,9],[4085,8]]},"418":{"position":[[64,7],[337,7],[776,6],[823,8],[888,7],[1551,7],[1745,9]]},"420":{"position":[[70,7]]},"422":{"position":[[40,8],[105,7],[768,7],[962,9]]},"424":{"position":[[105,7]]},"426":{"position":[[316,7]]},"428":{"position":[[241,7]]},"430":{"position":[[127,7],[686,7],[1527,6],[1685,7],[1863,7],[2166,6],[2194,6],[2431,7]]},"432":{"position":[[42,7],[110,8],[151,6],[237,6]]},"434":{"position":[[2,6],[19,6],[237,6],[344,7],[394,6],[436,6]]}}}],["source'",{"_index":472,"t":{"33":{"position":[[563,8]]},"80":{"position":[[79,8]]},"82":{"position":[[352,8]]},"84":{"position":[[75,8],[476,8],[624,8]]},"86":{"position":[[1160,8],[1289,8]]},"212":{"position":[[466,8]]},"218":{"position":[[818,8]]},"251":{"position":[[5281,8]]},"350":{"position":[[437,8]]},"353":{"position":[[74,8]]},"355":{"position":[[2528,8],[3419,8]]}}}],["source/cli",{"_index":89,"t":{"4":{"position":[[1775,13],[1794,14],[1945,13]]},"6":{"position":[[231,13]]},"10":{"position":[[76,14]]},"230":{"position":[[96,13]]},"247":{"position":[[888,13],[1099,13]]},"309":{"position":[[143,13],[354,13]]},"319":{"position":[[114,13]]},"325":{"position":[[106,13],[408,14]]},"331":{"position":[[360,13]]},"394":{"position":[[907,13]]},"428":{"position":[[199,13]]}}}],["source/client'",{"_index":1709,"t":{"247":{"position":[[1049,15]]},"309":{"position":[[304,15]]}}}],["source_scrobble_duration=40",{"_index":833,"t":{"82":{"position":[[674,27]]}}}],["source_scrobble_percent=20",{"_index":834,"t":{"82":{"position":[[702,26]]}}}],["source_sot",{"_index":2148,"t":{"355":{"position":[[833,10]]}}}],["source_sot.histori",{"_index":2151,"t":{"355":{"position":[[1111,19]]}}}],["sourceaioconfig",{"_index":2012,"t":{"340":{"position":[[1547,15]]}}}],["sourceconfig",{"_index":2010,"t":{"340":{"position":[[1467,12]]}}}],["sourcedata",{"_index":2119,"t":{"350":{"position":[[1579,11],[1861,12]]}}}],["sourcedefault",{"_index":144,"t":{"4":{"position":[[4100,17]]},"67":{"position":[[25,17]]},"344":{"position":[[1182,14]]}}}],["sources.0.json",{"_index":2201,"t":{"366":{"position":[[416,14]]}}}],["sources.1.json",{"_index":2203,"t":{"366":{"position":[[602,14]]}}}],["sources.json",{"_index":2199,"t":{"366":{"position":[[357,12],[543,12]]}}}],["sources/cli",{"_index":102,"t":{"4":{"position":[[2255,15],[3479,15],[3551,15],[3880,15]]},"24":{"position":[[41,15]]},"247":{"position":[[121,16]]},"309":{"position":[[90,16]]},"426":{"position":[[445,15]]},"448":{"position":[[49,15]]}}}],["sourcetyp",{"_index":2015,"t":{"340":{"position":[[1753,10],[1812,12],[1825,12]]},"344":{"position":[[621,10],[635,12],[657,12]]}}}],["space",{"_index":1854,"t":{"297":{"position":[[249,6],[425,6]]},"390":{"position":[[2006,5]]}}}],["special",{"_index":1333,"t":{"190":{"position":[[494,7]]},"256":{"position":[[1053,7]]},"282":{"position":[[968,7]]}}}],["specif",{"_index":12,"t":{"4":{"position":[[86,8],[1706,8],[3389,8]]},"10":{"position":[[60,8]]},"78":{"position":[[177,8]]},"98":{"position":[[968,8],[2205,8]]},"156":{"position":[[158,8]]},"168":{"position":[[840,8],[1045,8]]},"180":{"position":[[470,8]]},"192":{"position":[[773,8]]},"220":{"position":[[631,8],[693,8]]},"226":{"position":[[569,8]]},"232":{"position":[[25,8]]},"251":{"position":[[121,8]]},"256":{"position":[[1125,12]]},"331":{"position":[[323,8],[340,9],[413,8]]},"384":{"position":[[294,8]]},"430":{"position":[[1874,8]]}}}],["specifi",{"_index":67,"t":{"4":{"position":[[1192,9],[2852,9]]},"12":{"position":[[267,9],[422,7],[562,9]]},"39":{"position":[[272,9]]},"67":{"position":[[2037,7]]},"80":{"position":[[114,7]]},"150":{"position":[[97,7]]},"176":{"position":[[1256,7]]},"224":{"position":[[15,7],[115,10],[954,9],[1037,10]]},"226":{"position":[[775,10]]},"245":{"position":[[38,10]]},"274":{"position":[[244,7]]},"282":{"position":[[348,9]]},"305":{"position":[[38,10]]},"342":{"position":[[104,7]]},"376":{"position":[[100,9]]},"394":{"position":[[473,7],[3192,7],[3339,9]]},"396":{"position":[[1054,7]]},"414":{"position":[[252,7]]},"444":{"position":[[181,9]]}}}],["speed",{"_index":330,"t":{"14":{"position":[[1960,5]]}}}],["spell",{"_index":1517,"t":{"212":{"position":[[637,7]]},"278":{"position":[[328,8]]}}}],["split",{"_index":1864,"t":{"301":{"position":[[252,6],[365,5],[436,5],[489,6]]}}}],["spotifi",{"_index":81,"t":{"4":{"position":[[1553,7],[3236,7],[4415,10]]},"8":{"position":[[1614,8]]},"12":{"position":[[85,7]]},"24":{"position":[[665,9]]},"65":{"position":[[139,7],[367,7]]},"67":{"position":[[933,10],[1153,7],[1189,10],[1435,10]]},"69":{"position":[[92,7]]},"71":{"position":[[127,8]]},"73":{"position":[[725,7]]},"100":{"position":[[530,8]]},"162":{"position":[[473,9],[701,9]]},"176":{"position":[[0,7],[28,7],[67,7],[269,7],[380,7],[472,7],[517,7],[551,7],[648,7],[708,7],[900,7],[1041,7],[1063,7],[1298,7],[1647,7],[1677,7],[1957,7],[2107,7],[2432,7],[2801,7],[2917,7],[3039,7],[3680,7],[3971,7],[4320,7]]},"178":{"position":[[840,9]]},"224":{"position":[[652,7]]},"234":{"position":[[1122,9]]},"238":{"position":[[26,9]]},"251":{"position":[[1061,8]]},"340":{"position":[[1766,9],[1842,10]]},"382":{"position":[[198,7]]},"384":{"position":[[137,9]]},"400":{"position":[[555,8]]},"412":{"position":[[308,8]]},"416":{"position":[[105,7],[528,7],[563,7],[644,7],[1189,7]]},"418":{"position":[[905,7]]},"422":{"position":[[122,7]]},"430":{"position":[[361,7]]},"434":{"position":[[179,8]]},"444":{"position":[[252,7]]}}}],["spotify'",{"_index":623,"t":{"51":{"position":[[1647,9]]}}}],["spotify.json",{"_index":111,"t":{"4":{"position":[[2480,12]]},"82":{"position":[[381,12]]}}}],["spotify/jellyfin/etc",{"_index":1877,"t":{"303":{"position":[[1230,21]]}}}],["spotify_client_id",{"_index":1308,"t":{"178":{"position":[[82,17]]}}}],["spotify_client_id=yourclientid",{"_index":2403,"t":{"416":{"position":[[926,30]]}}}],["spotify_client_id=yourid",{"_index":47,"t":{"4":{"position":[[686,26],[865,24],[1061,24]]}}}],["spotify_client_secret",{"_index":1309,"t":{"178":{"position":[[104,21]]}}}],["spotify_client_secret=yourclientsecret",{"_index":2404,"t":{"416":{"position":[[959,38]]}}}],["spotify_client_secret=yoursecret",{"_index":48,"t":{"4":{"position":[[716,34],[892,32],[1086,32]]}}}],["spotify_redirect_uri",{"_index":1271,"t":{"176":{"position":[[1710,20],[2148,20],[2842,20],[4012,20]]},"178":{"position":[[130,20]]}}}],["spotify_redirect_uri=https://multi",{"_index":2405,"t":{"416":{"position":[[1000,34]]}}}],["spotify_secret",{"_index":243,"t":{"8":{"position":[[1659,14]]}}}],["spotify_transforms=musicbrainz",{"_index":2426,"t":{"418":{"position":[[1190,30]]},"422":{"position":[[407,30]]}}}],["spotifysourceaioconfig",{"_index":2013,"t":{"340":{"position":[[1565,22]]}}}],["spotifysourceconfig",{"_index":2011,"t":{"340":{"position":[[1482,19]]}}}],["src/backend/common/infrastructure/atomic.t",{"_index":2014,"t":{"340":{"position":[[1697,43]]}}}],["src/backend/common/infrastructure/config/source/coolplayer.t",{"_index":1989,"t":{"340":{"position":[[164,62]]}}}],["src/backend/common/infrastructure/config/source/sources.t",{"_index":2005,"t":{"340":{"position":[[1219,58]]}}}],["src/backend/sources/coolplayersource.t",{"_index":2061,"t":{"346":{"position":[[139,39]]},"348":{"position":[[283,39],[1469,39],[2107,39]]},"350":{"position":[[1496,39]]},"353":{"position":[[292,39]]},"355":{"position":[[784,39]]}}}],["src/backend/sources/mybasicsource.t",{"_index":2160,"t":{"355":{"position":[[2764,36],[3436,36]]}}}],["src/backend/sources/scrobblesources.t",{"_index":2034,"t":{"344":{"position":[[255,38]]}}}],["src/backend/sources/spotifysource.t",{"_index":2019,"t":{"342":{"position":[[127,36]]}}}],["src/index.j",{"_index":2371,"t":{"400":{"position":[[861,12]]}}}],["src/service/api.t",{"_index":2153,"t":{"355":{"position":[[1422,18]]}}}],["ssl",{"_index":1135,"t":{"134":{"position":[[815,3]]},"176":{"position":[[1435,3]]}}}],["stack",{"_index":342,"t":{"14":{"position":[[3175,6]]},"160":{"position":[[1101,5]]},"416":{"position":[[3610,5]]}}}],["stage",{"_index":1556,"t":{"220":{"position":[[36,7],[46,5],[144,6],[160,5],[249,5],[348,5],[461,5],[514,6],[541,5],[593,5],[648,6],[687,5]]},"222":{"position":[[0,6],[110,5],[146,5],[179,6],[283,6],[384,5],[605,5],[684,5],[994,6],[1864,5],[1908,5],[2090,5],[2169,5]]},"224":{"position":[[5,5],[161,5],[737,6],[767,5],[971,5],[1095,6]]},"226":{"position":[[0,6],[60,5],[101,7],[155,6],[218,5],[285,5],[358,5],[493,5],[537,5],[563,5],[681,6],[711,5],[754,5],[985,5],[1031,5]]},"228":{"position":[[0,6],[44,6],[457,5],[1172,5],[1252,5],[1435,5],[1509,5]]},"230":{"position":[[21,5],[197,5],[338,5],[527,5],[568,6]]},"232":{"position":[[34,5],[73,5],[86,5],[104,5]]},"234":{"position":[[16,5],[213,5],[461,5]]},"241":{"position":[[165,5]]},"243":{"position":[[83,5]]},"247":{"position":[[256,5],[925,5],[952,5],[1739,5]]},"251":{"position":[[229,5],[522,5],[695,5],[2126,5],[2547,5],[2568,5],[2864,5],[3224,5],[3398,5],[3478,6],[3969,5],[4676,5],[5825,5]]},"261":{"position":[[27,5]]},"267":{"position":[[406,6],[465,6],[523,6]]},"276":{"position":[[12,5],[106,5]]},"278":{"position":[[9,5],[112,5],[383,5]]},"280":{"position":[[4,5],[154,5],[352,6],[411,5],[555,6],[766,5]]},"301":{"position":[[11,5],[102,5],[677,5]]},"303":{"position":[[25,5]]},"307":{"position":[[54,5],[223,6],[438,5]]},"309":{"position":[[180,5],[207,5],[856,5]]},"312":{"position":[[161,5],[240,5]]},"316":{"position":[[171,5],[229,6]]},"329":{"position":[[90,8],[266,7],[274,6],[324,6],[405,5],[439,5],[503,5],[544,5],[583,5],[658,5],[690,5],[772,6],[796,5],[1063,6],[1400,6],[1430,5],[1537,5],[1706,5],[1798,6],[1934,6],[2484,5],[2573,5],[3045,6]]},"340":{"position":[[402,6],[2074,6]]},"348":{"position":[[27,6],[122,6],[1462,6],[2100,6]]}}}],["stage/rul",{"_index":1595,"t":{"228":{"position":[[392,10]]}}}],["stand",{"_index":1707,"t":{"247":{"position":[[1013,6]]},"309":{"position":[[268,6]]}}}],["standalon",{"_index":1895,"t":{"319":{"position":[[273,10]]}}}],["standard",{"_index":581,"t":{"51":{"position":[[212,8]]},"58":{"position":[[294,8]]},"102":{"position":[[90,8]]},"108":{"position":[[348,8]]},"114":{"position":[[344,8]]},"122":{"position":[[137,10]]},"134":{"position":[[163,10]]},"148":{"position":[[72,8],[89,8],[701,8]]},"160":{"position":[[11,8]]},"220":{"position":[[416,11]]},"234":{"position":[[233,13]]},"331":{"position":[[22,8],[156,8]]},"346":{"position":[[118,8]]},"350":{"position":[[2268,8]]},"430":{"position":[[1915,11]]}}}],["start",{"_index":64,"t":{"4":{"position":[[1127,5]]},"22":{"position":[[93,7]]},"47":{"position":[[270,5]]},"63":{"position":[[80,8]]},"150":{"position":[[231,5],[452,5]]},"176":{"position":[[740,5],[1102,6],[3899,8],[4234,5],[4336,5]]},"192":{"position":[[737,8]]},"208":{"position":[[2804,5],[3513,5],[4595,5],[4939,5],[5454,5]]},"282":{"position":[[714,6]]},"321":{"position":[[432,5]]},"329":{"position":[[157,6]]},"344":{"position":[[8,6]]},"353":{"position":[[60,6]]},"390":{"position":[[2916,5]]},"396":{"position":[[18,5]]},"400":{"position":[[259,5],[1259,5]]},"406":{"position":[[389,5]]},"408":{"position":[[113,5],[268,5]]},"416":{"position":[[1080,8],[3968,8]]},"424":{"position":[[454,5]]},"426":{"position":[[200,5]]},"430":{"position":[[1227,5],[2446,8]]},"438":{"position":[[14,5]]}}}],["startup",{"_index":1471,"t":{"208":{"position":[[2836,7]]},"325":{"position":[[315,9]]},"329":{"position":[[1560,7]]},"353":{"position":[[603,7]]},"444":{"position":[[218,7]]}}}],["stat",{"_index":660,"t":{"58":{"position":[[1491,5]]},"102":{"position":[[1126,6],[1275,6],[1522,6]]},"430":{"position":[[928,6]]}}}],["state",{"_index":805,"t":{"76":{"position":[[754,5],[934,5]]},"337":{"position":[[553,5]]},"340":{"position":[[2127,5]]},"350":{"position":[[227,5],[552,5],[962,5],[1092,5],[1201,5],[1921,5],[2284,5],[2463,5],[2587,5],[2601,5],[2649,5]]},"355":{"position":[[46,5],[676,5],[1570,5]]},"366":{"position":[[850,5]]}}}],["stateless",{"_index":410,"t":{"22":{"position":[[1474,9],[1704,9]]}}}],["statement",{"_index":2041,"t":{"344":{"position":[[595,9]]}}}],["static",{"_index":2059,"t":{"346":{"position":[[21,6],[600,6]]},"348":{"position":[[440,6]]}}}],["station",{"_index":873,"t":{"88":{"position":[[99,7],[131,7],[206,7],[276,7],[473,10],[488,7],[757,10],[772,7]]},"102":{"position":[[32,7],[588,8]]}}}],["statist",{"_index":2439,"t":{"426":{"position":[[516,10]]},"444":{"position":[[19,11]]}}}],["statu",{"_index":428,"t":{"24":{"position":[[241,6],[313,6]]},"33":{"position":[[579,6],[642,6]]},"84":{"position":[[485,6]]},"86":{"position":[[1169,6],[1617,6]]},"88":{"position":[[214,6]]},"256":{"position":[[633,6],[1403,6]]},"376":{"position":[[129,6]]},"426":{"position":[[474,6],[577,6]]},"430":{"position":[[676,6]]},"444":{"position":[[2,6],[341,6],[365,6]]}}}],["stdout/stderr",{"_index":2459,"t":{"444":{"position":[[148,13]]}}}],["step",{"_index":982,"t":{"98":{"position":[[1460,5],[1534,5]]},"176":{"position":[[2990,4],[3913,4]]},"249":{"position":[[232,6],[367,5]]},"251":{"position":[[810,4]]},"335":{"position":[[29,4],[37,4]]},"372":{"position":[[1380,5]]},"394":{"position":[[1564,5]]},"416":{"position":[[457,4]]},"418":{"position":[[192,4],[277,4],[1559,4]]},"420":{"position":[[10,4]]},"422":{"position":[[776,4]]}}}],["stick",{"_index":24,"t":{"4":{"position":[[269,5]]}}}],["still",{"_index":456,"t":{"31":{"position":[[229,5]]},"58":{"position":[[1336,5]]},"67":{"position":[[2023,5]]},"152":{"position":[[258,5]]},"196":{"position":[[758,5]]},"261":{"position":[[102,5]]},"265":{"position":[[199,5],[353,5]]},"274":{"position":[[79,5]]},"280":{"position":[[134,5]]},"314":{"position":[[157,7]]},"355":{"position":[[401,5],[1548,5]]},"402":{"position":[[70,5]]},"430":{"position":[[2321,5]]}}}],["stop",{"_index":392,"t":{"22":{"position":[[137,7]]},"31":{"position":[[187,5]]},"76":{"position":[[769,8]]},"208":{"position":[[128,4]]},"226":{"position":[[69,4],[343,5],[1430,7]]},"247":{"position":[[1963,7]]},"276":{"position":[[858,7]]},"309":{"position":[[1080,7]]},"329":{"position":[[221,5]]},"350":{"position":[[2093,9]]},"376":{"position":[[342,7]]},"394":{"position":[[1530,7]]},"396":{"position":[[1460,7]]},"414":{"position":[[524,7]]},"455":{"position":[[87,4]]}}}],["storag",{"_index":411,"t":{"22":{"position":[[1499,7],[1815,7]]},"92":{"position":[[630,7]]},"394":{"position":[[1606,8]]}}}],["store",{"_index":301,"t":{"14":{"position":[[236,5],[473,6],[1230,6],[2622,6],[2896,5]]},"26":{"position":[[32,6]]},"51":{"position":[[307,6],[1373,5]]},"58":{"position":[[389,6]]},"92":{"position":[[48,5]]},"329":{"position":[[1212,5],[1322,6],[3139,5]]},"331":{"position":[[57,5],[176,7]]},"366":{"position":[[728,7]]},"394":{"position":[[1671,7]]},"424":{"position":[[26,5]]},"436":{"position":[[32,6]]}}}],["stored/avail",{"_index":655,"t":{"58":{"position":[[164,16]]},"184":{"position":[[136,16]]}}}],["strang",{"_index":1006,"t":{"98":{"position":[[3254,7]]}}}],["stream",{"_index":1024,"t":{"102":{"position":[[40,9],[153,6],[180,7],[1038,6]]}}}],["streamtitl",{"_index":1027,"t":{"102":{"position":[[238,13]]}}}],["string",{"_index":229,"t":{"8":{"position":[[1272,6],[1479,6]]},"14":{"position":[[3394,6],[3445,6]]},"102":{"position":[[231,6]]},"150":{"position":[[212,6],[312,7]]},"152":{"position":[[315,7]]},"208":{"position":[[3693,6]]},"212":{"position":[[119,7]]},"220":{"position":[[325,6]]},"222":{"position":[[1384,6]]},"228":{"position":[[176,6]]},"251":{"position":[[1727,7],[2826,6],[2973,7],[3335,6],[3692,6],[3727,6],[3769,6],[4137,7],[4302,7],[4345,7]]},"282":{"position":[[47,6],[139,7],[166,7],[285,7],[312,7],[392,6],[566,6],[615,7],[649,7],[702,6],[793,6],[843,7],[883,7],[976,6]]},"284":{"position":[[456,6]]},"297":{"position":[[24,6],[69,7],[118,6]]},"301":{"position":[[208,6],[277,6]]},"303":{"position":[[74,6],[219,6],[386,7],[444,6],[765,7],[1162,6],[1334,7],[1388,7]]},"327":{"position":[[183,6]]},"329":{"position":[[569,6]]},"340":{"position":[[749,6],[861,6]]},"348":{"position":[[471,7],[781,6],[906,8],[1057,8],[1737,6],[1916,6]]},"382":{"position":[[75,6]]}}}],["strong",{"_index":1643,"t":{"234":{"position":[[340,6]]}}}],["structur",{"_index":109,"t":{"4":{"position":[[2447,10]]},"51":{"position":[[762,9],[811,9]]},"58":{"position":[[844,9],[893,9]]},"216":{"position":[[286,9]]},"234":{"position":[[1163,10]]},"238":{"position":[[67,10]]},"325":{"position":[[227,9]]},"331":{"position":[[36,9]]}}}],["subdirectori",{"_index":1476,"t":{"208":{"position":[[3545,12]]}}}],["subhead",{"_index":822,"t":{"80":{"position":[[559,9]]}}}],["submit",{"_index":451,"t":{"31":{"position":[[32,6],[384,9]]},"51":{"position":[[1695,10]]},"372":{"position":[[1393,10]]}}}],["subsequ",{"_index":1580,"t":{"226":{"position":[[90,10]]}}}],["subset",{"_index":1329,"t":{"190":{"position":[[230,6]]}}}],["subson",{"_index":439,"t":{"24":{"position":[[685,9]]},"65":{"position":[[182,10]]},"67":{"position":[[2660,11]]},"73":{"position":[[757,8]]},"180":{"position":[[64,8],[593,8]]},"182":{"position":[[156,8],[687,10]]},"222":{"position":[[753,8],[1434,8],[2238,8]]},"247":{"position":[[1163,8]]},"251":{"position":[[1602,8]]},"267":{"position":[[543,8]]},"270":{"position":[[179,8]]},"272":{"position":[[451,8]]},"280":{"position":[[575,8]]},"301":{"position":[[169,8],[724,8]]},"307":{"position":[[243,8]]},"309":{"position":[[417,8]]},"312":{"position":[[309,8]]},"314":{"position":[[208,8]]},"316":{"position":[[241,8]]},"416":{"position":[[1406,8],[1545,8]]},"430":{"position":[[369,8]]}}}],["subsonic.json",{"_index":1567,"t":{"222":{"position":[[775,13],[1456,13],[2260,13]]},"226":{"position":[[903,13],[1184,13]]},"265":{"position":[[382,13]]},"267":{"position":[[565,13]]},"270":{"position":[[201,13]]},"272":{"position":[[473,13]]},"280":{"position":[[597,13]]},"307":{"position":[[265,13]]},"312":{"position":[[331,13]]},"314":{"position":[[230,13]]},"316":{"position":[[263,13]]}}}],["subsonic_password",{"_index":1317,"t":{"182":{"position":[[100,17]]}}}],["subsonic_transforms=musicbrainz",{"_index":1711,"t":{"247":{"position":[[1226,31]]}}}],["subsonic_transforms=n",{"_index":1881,"t":{"309":{"position":[[480,26]]}}}],["subsonic_url",{"_index":1318,"t":{"182":{"position":[[122,12]]}}}],["subsonic_us",{"_index":1316,"t":{"182":{"position":[[82,13]]}}}],["subsonic_user=myus",{"_index":1710,"t":{"247":{"position":[[1194,20]]},"309":{"position":[[448,20]]}}}],["succe",{"_index":1959,"t":{"329":{"position":[[3262,8]]}}}],["succeed",{"_index":1931,"t":{"329":{"position":[[550,9],[589,9],[2607,9]]}}}],["success",{"_index":1497,"t":{"208":{"position":[[5365,7]]},"226":{"position":[[994,11],[1276,10]]},"276":{"position":[[704,10]]}}}],["successfulli",{"_index":462,"t":{"31":{"position":[[371,12]]},"226":{"position":[[291,12]]}}}],["succinctli",{"_index":1601,"t":{"228":{"position":[[1010,11]]}}}],["such",{"_index":38,"t":{"4":{"position":[[572,4]]},"148":{"position":[[106,4]]},"180":{"position":[[117,5],[369,5]]},"251":{"position":[[5496,5]]},"301":{"position":[[160,4]]},"327":{"position":[[286,4]]},"331":{"position":[[396,4]]},"374":{"position":[[501,5]]}}}],["suffix",{"_index":1088,"t":{"124":{"position":[[250,6]]},"138":{"position":[[330,6]]}}}],["super",{"_index":2141,"t":{"353":{"position":[[525,8]]},"355":{"position":[[968,8]]}}}],["super('coolplay",{"_index":2029,"t":{"342":{"position":[[713,19]]}}}],["superag",{"_index":2097,"t":{"348":{"position":[[1529,13],[2167,13]]},"350":{"position":[[1556,13]]},"353":{"position":[[352,13]]},"400":{"position":[[581,13],[595,13]]}}}],["support",{"_index":90,"t":{"4":{"position":[[1814,7]]},"20":{"position":[[16,8]]},"22":{"position":[[720,8],[1073,8],[1465,8]]},"33":{"position":[[198,7]]},"84":{"position":[[111,10]]},"86":{"position":[[1006,8]]},"98":{"position":[[167,7]]},"102":{"position":[[1075,9]]},"134":{"position":[[903,7]]},"148":{"position":[[39,8]]},"154":{"position":[[36,7]]},"180":{"position":[[81,8],[333,8]]},"196":{"position":[[362,9]]},"200":{"position":[[118,9]]},"208":{"position":[[58,9]]},"212":{"position":[[24,7]]},"228":{"position":[[51,7]]},"251":{"position":[[1567,7]]},"261":{"position":[[703,7]]},"265":{"position":[[284,8]]},"400":{"position":[[407,9]]},"402":{"position":[[51,10]]},"416":{"position":[[1331,8],[1476,8]]},"430":{"position":[[97,8],[480,8],[769,8],[811,8]]}}}],["sure",{"_index":999,"t":{"98":{"position":[[2651,4]]},"108":{"position":[[409,4]]},"114":{"position":[[403,4]]},"136":{"position":[[141,4]]},"148":{"position":[[767,4]]},"160":{"position":[[981,4]]},"208":{"position":[[4375,4],[4423,4]]},"366":{"position":[[173,4]]},"372":{"position":[[2318,4]]}}}],["surfac",{"_index":1814,"t":{"261":{"position":[[219,7]]},"350":{"position":[[891,8]]},"355":{"position":[[3127,8]]}}}],["switch",{"_index":2042,"t":{"344":{"position":[[650,6],[1246,6]]},"390":{"position":[[2811,8]]}}}],["syntax",{"_index":852,"t":{"86":{"position":[[393,7]]},"108":{"position":[[128,6]]},"114":{"position":[[126,6]]},"148":{"position":[[483,6]]},"164":{"position":[[233,7]]},"230":{"position":[[620,7]]},"364":{"position":[[243,7]]}}}],["system",{"_index":851,"t":{"86":{"position":[[321,6]]},"160":{"position":[[86,8],[345,6]]},"321":{"position":[[66,7]]},"404":{"position":[[11,6]]}}}],["systemctl",{"_index":2396,"t":{"408":{"position":[[24,9],[48,9],[96,9]]}}}],["systemd",{"_index":2376,"t":{"404":{"position":[[0,7]]}}}],["systemscrobbl",{"_index":846,"t":{"84":{"position":[[810,17]]},"86":{"position":[[1475,17]]}}}],["s|\\\\s)(feat\\\\.(.+)|live|remastered(.+))$/i",{"_index":1849,"t":{"287":{"position":[[355,45]]}}}],["s滾石40\\\\s滾石撞樂隊\\\\s40團拚經典(.+)$/i",{"_index":1848,"t":{"287":{"position":[[251,33]]}}}],["tab",{"_index":903,"t":{"92":{"position":[[387,4],[412,4],[638,4]]},"160":{"position":[[688,4]]},"200":{"position":[[160,3]]},"416":{"position":[[3264,3]]},"418":{"position":[[862,3]]},"422":{"position":[[79,3]]},"430":{"position":[[2409,3]]}}}],["tabl",{"_index":503,"t":{"35":{"position":[[942,5]]}}}],["tag",{"_index":412,"t":{"22":{"position":[[1528,5],[1833,7]]},"212":{"position":[[352,4]]},"261":{"position":[[760,6]]},"361":{"position":[[15,3]]},"453":{"position":[[505,4],[526,4]]}}}],["tagged/organ",{"_index":1645,"t":{"234":{"position":[[401,16]]}}}],["tags/metadata",{"_index":1363,"t":{"192":{"position":[[1052,13]]}}}],["take",{"_index":493,"t":{"35":{"position":[[411,4]]},"208":{"position":[[4215,4]]},"346":{"position":[[53,4]]},"350":{"position":[[927,4],[1164,5]]},"355":{"position":[[2737,4]]},"424":{"position":[[1582,4]]}}}],["taken",{"_index":838,"t":{"84":{"position":[[390,5]]},"86":{"position":[[1074,5]]}}}],["tautulli",{"_index":2147,"t":{"355":{"position":[[272,9],[1183,9]]}}}],["tcp",{"_index":1176,"t":{"156":{"position":[[35,3]]},"160":{"position":[[1530,3],[1606,3]]}}}],["teal",{"_index":662,"t":{"58":{"position":[[1528,4]]}}}],["teal.fm",{"_index":449,"t":{"28":{"position":[[69,7]]},"58":{"position":[[79,7],[96,7],[1026,8],[1325,7],[1412,7],[1567,7]]},"73":{"position":[[806,7]]},"184":{"position":[[51,7],[68,7],[250,7],[364,7],[394,7]]},"186":{"position":[[37,7]]},"188":{"position":[[8,7]]},"190":{"position":[[96,8],[1525,7],[1574,7],[1678,7]]},"430":{"position":[[424,7],[558,7]]}}}],["teal.fm'",{"_index":657,"t":{"58":{"position":[[869,9],[927,9]]}}}],["tealfm",{"_index":685,"t":{"63":{"position":[[1228,8]]},"190":{"position":[[2254,8]]},"265":{"position":[[318,7]]},"274":{"position":[[183,7]]}}}],["tealfm.json",{"_index":1342,"t":{"190":{"position":[[819,11],[1028,11],[1258,11]]}}}],["tealfm_app_pw",{"_index":676,"t":{"63":{"position":[[746,13]]}}}],["tealfm_identifi",{"_index":675,"t":{"63":{"position":[[639,17]]}}}],["technic",{"_index":2169,"t":{"355":{"position":[[3777,11]]},"390":{"position":[[956,11]]}}}],["tell",{"_index":1988,"t":{"340":{"position":[[82,4]]},"342":{"position":[[931,5]]},"344":{"position":[[112,4]]},"353":{"position":[[553,4]]},"355":{"position":[[996,4]]},"386":{"position":[[115,4]]}}}],["templat",{"_index":947,"t":{"98":{"position":[[353,8]]}}}],["temporarili",{"_index":1543,"t":{"218":{"position":[[79,11],[317,11]]}}}],["tend",{"_index":1314,"t":{"180":{"position":[[504,4]]}}}],["term",{"_index":607,"t":{"51":{"position":[[1228,5]]},"58":{"position":[[1302,5]]},"176":{"position":[[685,5]]},"216":{"position":[[268,5]]},"220":{"position":[[209,5]]},"256":{"position":[[1262,6]]}}}],["termin",{"_index":2345,"t":{"394":{"position":[[3468,9]]}}}],["test",{"_index":1484,"t":{"208":{"position":[[4360,9]]},"228":{"position":[[77,7],[339,4],[429,4]]},"323":{"position":[[144,5],[261,5]]},"329":{"position":[[1941,4]]},"340":{"position":[[392,4]]},"348":{"position":[[2052,4],[2095,4]]}}}],["text",{"_index":204,"t":{"8":{"position":[[311,4],[371,4]]},"92":{"position":[[491,4]]},"247":{"position":[[770,4]]},"251":{"position":[[4772,4],[4901,4],[4951,4],[5031,4],[5100,4],[5351,4]]},"406":{"position":[[160,4]]}}}],["textbox",{"_index":1351,"t":{"192":{"position":[[326,7]]}}}],["theme",{"_index":1612,"t":{"230":{"position":[[800,5]]}}}],["themself",{"_index":1681,"t":{"241":{"position":[[67,8]]}}}],["therefor",{"_index":1032,"t":{"102":{"position":[[597,10]]},"390":{"position":[[800,10]]}}}],["these",{"_index":810,"t":{"76":{"position":[[874,6]]}}}],["thing",{"_index":530,"t":{"39":{"position":[[313,6]]},"390":{"position":[[2702,6]]}}}],["think",{"_index":1589,"t":{"226":{"position":[[675,5]]},"256":{"position":[[270,5]]}}}],["third",{"_index":920,"t":{"96":{"position":[[0,5]]}}}],["this.baseurl",{"_index":2092,"t":{"348":{"position":[[1149,12]]}}}],["this.canbacklog",{"_index":2142,"t":{"353":{"position":[[611,15]]}}}],["this.canpol",{"_index":2032,"t":{"342":{"position":[[1000,12]]}}}],["this.config",{"_index":2086,"t":{"348":{"position":[[830,12]]}}}],["this.config.token",{"_index":2106,"t":{"348":{"position":[[2449,23]]},"350":{"position":[[2024,23]]},"353":{"position":[[835,23]]}}}],["this.configdir}/currentcr",{"_index":1941,"t":{"329":{"position":[[1346,30]]}}}],["this.discover([someplay",{"_index":2163,"t":{"355":{"position":[[3070,26],[3603,26]]}}}],["this.emitt",{"_index":2058,"t":{"344":{"position":[[1418,14]]}}}],["this.logger.verbose(`config",{"_index":2095,"t":{"348":{"position":[[1294,27]]}}}],["this.playersourceoftruth",{"_index":2150,"t":{"355":{"position":[[1084,24]]}}}],["this.processrecentplays(play",{"_index":2135,"t":{"350":{"position":[[2786,31]]}}}],["this.requiresauth",{"_index":2030,"t":{"342":{"position":[[806,17]]}}}],["this.requiresauthinteract",{"_index":2031,"t":{"342":{"position":[[890,28]]}}}],["this.scrobble(discov",{"_index":2168,"t":{"355":{"position":[[3677,26]]}}}],["this.url.tostr",{"_index":2096,"t":{"348":{"position":[[1353,27]]}}}],["thorough",{"_index":2278,"t":{"390":{"position":[[1330,8]]}}}],["those",{"_index":1035,"t":{"102":{"position":[[1094,5]]},"258":{"position":[[596,5]]},"303":{"position":[[971,5]]}}}],["though",{"_index":594,"t":{"51":{"position":[[543,6]]},"58":{"position":[[625,6]]},"196":{"position":[[742,7]]},"224":{"position":[[828,7]]}}}],["thread",{"_index":938,"t":{"96":{"position":[[655,6]]}}}],["three",{"_index":699,"t":{"65":{"position":[[643,5]]},"208":{"position":[[3459,5]]},"226":{"position":[[168,5]]},"251":{"position":[[2430,5]]}}}],["threshold",{"_index":772,"t":{"73":{"position":[[68,10]]},"76":{"position":[[1011,11]]},"86":{"position":[[11,9],[162,10]]},"102":{"position":[[764,9],[966,11]]},"204":{"position":[[89,9],[228,10]]},"355":{"position":[[178,9]]}}}],["through",{"_index":92,"t":{"4":{"position":[[1842,7]]},"8":{"position":[[758,7]]},"14":{"position":[[2569,7]]},"76":{"position":[[498,7]]},"100":{"position":[[81,7]]},"150":{"position":[[74,7]]},"196":{"position":[[668,7],[685,7]]},"342":{"position":[[988,7]]},"350":{"position":[[2593,7]]},"430":{"position":[[1105,7],[1137,7]]}}}],["throw",{"_index":235,"t":{"8":{"position":[[1396,5]]},"329":{"position":[[477,6],[664,5],[2757,5],[2881,5]]},"348":{"position":[[942,5],[1095,5],[1224,5],[2037,5],[2582,5],[2615,5]]},"350":{"position":[[2558,5]]},"353":{"position":[[1064,5]]}}}],["thrown",{"_index":706,"t":{"67":{"position":[[285,7],[660,7]]}}}],["time",{"_index":99,"t":{"4":{"position":[[2173,4],[3798,4]]},"31":{"position":[[152,5]]},"76":{"position":[[710,4],[929,4]]},"82":{"position":[[182,4]]},"90":{"position":[[161,5]]},"96":{"position":[[92,5],[519,4]]},"98":{"position":[[1507,5]]},"176":{"position":[[237,4],[312,4]]},"190":{"position":[[337,5]]},"208":{"position":[[148,4],[1688,4]]},"212":{"position":[[174,5]]},"218":{"position":[[623,5]]},"329":{"position":[[1583,4]]},"350":{"position":[[1243,5]]},"372":{"position":[[868,5]]},"376":{"position":[[870,5]]},"390":{"position":[[1122,4],[3239,4]]},"426":{"position":[[591,4]]}}}],["timestamp",{"_index":1982,"t":{"337":{"position":[[476,9]]},"346":{"position":[[896,9]]},"350":{"position":[[850,9]]},"353":{"position":[[134,9]]},"355":{"position":[[2424,9]]}}}],["timezon",{"_index":2323,"t":{"394":{"position":[[481,8],[3015,8]]},"396":{"position":[[1062,8]]},"414":{"position":[[260,8]]}}}],["tip",{"_index":0,"t":{"2":{"position":[[0,3]]},"4":{"position":[[1900,3],[3608,3]]},"14":{"position":[[426,3],[1183,3]]},"35":{"position":[[1467,3]]},"180":{"position":[[313,3]]},"198":{"position":[[514,3]]},"218":{"position":[[518,3]]},"226":{"position":[[594,3]]},"234":{"position":[[1502,3],[1619,3]]},"251":{"position":[[3365,3]]},"321":{"position":[[74,3]]},"392":{"position":[[0,3]]},"396":{"position":[[0,3]]},"400":{"position":[[1265,3]]},"424":{"position":[[2175,3]]},"426":{"position":[[0,3]]}}}],["titl",{"_index":1365,"t":{"192":{"position":[[1125,6],[1430,5],[1704,5]]},"212":{"position":[[130,6],[458,5],[543,5],[574,5],[598,5]]},"222":{"position":[[1378,5],[1411,9],[2490,8]]},"224":{"position":[[126,6],[202,8],[256,5]]},"228":{"position":[[845,8],[881,5],[1072,6]]},"230":{"position":[[785,5]]},"245":{"position":[[172,8],[226,5]]},"251":{"position":[[410,5],[929,6],[1225,6],[1687,5],[1737,8],[1926,6],[1935,8],[2394,6],[2497,5],[2662,5],[3329,5],[3507,8],[3721,5],[3763,5],[3855,8],[4339,5],[4374,8],[4594,8]]},"261":{"position":[[248,5]]},"265":{"position":[[533,8]]},"274":{"position":[[687,8]]},"278":{"position":[[268,6]]},"280":{"position":[[271,8],[785,8],[826,5]]},"284":{"position":[[209,8],[246,5],[291,5],[418,7]]},"287":{"position":[[72,8],[212,5],[220,8]]},"289":{"position":[[44,5],[70,8]]},"291":{"position":[[38,8],[85,8]]},"301":{"position":[[579,5],[735,8],[869,8]]},"303":{"position":[[604,5],[679,8],[778,5],[868,5],[982,6],[1548,8],[1660,9]]},"305":{"position":[[153,8],[207,5]]},"316":{"position":[[61,6],[136,5],[393,8],[425,5]]}}}],["title.mp4",{"_index":1372,"t":{"192":{"position":[[1764,9]]}}}],["title/artist/album/listen",{"_index":1531,"t":{"214":{"position":[[307,28],[688,28]]}}}],["title>.+?)\\\\.\\\\w+$/i",{"_index":1374,"t":{"192":{"position":[[1798,24]]}}}],["titleonli",{"_index":1569,"t":{"222":{"position":[[1306,12],[1771,11]]}}}],["titles/artist",{"_index":1763,"t":{"251":{"position":[[5453,14]]}}}],["tld",{"_index":640,"t":{"56":{"position":[[83,4],[333,3]]},"63":{"position":[[157,3],[471,3]]}}}],["tldr",{"_index":1536,"t":{"216":{"position":[[245,5]]},"218":{"position":[[918,4]]}}}],["tmt_yxr90am",{"_index":2296,"t":{"390":{"position":[[2054,13]]}}}],["to",{"_index":884,"t":{"90":{"position":[[107,4]]}}}],["to/great",{"_index":877,"t":{"88":{"position":[[332,10]]}}}],["toggl",{"_index":861,"t":{"86":{"position":[[1015,8]]},"327":{"position":[[515,7]]}}}],["token",{"_index":170,"t":{"4":{"position":[[4897,8]]},"22":{"position":[[501,8],[916,8]]},"37":{"position":[[310,8],[601,8]]},"43":{"position":[[365,5]]},"45":{"position":[[100,5],[348,8],[659,8]]},"65":{"position":[[437,5]]},"67":{"position":[[1759,8],[1929,8],[2286,8],[3137,8]]},"69":{"position":[[606,8],[760,8],[920,8],[1537,8]]},"118":{"position":[[729,8],[1020,8]]},"122":{"position":[[279,7]]},"134":{"position":[[594,7]]},"136":{"position":[[36,5],[58,6],[172,5]]},"138":{"position":[[249,6],[457,8],[644,8]]},"140":{"position":[[465,5]]},"142":{"position":[[386,8],[697,8]]},"168":{"position":[[15,5],[230,5],[770,5],[972,5],[1262,5],[1718,5],[2336,8],[2884,8]]},"176":{"position":[[1056,6]]},"329":{"position":[[3079,5],[3219,5]]},"337":{"position":[[365,5]]},"340":{"position":[[607,5],[680,6],[742,6]]},"344":{"position":[[774,6]]},"348":{"position":[[152,5],[811,6],[846,6],[865,5],[896,5],[2442,6]]},"350":{"position":[[2017,6]]},"353":{"position":[[828,6]]},"416":{"position":[[1762,5],[1926,5],[2444,5],[2457,5],[2513,5]]}}}],["token.trim",{"_index":2088,"t":{"348":{"position":[[918,12]]}}}],["toler",{"_index":1765,"t":{"251":{"position":[[5535,8]]}}}],["tool",{"_index":900,"t":{"92":{"position":[[350,5],[614,5]]},"106":{"position":[[135,5]]},"192":{"position":[[96,5]]},"355":{"position":[[77,4]]}}}],["top",{"_index":381,"t":{"18":{"position":[[347,3]]},"22":{"position":[[257,3]]},"222":{"position":[[75,3]]},"261":{"position":[[143,3]]},"390":{"position":[[1181,3]]},"418":{"position":[[1634,3]]},"422":{"position":[[851,3]]}}}],["topic",{"_index":181,"t":{"4":{"position":[[5065,8]]},"22":{"position":[[1265,8]]}}}],["touch",{"_index":2384,"t":{"406":{"position":[[102,5]]}}}],["track",{"_index":464,"t":{"33":{"position":[[49,6],[793,5]]},"51":{"position":[[103,8],[1433,5]]},"71":{"position":[[58,6]]},"76":{"position":[[841,6],[911,5],[973,5],[1070,5],[1202,7]]},"78":{"position":[[44,5],[76,5]]},"82":{"position":[[137,5],[198,5]]},"86":{"position":[[56,5]]},"96":{"position":[[81,5],[493,6],[617,6]]},"98":{"position":[[1930,5],[2489,9],[2519,5],[2788,8],[2945,8],[3233,5]]},"102":{"position":[[121,5],[487,7],[798,5]]},"118":{"position":[[89,6]]},"140":{"position":[[96,6]]},"148":{"position":[[174,6]]},"150":{"position":[[253,6],[441,5]]},"152":{"position":[[58,5],[277,6],[407,5],[456,6],[471,6],[543,6],[558,6]]},"160":{"position":[[276,6]]},"170":{"position":[[78,8],[234,6]]},"176":{"position":[[150,5],[186,5]]},"184":{"position":[[313,6]]},"192":{"position":[[1997,5]]},"204":{"position":[[134,5]]},"208":{"position":[[444,7]]},"218":{"position":[[717,5],[911,6]]},"224":{"position":[[581,6]]},"230":{"position":[[1112,6]]},"234":{"position":[[649,6]]},"236":{"position":[[46,6]]},"251":{"position":[[2967,5]]},"256":{"position":[[437,5]]},"280":{"position":[[820,5]]},"303":{"position":[[862,5],[1470,5]]},"316":{"position":[[55,5],[94,5]]},"331":{"position":[[70,7],[140,5],[184,6],[207,5],[236,5],[437,6],[476,6],[571,5]]},"337":{"position":[[462,6],[586,6],[616,6]]},"340":{"position":[[2025,5],[2152,5]]},"346":{"position":[[62,5],[566,5],[813,6]]},"350":{"position":[[303,5],[417,5],[1072,5],[1393,5],[2158,5],[2223,5],[2625,5],[2687,5]]},"353":{"position":[[45,6],[116,5],[156,5],[593,6],[897,5]]},"355":{"position":[[423,5],[711,5],[1051,6],[2241,5],[2409,5],[2635,5],[2902,5],[3172,7],[3931,5]]},"382":{"position":[[288,6]]},"386":{"position":[[196,5],[265,5],[345,5],[386,5],[413,8]]},"390":{"position":[[819,6],[1013,5],[1099,5]]},"426":{"position":[[554,6]]},"428":{"position":[[460,5]]},"430":{"position":[[1612,5],[1741,7]]},"432":{"position":[[128,6]]}}}],["track'",{"_index":831,"t":{"82":{"position":[[587,7]]}}}],["track/record",{"_index":1730,"t":{"251":{"position":[[130,15]]}}}],["track/song",{"_index":1775,"t":{"256":{"position":[[81,11]]}}}],["tracknam",{"_index":2069,"t":{"346":{"position":[[692,10],[820,10]]}}}],["tracks/play",{"_index":2125,"t":{"350":{"position":[[1907,13]]}}}],["trade",{"_index":932,"t":{"96":{"position":[[444,5]]}}}],["traffic",{"_index":957,"t":{"98":{"position":[[939,7]]}}}],["tranform",{"_index":1876,"t":{"303":{"position":[[1080,10]]}}}],["transform",{"_index":303,"t":{"14":{"position":[[279,9],[1978,16]]},"108":{"position":[[610,9],[742,11]]},"114":{"position":[[602,9],[732,11]]},"148":{"position":[[911,9],[1043,11]]},"204":{"position":[[540,11]]},"222":{"position":[[85,12],[490,15],[961,11],[1140,15],[1975,15]]},"224":{"position":[[61,14],[999,11],[1144,14]]},"226":{"position":[[436,14]]},"228":{"position":[[257,14]]},"230":{"position":[[27,15],[170,11],[311,11],[707,10],[740,9]]},"241":{"position":[[226,15],[795,15]]},"243":{"position":[[146,15]]},"245":{"position":[[56,11]]},"270":{"position":[[46,15]]},"272":{"position":[[134,15]]},"274":{"position":[[323,15]]},"276":{"position":[[231,15]]},"280":{"position":[[199,15]]},"284":{"position":[[469,12]]},"301":{"position":[[845,11]]},"303":{"position":[[1185,10]]},"305":{"position":[[56,11]]},"312":{"position":[[46,15]]},"314":{"position":[[46,15]]},"331":{"position":[[621,9]]},"340":{"position":[[2002,9]]},"350":{"position":[[2253,9]]},"353":{"position":[[946,10]]}}}],["tray",{"_index":1192,"t":{"160":{"position":[[136,4]]}}}],["tri",{"_index":265,"t":{"12":{"position":[[285,3]]},"102":{"position":[[1600,3]]},"108":{"position":[[585,3]]},"114":{"position":[[577,3]]},"164":{"position":[[458,3]]},"192":{"position":[[1851,5]]},"208":{"position":[[1710,3]]},"220":{"position":[[354,5]]},"234":{"position":[[1440,6]]},"238":{"position":[[344,6]]},"251":{"position":[[871,3],[1513,6],[2303,3],[2626,3],[4252,3]]},"301":{"position":[[45,3]]},"303":{"position":[[565,3],[717,5],[798,5],[1354,3]]},"329":{"position":[[1602,5]]},"348":{"position":[[1143,3],[1759,3],[2356,3]]},"350":{"position":[[1880,3]]},"353":{"position":[[20,3],[571,3],[742,3]]},"372":{"position":[[899,5],[1366,3]]}}}],["trigger",{"_index":2249,"t":{"376":{"position":[[888,9]]},"444":{"position":[[414,7]]}}}],["trivial",{"_index":1971,"t":{"335":{"position":[[63,9]]}}}],["troubleshoot",{"_index":361,"t":{"16":{"position":[[191,15],[356,15]]},"98":{"position":[[3067,16]]},"208":{"position":[[225,15]]},"372":{"position":[[1340,16]]},"390":{"position":[[2161,15]]}}}],["true",{"_index":116,"t":{"4":{"position":[[2579,5],[4436,5],[4702,5]]},"16":{"position":[[483,5]]},"18":{"position":[[380,4]]},"33":{"position":[[1152,4]]},"41":{"position":[[486,5],[836,5]]},"45":{"position":[[307,5],[618,5]]},"49":{"position":[[231,5],[492,5]]},"84":{"position":[[724,4],[828,4]]},"86":{"position":[[1389,4],[1493,4]]},"88":{"position":[[254,4],[302,6],[411,5],[522,5],[695,5],[806,5]]},"94":{"position":[[188,5],[491,5]]},"98":{"position":[[2101,4],[3570,4]]},"100":{"position":[[181,6]]},"102":{"position":[[1333,5]]},"104":{"position":[[157,5],[354,5]]},"110":{"position":[[362,5],[597,5]]},"116":{"position":[[285,5],[542,5]]},"124":{"position":[[364,5],[550,5]]},"128":{"position":[[326,5],[676,5]]},"130":{"position":[[1151,4],[2184,5],[2646,5],[2822,5],[3266,5]]},"138":{"position":[[441,5],[628,5]]},"142":{"position":[[345,5],[656,5]]},"146":{"position":[[325,5],[586,5]]},"154":{"position":[[114,5],[367,5]]},"158":{"position":[[171,5],[437,5]]},"162":{"position":[[411,5],[639,5]]},"166":{"position":[[235,5],[485,5]]},"168":{"position":[[2305,5],[2632,5],[2853,5],[3180,5]]},"178":{"position":[[282,5],[634,5]]},"182":{"position":[[250,5],[542,5]]},"192":{"position":[[1620,5],[1912,5],[2384,5],[2442,4]]},"194":{"position":[[172,5],[389,5]]},"202":{"position":[[102,6]]},"206":{"position":[[194,5],[389,5]]},"208":{"position":[[1055,5],[1183,5],[1200,4],[2602,5],[2773,5],[2790,4],[3831,5],[4076,5],[4093,4]]},"210":{"position":[[422,5],[617,4],[779,5],[974,4]]},"216":{"position":[[413,5]]},"224":{"position":[[391,5],[457,5],[518,5],[596,5]]},"226":{"position":[[850,4]]},"228":{"position":[[344,4]]},"230":{"position":[[133,4],[461,4]]},"234":{"position":[[1227,4]]},"238":{"position":[[131,4]]},"243":{"position":[[374,4]]},"245":{"position":[[354,4],[410,4]]},"247":{"position":[[806,4]]},"251":{"position":[[761,4],[2704,6],[5908,4]]},"256":{"position":[[1902,4],[1974,4]]},"258":{"position":[[1081,5]]},"265":{"position":[[614,4]]},"274":{"position":[[768,4]]},"303":{"position":[[1057,5],[1068,4]]},"305":{"position":[[335,4],[446,5]]},"329":{"position":[[532,4],[2163,4],[2265,4],[2594,4]]},"342":{"position":[[826,5],[1015,5]]},"348":{"position":[[562,6],[1388,5],[1830,5],[2480,5]]},"353":{"position":[[629,5]]},"390":{"position":[[1603,4],[2438,5],[2457,4]]}}}],["trust",{"_index":694,"t":{"65":{"position":[[462,5]]},"160":{"position":[[1429,8]]},"176":{"position":[[3786,8]]},"390":{"position":[[308,7]]}}}],["truth",{"_index":619,"t":{"51":{"position":[[1555,6]]},"76":{"position":[[555,6]]},"350":{"position":[[69,5]]},"355":{"position":[[627,5]]},"390":{"position":[[130,6],[618,6],[778,5]]}}}],["ts",{"_index":1967,"t":{"331":{"position":[[715,2]]},"342":{"position":[[518,2]]},"346":{"position":[[438,2]]}}}],["ts/j",{"_index":2067,"t":{"346":{"position":[[474,5]]}}}],["tuhe1cphrxi",{"_index":2281,"t":{"390":{"position":[[1779,13]]}}}],["tune",{"_index":1923,"t":{"327":{"position":[[405,4]]}}}],["tunein",{"_index":1147,"t":{"148":{"position":[[137,7]]}}}],["turn",{"_index":356,"t":{"16":{"position":[[0,7],[381,4]]},"98":{"position":[[3288,4]]},"192":{"position":[[2255,4],[2326,6]]},"267":{"position":[[159,7]]},"372":{"position":[[1414,4],[1444,4]]},"388":{"position":[[26,4]]},"390":{"position":[[1420,4],[2192,4],[2312,4]]}}}],["tutori",{"_index":1969,"t":{"333":{"position":[[23,8],[55,8]]}}}],["tv",{"_index":1014,"t":{"100":{"position":[[357,2]]},"208":{"position":[[4855,2]]}}}],["twice",{"_index":2273,"t":{"390":{"position":[[1019,5]]}}}],["two",{"_index":793,"t":{"76":{"position":[[67,3]]},"82":{"position":[[52,3]]},"249":{"position":[[228,3]]},"251":{"position":[[1706,3]]},"297":{"position":[[188,3],[575,3],[639,4]]},"325":{"position":[[183,3]]},"329":{"position":[[2011,3]]},"390":{"position":[[942,3],[2946,3]]}}}],["two/anoth",{"_index":1859,"t":{"297":{"position":[[473,11]]}}}],["twog",{"_index":681,"t":{"63":{"position":[[944,5],[1195,5]]},"190":{"position":[[944,5],[1153,5],[1383,5],[1848,5],[2163,5]]}}}],["type",{"_index":19,"t":{"4":{"position":[[195,6],[1488,4],[1959,5],[2325,4],[2406,4],[3171,4],[4407,7],[4674,7],[4847,7],[4980,7]]},"6":{"position":[[22,5],[335,5]]},"14":{"position":[[936,4],[1689,4],[2312,4],[2500,4],[2813,4],[3663,4]]},"22":{"position":[[330,5],[447,7],[552,7],[606,7],[823,7],[1176,7],[1556,7]]},"24":{"position":[[348,4]]},"37":{"position":[[24,4],[224,4],[497,4],[710,7]]},"41":{"position":[[24,4],[422,4],[755,4],[1027,7]]},"45":{"position":[[24,4],[239,4],[539,4],[772,7]]},"47":{"position":[[562,4]]},"49":{"position":[[24,4],[166,4],[410,4],[593,7]]},"51":{"position":[[386,4],[802,4]]},"56":{"position":[[443,4],[676,4],[926,4],[1114,7]]},"58":{"position":[[468,4],[884,4]]},"63":{"position":[[581,4],[813,4],[1047,4],[1220,7]]},"67":{"position":[[925,7],[1181,7],[1427,7],[1686,7],[1856,7],[2152,7],[2384,7],[2652,7],[2823,7],[3050,7],[3178,7],[3296,7],[3414,7],[3532,7]]},"69":{"position":[[40,6]]},"76":{"position":[[412,5]]},"80":{"position":[[586,5]]},"88":{"position":[[380,7],[664,7]]},"94":{"position":[[655,7]]},"98":{"position":[[1609,4],[1690,4],[1864,4],[1994,5],[2038,4],[2195,5],[2311,7],[2571,5],[2638,4],[2843,7],[2974,4],[3502,7]]},"100":{"position":[[1039,7]]},"104":{"position":[[409,7]]},"110":{"position":[[24,4],[300,4],[522,4],[679,7]]},"116":{"position":[[24,4],[231,4],[469,4],[648,7]]},"118":{"position":[[411,4],[643,4],[916,4],[1129,7]]},"124":{"position":[[24,4],[304,4],[478,4],[586,7]]},"128":{"position":[[24,4],[262,4],[595,4],[867,7]]},"130":{"position":[[950,5],[3303,7]]},"138":{"position":[[24,4],[383,4],[557,4],[666,7]]},"142":{"position":[[24,4],[277,4],[577,4],[810,7]]},"146":{"position":[[24,4],[260,4],[504,4],[687,7]]},"154":{"position":[[24,4],[56,4],[292,4],[467,7]]},"158":{"position":[[24,4],[136,4],[382,4],[570,7]]},"162":{"position":[[24,4],[356,4],[566,4],[716,7]]},"166":{"position":[[24,4],[173,4],[204,7],[409,4],[454,7]]},"168":{"position":[[1570,4],[2248,4],[2777,4],[3247,7]]},"174":{"position":[[213,4],[451,4],[701,4],[889,7]]},"178":{"position":[[24,4],[222,4],[558,4],[832,7]]},"182":{"position":[[24,4],[188,4],[465,4],[679,7]]},"190":{"position":[[1473,4],[1711,4],[2009,4],[2246,7]]},"192":{"position":[[625,6]]},"194":{"position":[[24,4],[137,4],[334,4],[473,7]]},"202":{"position":[[24,4],[347,4],[557,4],[700,7]]},"206":{"position":[[24,4],[133,4],[314,4],[431,7]]},"208":{"position":[[1026,7],[2200,4],[2573,7],[3802,7]]},"210":{"position":[[24,4],[362,4],[703,4],[982,7]]},"220":{"position":[[571,4],[657,7]]},"222":{"position":[[129,4],[138,4],[510,7],[887,7],[1013,4],[1160,7],[1280,7],[1568,7],[1746,7],[1995,7],[2372,7]]},"224":{"position":[[177,7]]},"226":{"position":[[1064,7],[1107,7],[1379,7],[1467,7]]},"228":{"position":[[1295,7],[1577,7]]},"241":{"position":[[246,7],[815,7]]},"243":{"position":[[166,7]]},"245":{"position":[[127,7]]},"251":{"position":[[195,5],[312,5]]},"256":{"position":[[744,4],[846,4]]},"263":{"position":[[216,6]]},"265":{"position":[[494,7]]},"267":{"position":[[691,7]]},"270":{"position":[[66,7],[313,7]]},"272":{"position":[[154,7],[585,7]]},"274":{"position":[[343,7],[648,7]]},"276":{"position":[[251,7],[807,7],[895,7]]},"278":{"position":[[389,4]]},"280":{"position":[[219,7],[709,7]]},"284":{"position":[[175,7]]},"305":{"position":[[128,7]]},"307":{"position":[[377,7]]},"312":{"position":[[66,7],[443,7]]},"314":{"position":[[66,7],[342,7]]},"316":{"position":[[375,7]]},"340":{"position":[[1131,5],[1462,4],[1542,4],[1648,4],[1748,4]]},"342":{"position":[[426,4],[503,4]]},"344":{"position":[[173,4],[875,5],[1104,4],[1253,6]]},"355":{"position":[[633,4]]},"386":{"position":[[83,4],[129,4],[222,4],[300,4],[369,4]]},"390":{"position":[[1526,7],[2361,7]]},"392":{"position":[[88,6]]},"400":{"position":[[933,7],[1137,7]]},"418":{"position":[[1947,7]]},"422":{"position":[[1164,7]]}}}],["type=simpl",{"_index":2390,"t":{"406":{"position":[[307,11]]}}}],["typeof",{"_index":2087,"t":{"348":{"position":[[888,7],[1037,7]]}}}],["typescript",{"_index":1890,"t":{"319":{"position":[[39,11]]},"325":{"position":[[194,10]]}}}],["tz",{"_index":2324,"t":{"394":{"position":[[495,2],[3075,2]]},"396":{"position":[[1076,2]]},"414":{"position":[[274,2]]}}}],["tz=etc/gmt",{"_index":2322,"t":{"394":{"position":[[460,10]]},"396":{"position":[[1041,10]]},"414":{"position":[[239,10]]}}}],["u",{"_index":2210,"t":{"368":{"position":[[111,1]]},"394":{"position":[[3482,1]]}}}],["ua",{"_index":2217,"t":{"372":{"position":[[526,4],[737,4],[1049,4]]}}}],["ubuntu",{"_index":1222,"t":{"162":{"position":[[391,9],[619,9]]},"404":{"position":[[91,7]]}}}],["ui",{"_index":475,"t":{"33":{"position":[[676,2]]},"130":{"position":[[105,2]]},"168":{"position":[[346,2]]},"350":{"position":[[2207,2]]},"394":{"position":[[1500,2]]},"400":{"position":[[1277,2]]},"416":{"position":[[379,2]]}}}],["uid",{"_index":1212,"t":{"160":{"position":[[1567,3]]},"394":{"position":[[3409,3],[3494,3]]}}}],["uid/gid",{"_index":2349,"t":{"396":{"position":[[310,7]]}}}],["ultim",{"_index":1047,"t":{"108":{"position":[[91,10]]},"114":{"position":[[89,10]]},"148":{"position":[[446,10]]}}}],["un",{"_index":306,"t":{"14":{"position":[[350,2]]}}}],["unabl",{"_index":450,"t":{"31":{"position":[[22,6]]}}}],["unauthent",{"_index":1977,"t":{"337":{"position":[[208,15]]}}}],["unavoid",{"_index":1457,"t":{"208":{"position":[[1959,11]]}}}],["uncaught",{"_index":2253,"t":{"379":{"position":[[184,8]]}}}],["uncom",{"_index":562,"t":{"47":{"position":[[183,9]]},"251":{"position":[[673,9]]},"424":{"position":[[367,9]]}}}],["uncomment/cr",{"_index":1177,"t":{"156":{"position":[[69,16]]}}}],["unconstrain",{"_index":1758,"t":{"251":{"position":[[5046,13]]}}}],["uncorrect",{"_index":1821,"t":{"263":{"position":[[492,11]]}}}],["undefin",{"_index":2047,"t":{"344":{"position":[[846,11]]},"348":{"position":[[790,10],[875,9],[1024,9],[1746,10]]},"390":{"position":[[1824,9],[2097,9]]}}}],["under",{"_index":394,"t":{"22":{"position":[[239,5]]},"80":{"position":[[569,5]]},"92":{"position":[[438,5]]},"164":{"position":[[337,5]]},"180":{"position":[[275,6]]},"196":{"position":[[82,5]]},"208":{"position":[[2009,5]]},"390":{"position":[[1499,5]]},"406":{"position":[[46,5]]}}}],["undesir",{"_index":1761,"t":{"251":{"position":[[5253,10]]}}}],["undocu",{"_index":2258,"t":{"384":{"position":[[376,13]]}}}],["unexpect",{"_index":1760,"t":{"251":{"position":[[5238,10]]},"329":{"position":[[2646,10],[2798,10]]}}}],["unfortun",{"_index":2263,"t":{"390":{"position":[[200,14]]}}}],["uniqu",{"_index":1530,"t":{"214":{"position":[[300,6],[681,6]]},"220":{"position":[[73,6]]},"222":{"position":[[159,6]]}}}],["unit",{"_index":2387,"t":{"406":{"position":[[241,6]]}}}],["unix",{"_index":1197,"t":{"160":{"position":[[654,4],[786,4],[944,4],[1282,4],[1637,4]]}}}],["unknown",{"_index":988,"t":{"98":{"position":[[1896,8],[1980,7],[2014,7],[2181,7],[2357,7]]},"130":{"position":[[1123,7]]},"190":{"position":[[510,8],[1240,7],[1431,11]]},"372":{"position":[[1096,7]]},"376":{"position":[[901,7]]},"386":{"position":[[206,9],[286,7]]}}}],["unless",{"_index":1208,"t":{"160":{"position":[[1370,6]]},"176":{"position":[[1123,6]]},"247":{"position":[[1956,6]]},"309":{"position":[[1073,6]]},"355":{"position":[[3845,6]]},"394":{"position":[[1523,6]]},"396":{"position":[[1453,6]]},"414":{"position":[[517,6]]}}}],["unlik",{"_index":1489,"t":{"208":{"position":[[4795,8]]}}}],["unmatch",{"_index":242,"t":{"8":{"position":[[1648,10]]}}}],["unnam",{"_index":2049,"t":{"344":{"position":[[901,10]]}}}],["unoffici",{"_index":881,"t":{"90":{"position":[[25,10]]},"208":{"position":[[39,10],[265,11]]},"390":{"position":[[485,10]]}}}],["unseen",{"_index":2149,"t":{"355":{"position":[[1044,6]]}}}],["unsupport",{"_index":983,"t":{"98":{"position":[[1487,11]]},"402":{"position":[[0,11]]}}}],["unsur",{"_index":1335,"t":{"190":{"position":[[530,6]]}}}],["untest",{"_index":1389,"t":{"196":{"position":[[500,8]]}}}],["unus",{"_index":378,"t":{"18":{"position":[[224,8]]}}}],["uosrpjt3u5dhaaup3x",{"_index":930,"t":{"96":{"position":[[332,24]]}}}],["uosrpjt3u5dhaaup3xq30dwfosgqugdsyzl3qe743waavy2eur2ckyjcz4rv123q3psbkxklwa6ahc9xmefev6btfsp8luje3jswwrqogzcduowvzwo5saig",{"_index":919,"t":{"94":{"position":[[226,123],[529,122]]}}}],["up",{"_index":312,"t":{"14":{"position":[[725,2],[1482,2],[1966,2]]},"31":{"position":[[174,3]]},"47":{"position":[[319,2]]},"51":{"position":[[1735,2]]},"208":{"position":[[1656,2]]},"212":{"position":[[256,3]]},"220":{"position":[[18,2]]},"234":{"position":[[1627,2]]},"258":{"position":[[657,2]]},"329":{"position":[[769,2]]},"353":{"position":[[67,2]]},"376":{"position":[[732,2]]},"410":{"position":[[48,2]]},"412":{"position":[[24,2]]},"416":{"position":[[195,2]]},"424":{"position":[[503,2]]},"426":{"position":[[245,2],[371,3]]},"428":{"position":[[311,2]]},"432":{"position":[[8,2]]},"455":{"position":[[299,2]]}}}],["up/logn",{"_index":634,"t":{"53":{"position":[[141,7]]}}}],["updat",{"_index":849,"t":{"86":{"position":[[284,7]]},"192":{"position":[[188,7]]},"274":{"position":[[268,8],[781,6]]},"394":{"position":[[1763,8]]},"453":{"position":[[126,9],[321,6]]},"457":{"position":[[74,6]]}}}],["upgrad",{"_index":2466,"t":{"453":{"position":[[431,10]]}}}],["upper",{"_index":568,"t":{"47":{"position":[[361,5]]},"424":{"position":[[545,5]]}}}],["upstream",{"_index":1449,"t":{"208":{"position":[[1463,8]]},"355":{"position":[[1067,8],[1263,8],[1346,8]]}}}],["upstreamerror",{"_index":2098,"t":{"348":{"position":[[1552,13],[2190,13]]}}}],["uri",{"_index":1161,"t":{"150":{"position":[[244,3],[465,3]]},"176":{"position":[[800,3],[852,3],[880,3],[1097,4],[1281,3],[1494,4],[1664,3],[2124,3],[2818,3],[3988,3],[4167,3]]},"178":{"position":[[185,3]]},"208":{"position":[[2316,4],[2950,4],[3042,3],[3219,4],[3371,3],[3451,3],[3759,4],[4141,4]]},"210":{"position":[[276,3]]},"394":{"position":[[935,3],[2508,4]]},"416":{"position":[[626,4],[746,3]]}}}],["uriblacklist",{"_index":1159,"t":{"150":{"position":[[117,12],[352,15]]},"154":{"position":[[150,15],[403,15]]}}}],["uriwhitelist",{"_index":1160,"t":{"150":{"position":[[133,12]]},"154":{"position":[[170,15],[423,15]]}}}],["url",{"_index":162,"t":{"4":{"position":[[4738,6],[4865,6],[5033,6]]},"12":{"position":[[12,3],[58,4],[439,4],[495,3],[616,3],[850,3]]},"22":{"position":[[465,6],[880,6],[1229,6],[1652,7]]},"24":{"position":[[216,3]]},"35":{"position":[[492,3],[508,3],[563,3],[719,3],[733,3],[808,3],[861,4],[881,3],[909,3],[973,3],[1013,3],[1038,3]]},"37":{"position":[[187,3],[381,6],[672,6]]},"39":{"position":[[256,3],[429,4]]},"41":{"position":[[246,3]]},"45":{"position":[[205,3],[420,6],[731,6]]},"47":{"position":[[525,3]]},"49":{"position":[[102,3],[272,6],[533,6]]},"58":{"position":[[1624,4]]},"67":{"position":[[1792,6],[1962,6],[2319,6],[2522,6],[2777,6],[3228,6],[3346,6],[3464,6]]},"69":{"position":[[639,6],[793,6],[953,6],[1077,6],[1622,6],[1722,6],[1822,6]]},"86":{"position":[[337,4],[346,3],[524,3],[594,3],[708,3]]},"88":{"position":[[87,3],[444,6],[728,6]]},"102":{"position":[[978,3],[999,3],[1017,3],[1190,3],[1349,6]]},"104":{"position":[[90,3],[173,6],[370,6]]},"108":{"position":[[4,3],[62,4],[71,3],[239,3],[337,3],[606,3],[649,3],[687,3],[738,3],[754,3]]},"110":{"position":[[132,3],[378,6],[613,6]]},"114":{"position":[[4,3],[60,4],[69,3],[235,3],[333,3],[598,3],[641,3],[679,3],[728,3],[744,3]]},"116":{"position":[[128,3],[301,6],[558,6]]},"118":{"position":[[800,6],[1091,6]]},"122":{"position":[[314,3]]},"124":{"position":[[246,3]]},"130":{"position":[[1285,3],[2215,6],[2853,6]]},"134":{"position":[[359,3],[629,3],[765,4]]},"138":{"position":[[326,3]]},"142":{"position":[[458,6],[769,6]]},"146":{"position":[[366,6],[627,6]]},"148":{"position":[[339,4],[348,3],[417,4],[426,3],[592,3],[690,3],[907,3],[950,3],[988,3],[1039,3],[1055,3]]},"154":{"position":[[130,6],[383,6]]},"158":{"position":[[204,6],[470,6]]},"164":{"position":[[210,3],[428,3]]},"166":{"position":[[272,6],[522,6]]},"168":{"position":[[42,3],[1645,3],[2353,6],[2901,6]]},"176":{"position":[[891,3],[976,3],[2423,3],[3086,3],[3148,4],[3237,3],[3328,3],[3696,3]]},"182":{"position":[[144,3],[266,6],[558,6]]},"194":{"position":[[205,6],[422,6]]},"196":{"position":[[113,4],[380,3],[473,3]]},"198":{"position":[[107,4],[380,3],[462,3]]},"204":{"position":[[284,4],[458,3],[536,3],[552,3]]},"206":{"position":[[117,3],[210,6],[405,6]]},"208":{"position":[[3236,3],[3321,3],[3478,3],[3728,3],[5240,3]]},"222":{"position":[[411,4]]},"241":{"position":[[121,4],[575,3],[598,3],[639,3],[1030,6]]},"327":{"position":[[316,5]]},"329":{"position":[[1092,3],[1170,3],[2353,3]]},"331":{"position":[[430,3]]},"348":{"position":[[332,3],[343,6],[428,4],[575,3],[724,4],[1322,4]]},"372":{"position":[[836,3],[921,3],[1616,4],[1625,4]]},"374":{"position":[[89,3],[589,5]]},"394":{"position":[[1396,3],[2440,4],[2670,3]]},"396":{"position":[[220,3]]},"400":{"position":[[1062,6],[1185,6]]},"416":{"position":[[363,3],[2540,3],[3375,4]]},"424":{"position":[[966,4],[1659,3],[1675,3],[1730,3],[1897,3]]},"444":{"position":[[300,3]]}}}],["url(norm",{"_index":2081,"t":{"348":{"position":[[585,12]]}}}],["url.pathnam",{"_index":2083,"t":{"348":{"position":[[666,13],[691,12]]}}}],["url.port",{"_index":2082,"t":{"348":{"position":[[601,9],[623,8],[642,8]]}}}],["url/cod",{"_index":1490,"t":{"208":{"position":[[5017,8]]}}}],["us",{"_index":7,"t":{"4":{"position":[[35,6],[448,3],[1409,3],[1885,5],[2043,4],[2178,4],[2245,5],[3093,3],[3803,4],[3870,5]]},"6":{"position":[[313,5]]},"8":{"position":[[5,5],[128,5],[941,4],[1314,4],[1763,3],[1806,4],[1831,3],[1882,3],[1901,4]]},"12":{"position":[[24,4],[292,3],[353,3],[363,6]]},"14":{"position":[[452,3],[766,3],[944,3],[1209,3],[1523,3],[1697,3],[1863,4],[2147,3],[2320,3],[2514,5],[2657,5],[2821,3],[3352,3],[3452,4],[3671,3]]},"16":{"position":[[127,3],[182,4]]},"18":{"position":[[285,5],[339,3]]},"24":{"position":[[331,3]]},"33":{"position":[[239,4],[342,5],[970,5]]},"35":{"position":[[6,4],[281,3],[315,5],[444,5],[516,3],[723,5],[812,4]]},"39":{"position":[[342,3]]},"41":{"position":[[253,3]]},"43":{"position":[[374,3]]},"47":{"position":[[82,5],[581,4]]},"51":{"position":[[6,4],[1194,5]]},"53":{"position":[[35,3],[149,5]]},"56":{"position":[[11,4],[179,3]]},"58":{"position":[[6,4],[1268,5],[1439,3],[1524,3],[1575,3]]},"63":{"position":[[23,4],[164,5],[271,3]]},"65":{"position":[[553,4]]},"67":{"position":[[1329,4]]},"76":{"position":[[277,3]]},"80":{"position":[[49,3],[454,5],[612,3]]},"82":{"position":[[40,4],[662,5]]},"86":{"position":[[147,5],[251,3],[350,4],[556,3],[730,4]]},"90":{"position":[[20,4],[191,3]]},"92":{"position":[[40,4],[94,4],[225,3]]},"98":{"position":[[36,5],[236,5],[778,5],[837,5],[2230,5],[2585,6],[3410,5]]},"102":{"position":[[53,3],[218,3],[668,3],[951,5],[1031,3],[1136,3],[1607,3]]},"106":{"position":[[175,3]]},"108":{"position":[[8,4],[75,4],[275,3],[569,5],[712,3]]},"114":{"position":[[8,4],[73,4],[271,3],[561,5],[704,3]]},"118":{"position":[[125,4],[432,3],[532,4],[576,3]]},"120":{"position":[[119,4]]},"122":{"position":[[183,3],[265,3],[300,4]]},"124":{"position":[[104,3],[260,3]]},"126":{"position":[[110,4],[299,3]]},"128":{"position":[[45,3],[149,4],[193,3]]},"130":{"position":[[8,5],[320,3],[368,3],[902,3],[1131,3],[1427,3]]},"132":{"position":[[124,4]]},"134":{"position":[[238,3],[493,3],[580,3],[615,4],[811,3]]},"136":{"position":[[149,3]]},"138":{"position":[[103,3],[340,3]]},"140":{"position":[[132,4],[474,3]]},"142":{"position":[[45,3],[159,4],[203,3]]},"144":{"position":[[6,4]]},"146":{"position":[[45,3],[147,4],[191,3]]},"148":{"position":[[352,4],[430,4],[628,3],[1013,3]]},"150":{"position":[[111,5],[276,4]]},"152":{"position":[[94,3],[167,5]]},"156":{"position":[[25,5]]},"160":{"position":[[1438,3]]},"162":{"position":[[98,3],[120,7]]},"164":{"position":[[12,3],[214,4],[465,3]]},"166":{"position":[[112,3]]},"168":{"position":[[55,4],[435,3],[1727,3]]},"170":{"position":[[6,4]]},"174":{"position":[[234,3],[338,4],[382,3]]},"176":{"position":[[75,4],[807,3],[1220,3],[1404,3],[1856,3],[2065,3],[2333,3],[2601,5],[3659,3],[3846,5],[3876,3]]},"180":{"position":[[19,4],[233,5],[270,4],[402,5],[607,3]]},"184":{"position":[[6,4]]},"190":{"position":[[51,4],[327,4],[484,5],[561,4],[608,3],[1494,3],[1598,4],[1642,3]]},"192":{"position":[[25,5],[673,4],[1176,5],[1334,3],[1529,5],[2156,4],[2211,3]]},"196":{"position":[[597,3]]},"198":{"position":[[18,3],[72,5],[126,5],[353,3],[435,3]]},"200":{"position":[[81,3]]},"204":{"position":[[213,5],[528,4]]},"208":{"position":[[543,5],[580,3],[1572,5],[1717,3],[1914,3],[2882,3],[3385,3],[3427,5],[4748,5],[4917,5],[5135,5]]},"216":{"position":[[336,4]]},"218":{"position":[[665,5],[976,3],[1001,5],[1272,3]]},"220":{"position":[[255,4]]},"222":{"position":[[34,5],[206,4],[295,4],[614,4],[693,4],[935,4],[1349,4],[2099,4],[2178,4]]},"224":{"position":[[785,3],[1026,5],[1169,4]]},"228":{"position":[[235,4],[1488,3]]},"230":{"position":[[117,3],[244,5]]},"234":{"position":[[131,4],[222,6],[1517,5]]},"241":{"position":[[76,5],[571,3],[631,4],[913,4]]},"245":{"position":[[83,4]]},"247":{"position":[[89,5],[271,3],[511,5],[847,3],[1035,4],[1222,3],[1308,5]]},"249":{"position":[[261,5]]},"251":{"position":[[331,6],[920,4],[1103,5],[2218,5],[2486,5],[2651,5],[3177,4],[3249,5],[3426,3],[3824,4],[4169,4],[4563,4],[5378,4]]},"256":{"position":[[154,3],[349,3],[423,4],[1044,4],[1188,4],[1211,5]]},"258":{"position":[[63,4],[539,4],[623,5],[691,4]]},"261":{"position":[[40,4],[382,3]]},"263":{"position":[[5,5]]},"265":{"position":[[0,3],[249,5]]},"267":{"position":[[59,5]]},"272":{"position":[[0,5]]},"274":{"position":[[217,3]]},"276":{"position":[[112,4]]},"278":{"position":[[15,4],[126,6]]},"280":{"position":[[32,5],[148,5],[508,4],[780,4]]},"282":{"position":[[372,6],[912,4],[960,3]]},"287":{"position":[[0,5]]},"297":{"position":[[370,3]]},"301":{"position":[[17,4],[116,6],[284,5],[585,5]]},"303":{"position":[[319,3],[557,4],[953,4]]},"305":{"position":[[83,4]]},"307":{"position":[[121,5],[176,4],[452,4]]},"309":{"position":[[58,5],[107,3],[290,4],[476,3],[557,5]]},"312":{"position":[[170,4],[249,4]]},"316":{"position":[[213,3]]},"319":{"position":[[213,5]]},"321":{"position":[[133,3],[336,3]]},"323":{"position":[[219,6],[270,3],[332,4]]},"327":{"position":[[392,4]]},"329":{"position":[[812,4],[1439,4]]},"331":{"position":[[49,4],[296,6],[515,3]]},"335":{"position":[[186,4],[198,5]]},"337":{"position":[[1018,4]]},"340":{"position":[[54,5],[123,5],[1052,5]]},"342":{"position":[[409,4]]},"346":{"position":[[45,4],[496,3]]},"350":{"position":[[997,3],[1266,5],[3070,4]]},"355":{"position":[[1562,3],[1810,4],[2518,5],[3794,5],[3838,3],[3893,5]]},"361":{"position":[[32,3]]},"364":{"position":[[150,4],[415,4],[469,3]]},"366":{"position":[[14,3],[113,3],[720,3]]},"368":{"position":[[45,5],[80,5]]},"372":{"position":[[109,5],[1894,3],[2005,3]]},"374":{"position":[[148,3],[542,3]]},"376":{"position":[[218,5],[316,5],[385,5],[421,5],[487,5],[549,5],[594,4],[634,5]]},"384":{"position":[[171,3]]},"390":{"position":[[478,3],[1405,6],[2657,5]]},"394":{"position":[[236,3],[899,5],[1326,3],[1802,5],[1895,5],[2022,5],[2142,3],[2462,5],[2554,5],[2630,4],[2731,3],[3042,5],[3349,5]]},"396":{"position":[[211,3]]},"400":{"position":[[157,3],[481,3],[1333,5]]},"404":{"position":[[46,4]]},"412":{"position":[[60,5]]},"416":{"position":[[706,4],[1234,3],[1351,5],[1382,3],[1771,3],[2167,5],[2553,4],[3160,3],[3344,3],[3576,4],[4131,3]]},"418":{"position":[[20,3],[357,3],[590,3]]},"420":{"position":[[90,3],[323,3]]},"424":{"position":[[266,5],[935,3],[1036,3],[1452,3],[1486,5],[1615,5],[1683,3],[1904,3]]},"428":{"position":[[166,5]]},"430":{"position":[[706,5],[1166,5],[1252,3],[1517,4],[2149,3],[2393,3]]},"453":{"position":[[495,5]]},"455":{"position":[[226,4]]},"457":{"position":[[28,4]]}}}],["usag",{"_index":629,"t":{"53":{"position":[[53,5]]},"67":{"position":[[1673,5]]},"192":{"position":[[1543,5]]},"222":{"position":[[1895,5]]},"224":{"position":[[800,5]]},"327":{"position":[[414,5]]},"394":{"position":[[1599,6]]},"400":{"position":[[698,5]]},"412":{"position":[[591,5],[626,5]]}}}],["user",{"_index":524,"t":{"39":{"position":[[6,5]]},"43":{"position":[[6,5],[360,4]]},"45":{"position":[[95,4]]},"56":{"position":[[264,6]]},"63":{"position":[[359,6]]},"67":{"position":[[1341,5],[2053,4],[2069,5],[2554,7],[2733,7]]},"69":{"position":[[1109,7]]},"76":{"position":[[734,6]]},"78":{"position":[[26,4],[197,6]]},"84":{"position":[[174,4],[308,4]]},"130":{"position":[[590,4],[631,5],[732,6],[1359,4],[1532,4],[2247,7],[2885,7]]},"140":{"position":[[460,4]]},"160":{"position":[[926,4],[1557,4]]},"168":{"position":[[102,5],[175,5],[197,4],[250,4],[265,4],[429,5],[616,4],[635,4],[790,4],[805,4],[849,5],[926,4],[992,4],[1011,4],[1054,4],[1104,4],[1238,4],[1282,4],[1310,4]]},"180":{"position":[[719,6]]},"182":{"position":[[307,7],[599,7]]},"208":{"position":[[1512,6],[2112,4]]},"220":{"position":[[155,4],[175,4]]},"232":{"position":[[68,4]]},"234":{"position":[[774,5]]},"236":{"position":[[171,5]]},"241":{"position":[[49,5],[84,4]]},"278":{"position":[[4,4],[378,4],[397,5]]},"280":{"position":[[227,7],[406,4],[717,7],[761,4]]},"284":{"position":[[183,7]]},"329":{"position":[[829,4],[1140,4],[1298,4],[2273,4],[2322,4],[2717,4]]},"337":{"position":[[350,4]]},"340":{"position":[[592,4],[672,4],[1099,5]]},"342":{"position":[[856,4]]},"348":{"position":[[207,5],[1963,4]]},"355":{"position":[[3143,4]]},"366":{"position":[[1024,4]]},"368":{"position":[[26,4]]},"376":{"position":[[296,5]]},"394":{"position":[[3230,4],[3437,4]]},"400":{"position":[[1098,7]]},"404":{"position":[[159,4]]},"408":{"position":[[60,4],[108,4],[206,4]]},"416":{"position":[[2439,4],[2838,5],[2958,4]]},"430":{"position":[[855,5]]}}}],["user/password",{"_index":1958,"t":{"329":{"position":[[3105,13],[3353,13]]}}}],["user:group",{"_index":2342,"t":{"394":{"position":[[3200,10]]}}}],["usera",{"_index":1396,"t":{"198":{"position":[[252,7]]}}}],["userb",{"_index":1399,"t":{"198":{"position":[[336,7]]}}}],["usernam",{"_index":183,"t":{"4":{"position":[[5099,11]]},"22":{"position":[[1294,11]]},"35":{"position":[[435,8]]},"37":{"position":[[156,8],[360,11],[651,11]]},"45":{"position":[[147,8],[398,11],[709,11]]},"106":{"position":[[282,8]]},"110":{"position":[[210,8],[396,11],[631,11]]},"112":{"position":[[215,8]]},"116":{"position":[[172,8],[341,11],[598,11]]},"118":{"position":[[779,11],[1070,11]]},"130":{"position":[[382,8],[491,8],[1647,9],[1737,9]]},"142":{"position":[[436,11],[747,11]]},"168":{"position":[[1788,9],[1870,9]]},"222":{"position":[[416,9]]},"416":{"position":[[492,8]]},"424":{"position":[[1606,8]]}}}],["usersallow",{"_index":733,"t":{"67":{"position":[[1822,13],[1992,13],[2618,13]]},"69":{"position":[[669,13],[823,13],[1173,13]]},"130":{"position":[[637,11],[2343,13],[2949,13]]},"168":{"position":[[439,10],[708,10],[855,13],[1120,13],[2390,13],[2938,13]]},"180":{"position":[[624,10]]},"182":{"position":[[355,13],[647,13]]}}}],["usersblock",{"_index":1118,"t":{"130":{"position":[[2385,13],[2994,13]]},"168":{"position":[[2435,13],[2983,13]]}}}],["usual",{"_index":1737,"t":{"251":{"position":[[1047,8]]}}}],["v",{"_index":976,"t":{"98":{"position":[[1313,1],[1344,1]]},"394":{"position":[[1809,1],[1846,1]]},"396":{"position":[[644,1],[799,1]]}}}],["v18.19.1",{"_index":1898,"t":{"321":{"position":[[26,8]]}}}],["valid",{"_index":138,"t":{"4":{"position":[[4003,10]]},"63":{"position":[[69,5]]},"176":{"position":[[1266,5],[1479,5]]},"214":{"position":[[196,5]]},"329":{"position":[[820,8],[1243,8],[1447,8],[2561,6],[2698,5]]},"340":{"position":[[98,5],[1189,5],[1679,5]]},"355":{"position":[[2292,5],[2329,5]]},"379":{"position":[[330,6]]},"416":{"position":[[611,5]]}}}],["valkey",{"_index":313,"t":{"14":{"position":[[728,6],[1485,6],[2118,6],[2398,9],[2601,6],[3022,6],[3069,6],[3107,6],[3260,7],[3495,6],[3646,6],[3824,9]]},"234":{"position":[[1630,6]]}}}],["valkey/valkey",{"_index":344,"t":{"14":{"position":[[3275,13]]}}}],["valkeydata",{"_index":347,"t":{"14":{"position":[[3326,11]]}}}],["valkeydata:/data",{"_index":346,"t":{"14":{"position":[[3300,16]]}}}],["valu",{"_index":210,"t":{"8":{"position":[[421,5],[1279,6],[1432,5]]},"14":{"position":[[834,7],[1591,7],[2215,7]]},"47":{"position":[[488,5]]},"56":{"position":[[412,6]]},"63":{"position":[[550,6]]},"82":{"position":[[254,6],[309,6]]},"84":{"position":[[613,5]]},"86":{"position":[[1278,5]]},"92":{"position":[[107,5],[281,6],[552,5],[757,5],[798,5]]},"94":{"position":[[96,5]]},"108":{"position":[[289,6]]},"114":{"position":[[285,6]]},"130":{"position":[[310,5]]},"136":{"position":[[99,5],[162,5]]},"148":{"position":[[642,6]]},"160":{"position":[[1129,7],[1693,5]]},"180":{"position":[[200,5]]},"190":{"position":[[202,6]]},"192":{"position":[[926,6]]},"208":{"position":[[791,5]]},"210":{"position":[[96,5]]},"224":{"position":[[688,5],[862,5],[917,6]]},"228":{"position":[[210,5],[272,6]]},"251":{"position":[[4188,5]]},"258":{"position":[[111,6]]},"284":{"position":[[399,5]]},"303":{"position":[[1038,6]]},"329":{"position":[[468,5]]},"416":{"position":[[226,6],[823,6],[2602,6]]},"418":{"position":[[443,5],[945,5],[1088,5],[1230,5],[1368,5]]},"420":{"position":[[176,5]]},"422":{"position":[[162,5],[305,5],[447,5],[585,5]]},"424":{"position":[[675,5],[700,6],[1080,6],[1940,6],[1973,6]]}}}],["var/run/avahi",{"_index":978,"t":{"98":{"position":[[1346,14]]}}}],["var/run/dbus:/var/run/dbu",{"_index":977,"t":{"98":{"position":[[1315,27]]}}}],["vari",{"_index":2110,"t":{"350":{"position":[[460,7]]}}}],["variabl",{"_index":10,"t":{"4":{"position":[[62,9],[342,9],[1033,9],[1234,9],[1249,8],[2894,9],[2909,8]]},"8":{"position":[[84,9],[448,8],[726,10],[1188,8],[1567,8],[1739,8]]},"14":{"position":[[864,8],[1621,8],[2245,8],[2741,8],[3588,8]]},"37":{"position":[[43,8]]},"41":{"position":[[43,8]]},"45":{"position":[[43,8]]},"49":{"position":[[43,8]]},"56":{"position":[[462,8]]},"63":{"position":[[600,8]]},"88":{"position":[[27,8]]},"94":{"position":[[27,8]]},"100":{"position":[[122,8]]},"104":{"position":[[27,8]]},"110":{"position":[[43,8]]},"116":{"position":[[43,8]]},"118":{"position":[[440,9]]},"124":{"position":[[43,8]]},"128":{"position":[[53,9]]},"130":{"position":[[1225,8]]},"138":{"position":[[43,8]]},"142":{"position":[[53,9]]},"146":{"position":[[53,9]]},"158":{"position":[[43,8]]},"162":{"position":[[43,8]]},"166":{"position":[[43,8]]},"168":{"position":[[1589,8]]},"174":{"position":[[242,9]]},"178":{"position":[[43,8]]},"182":{"position":[[43,8]]},"190":{"position":[[1502,9]]},"194":{"position":[[43,8]]},"202":{"position":[[43,8]]},"206":{"position":[[43,8]]},"210":{"position":[[43,8]]},"372":{"position":[[1515,8]]},"394":{"position":[[3066,8],[3373,9]]},"400":{"position":[[1362,9]]},"414":{"position":[[420,9]]}}}],["variou",{"_index":1600,"t":{"228":{"position":[[932,8],[975,8]]},"278":{"position":[[284,7]]},"280":{"position":[[316,8]]},"295":{"position":[[33,8]]}}}],["veri",{"_index":35,"t":{"4":{"position":[[547,4]]},"16":{"position":[[262,4]]},"355":{"position":[[3863,4]]}}}],["verifi",{"_index":245,"t":{"8":{"position":[[1694,6],[1854,6]]},"33":{"position":[[656,8]]},"51":{"position":[[1422,10]]},"192":{"position":[[293,6],[492,6]]},"355":{"position":[[3226,8]]}}}],["version",{"_index":813,"t":{"76":{"position":[[1053,7]]},"212":{"position":[[556,8]]},"230":{"position":[[921,8],[976,8]]},"278":{"position":[[250,8]]},"280":{"position":[[290,9]]},"289":{"position":[[26,8],[89,9]]},"321":{"position":[[170,8],[370,7]]},"348":{"position":[[1859,7],[1928,7],[1991,8]]},"400":{"position":[[193,7]]},"453":{"position":[[164,7],[473,7],[550,8]]}}}],["via",{"_index":401,"t":{"22":{"position":[[767,3],[1120,3]]},"33":{"position":[[98,3],[445,3],[665,3]]},"112":{"position":[[188,3]]},"319":{"position":[[313,3]]},"394":{"position":[[1400,3]]},"416":{"position":[[1621,3],[1793,3]]}}}],["view",{"_index":560,"t":{"47":{"position":[[168,4]]},"58":{"position":[[134,7],[1402,4],[1593,4]]},"184":{"position":[[106,7]]},"190":{"position":[[649,4]]},"394":{"position":[[1028,4],[1067,4],[2638,4],[2738,4]]},"412":{"position":[[514,7]]},"424":{"position":[[352,4]]}}}],["violat",{"_index":882,"t":{"90":{"position":[[85,9]]}}}],["visibl",{"_index":2102,"t":{"348":{"position":[[1945,10]]}}}],["visit",{"_index":1306,"t":{"176":{"position":[[4262,5]]},"208":{"position":[[5215,5]]},"329":{"position":[[2336,5]]},"416":{"position":[[1106,5],[3994,5]]},"426":{"position":[[375,5]]},"444":{"position":[[278,8],[355,5]]}}}],["vite",{"_index":2367,"t":{"400":{"position":[[611,7]]}}}],["vitej",{"_index":1896,"t":{"319":{"position":[[284,6]]}}}],["vlc",{"_index":787,"t":{"73":{"position":[[874,3]]},"162":{"position":[[442,6],[670,6]]},"192":{"position":[[21,3],[91,4],[488,3],[650,3],[693,3],[746,3],[791,3],[830,3],[892,3],[1030,3],[1282,3],[1924,3],[1968,3],[2122,3]]},"194":{"position":[[481,5]]},"222":{"position":[[1627,3]]},"388":{"position":[[61,3],[88,3]]},"430":{"position":[[445,3]]}}}],["vlc.json",{"_index":1570,"t":{"222":{"position":[[1644,8]]}}}],["vlc_password",{"_index":1380,"t":{"194":{"position":[[108,12]]}}}],["vlc_url",{"_index":1378,"t":{"194":{"position":[[82,7]]}}}],["vldjjo",{"_index":1610,"t":{"230":{"position":[[731,8]]}}}],["volum",{"_index":345,"t":{"14":{"position":[[3289,8],[3317,8]]},"160":{"position":[[1225,8]]},"247":{"position":[[1896,8]]},"309":{"position":[[1013,8]]},"394":{"position":[[1191,8],[1969,8]]},"396":{"position":[[1393,8]]},"414":{"position":[[457,8]]}}}],["volume/bind",{"_index":308,"t":{"14":{"position":[[549,11],[1306,11]]}}}],["vote",{"_index":1656,"t":{"234":{"position":[[780,6]]},"236":{"position":[[177,6]]}}}],["vpn",{"_index":1392,"t":{"196":{"position":[[678,3]]}}}],["vs",{"_index":1869,"t":{"301":{"position":[[540,3]]},"303":{"position":[[838,3]]}}}],["vscode",{"_index":1907,"t":{"323":{"position":[[65,7],[321,6]]}}}],["vulfpeck",{"_index":2287,"t":{"390":{"position":[[1878,8]]}}}],["w+.com)/i",{"_index":1837,"t":{"282":{"position":[[669,17]]}}}],["wait",{"_index":711,"t":{"67":{"position":[[458,4],[833,4]]},"76":{"position":[[339,5]]},"208":{"position":[[4186,4]]},"372":{"position":[[65,5]]}}}],["want",{"_index":77,"t":{"4":{"position":[[1507,4],[1630,4],[1681,4],[3190,4],[3313,4],[3364,4],[3448,4]]},"8":{"position":[[1874,4]]},"65":{"position":[[14,4],[265,4],[748,4]]},"130":{"position":[[700,4]]},"136":{"position":[[125,5]]},"168":{"position":[[647,4]]},"196":{"position":[[238,5]]},"208":{"position":[[2245,5]]},"224":{"position":[[777,4]]},"234":{"position":[[1563,4]]},"249":{"position":[[68,4]]},"256":{"position":[[341,4],[1740,4]]},"258":{"position":[[500,4]]},"265":{"position":[[127,4]]},"274":{"position":[[14,4],[85,4]]},"316":{"position":[[26,4],[119,4]]},"416":{"position":[[3194,4]]},"418":{"position":[[349,4]]},"420":{"position":[[82,4]]}}}],["wantedby=default.target",{"_index":2395,"t":{"406":{"position":[[416,23]]}}}],["warn",{"_index":147,"t":{"4":{"position":[[4161,7],[4950,7],[5174,7]]},"8":{"position":[[1502,7],[1510,5],[1591,4]]},"18":{"position":[[182,7]]},"22":{"position":[[776,4],[971,7],[1129,4],[1369,7]]},"58":{"position":[[1143,7]]},"90":{"position":[[0,7]]},"160":{"position":[[1295,7]]},"196":{"position":[[509,7]]},"208":{"position":[[0,7],[1346,7],[4740,7]]},"251":{"position":[[5018,7]]},"379":{"position":[[71,4]]}}}],["wax",{"_index":2293,"t":{"390":{"position":[[1982,3]]}}}],["way",{"_index":1036,"t":{"102":{"position":[[1242,3]]},"160":{"position":[[815,3]]},"220":{"position":[[80,3]]},"234":{"position":[[366,3],[1239,3]]},"238":{"position":[[143,3]]},"251":{"position":[[1420,4]]},"256":{"position":[[263,3]]},"329":{"position":[[2931,3]]},"376":{"position":[[777,3]]},"390":{"position":[[673,3]]},"418":{"position":[[397,3]]},"420":{"position":[[130,3]]},"430":{"position":[[2266,3]]}}}],["web",{"_index":376,"t":{"18":{"position":[[146,3]]},"58":{"position":[[130,3]]},"84":{"position":[[403,3]]},"86":{"position":[[1087,3]]},"106":{"position":[[70,3]]},"112":{"position":[[72,3]]},"130":{"position":[[101,3]]},"176":{"position":[[3070,3],[4272,3]]},"184":{"position":[[102,3]]},"192":{"position":[[35,3],[285,3]]},"208":{"position":[[2208,3]]},"319":{"position":[[142,3]]},"331":{"position":[[426,3]]},"337":{"position":[[50,3]]},"372":{"position":[[2023,3]]},"374":{"position":[[182,3],[200,3],[484,3]]},"376":{"position":[[529,3]]},"400":{"position":[[564,3],[1273,3]]},"430":{"position":[[903,3]]},"434":{"position":[[124,3]]}}}],["webhook",{"_index":166,"t":{"4":{"position":[[4802,11]]},"20":{"position":[[37,8]]},"22":{"position":[[0,8],[187,8],[249,7],[286,8],[322,7],[402,11]]},"196":{"position":[[101,7],[282,8]]},"329":{"position":[[1692,8]]},"337":{"position":[[1023,8]]},"428":{"position":[[327,8]]},"430":{"position":[[712,8]]}}}],["webscrobbl",{"_index":379,"t":{"18":{"position":[[233,14]]},"73":{"position":[[837,12]]},"196":{"position":[[21,12],[601,12]]},"198":{"position":[[31,12]]},"200":{"position":[[301,12]]},"202":{"position":[[200,12],[289,12],[708,14]]},"355":{"position":[[251,14],[1193,13]]},"372":{"position":[[79,12],[409,14],[434,14],[664,14],[689,14],[2425,13]]},"394":{"position":[[2167,14]]},"430":{"position":[[432,12]]}}}],["webscrobbler.json",{"_index":1393,"t":{"198":{"position":[[161,17]]}}}],["webscrobbler/lfm",{"_index":2236,"t":{"372":{"position":[[1697,16]]}}}],["websit",{"_index":643,"t":{"56":{"position":[[189,7]]},"58":{"position":[[1385,8]]},"200":{"position":[[101,7],[128,8]]},"390":{"position":[[191,8]]},"418":{"position":[[566,7]]},"420":{"position":[[299,7]]}}}],["websocket",{"_index":854,"t":{"86":{"position":[[472,11],[644,10]]},"164":{"position":[[49,9]]},"329":{"position":[[1887,9]]}}}],["well",{"_index":131,"t":{"4":{"position":[[3570,4]]},"12":{"position":[[110,4]]},"22":{"position":[[1520,4]]},"251":{"position":[[5303,4],[5405,4]]},"261":{"position":[[767,5]]},"265":{"position":[[97,4]]},"329":{"position":[[167,4],[1571,4]]},"382":{"position":[[119,5]]},"428":{"position":[[36,4]]},"444":{"position":[[165,4]]}}}],["went",{"_index":2306,"t":{"390":{"position":[[3021,4]]}}}],["wgxl6bsuq343",{"_index":1470,"t":{"208":{"position":[[2716,16],[3945,17]]}}}],["whatev",{"_index":497,"t":{"35":{"position":[[554,8]]},"196":{"position":[[224,9]]},"208":{"position":[[2232,8]]},"424":{"position":[[1721,8]]}}}],["whatever.tld/subdir/api",{"_index":1478,"t":{"208":{"position":[[3585,26]]}}}],["wheatu",{"_index":1745,"t":{"251":{"position":[[1774,10],[2020,10],[3544,10],[3708,7],[3749,8],[3956,10],[4411,10],[4473,9],[4631,10]]},"301":{"position":[[772,10],[954,10]]}}}],["when/if",{"_index":2265,"t":{"390":{"position":[[349,7]]}}}],["whether",{"_index":1571,"t":{"224":{"position":[[23,7]]},"355":{"position":[[2676,7]]}}}],["whistl",{"_index":1976,"t":{"337":{"position":[[146,9]]}}}],["whitelist",{"_index":1162,"t":{"150":{"position":[[263,9]]},"162":{"position":[[427,12],[655,12]]},"202":{"position":[[443,12],[664,12]]}}}],["whitelistedapp",{"_index":1023,"t":{"100":{"position":[[771,18],[1014,18]]}}}],["whitelisteddevic",{"_index":1021,"t":{"100":{"position":[[722,21],[965,21]]}}}],["wider",{"_index":1658,"t":{"234":{"position":[[824,5]]},"236":{"position":[[221,5]]}}}],["window",{"_index":901,"t":{"92":{"position":[[356,7]]},"96":{"position":[[509,6]]},"98":{"position":[[996,7]]},"192":{"position":[[196,6]]}}}],["wish",{"_index":331,"t":{"14":{"position":[[2053,4]]},"150":{"position":[[7,4]]},"247":{"position":[[329,4],[906,4]]},"309":{"position":[[161,4]]},"329":{"position":[[607,4]]},"355":{"position":[[1554,4]]},"390":{"position":[[1992,4]]},"416":{"position":[[2937,4],[3090,4]]}}}],["within",{"_index":206,"t":{"8":{"position":[[323,6],[1286,6]]},"14":{"position":[[2871,6]]},"96":{"position":[[500,6]]},"134":{"position":[[988,6]]},"200":{"position":[[290,6]]},"216":{"position":[[305,6]]},"220":{"position":[[521,6]]},"222":{"position":[[1914,6]]},"228":{"position":[[7,6],[32,6]]},"251":{"position":[[5708,6]]}}}],["without",{"_index":872,"t":{"88":{"position":[[91,7]]},"100":{"position":[[214,7]]},"124":{"position":[[133,7]]},"138":{"position":[[131,7]]},"152":{"position":[[289,7]]},"176":{"position":[[3700,7]]},"202":{"position":[[122,7]]},"251":{"position":[[4998,7]]},"258":{"position":[[629,7]]},"261":{"position":[[45,7]]},"263":{"position":[[162,7]]},"321":{"position":[[391,7]]},"329":{"position":[[2638,7]]},"355":{"position":[[2646,7]]},"364":{"position":[[499,7]]},"384":{"position":[[538,7]]},"430":{"position":[[1721,7],[1818,7]]}}}],["won't",{"_index":1741,"t":{"251":{"position":[[1451,5]]}}}],["work",{"_index":228,"t":{"8":{"position":[[1262,5]]},"24":{"position":[[150,7]]},"51":{"position":[[185,5]]},"58":{"position":[[267,5]]},"90":{"position":[[247,4]]},"96":{"position":[[695,6]]},"148":{"position":[[333,5]]},"170":{"position":[[303,4]]},"176":{"position":[[1214,5]]},"184":{"position":[[382,4]]},"196":{"position":[[460,4]]},"208":{"position":[[133,7],[194,5],[1541,7],[1631,5],[4807,4]]},"234":{"position":[[1473,4]]},"238":{"position":[[377,4]]},"321":{"position":[[237,7]]},"342":{"position":[[885,4]]},"350":{"position":[[663,4]]},"374":{"position":[[429,5]]},"376":{"position":[[350,8]]},"382":{"position":[[166,5],[226,5]]},"400":{"position":[[58,7]]}}}],["workingdirectory=/path/to/multi",{"_index":2391,"t":{"406":{"position":[[319,31]]}}}],["workspac",{"_index":1906,"t":{"323":{"position":[[25,9]]}}}],["world",{"_index":2299,"t":{"390":{"position":[[2087,5]]}}}],["worldwid",{"_index":1796,"t":{"256":{"position":[[1084,11]]},"261":{"position":[[571,9]]}}}],["worri",{"_index":2159,"t":{"355":{"position":[[2664,5]]}}}],["wrapped.baileytownsend.dev",{"_index":659,"t":{"58":{"position":[[1443,26]]}}}],["write",{"_index":2302,"t":{"390":{"position":[[2488,5]]}}}],["written",{"_index":1889,"t":{"319":{"position":[[19,7]]}}}],["wrong",{"_index":1823,"t":{"267":{"position":[[69,5]]}}}],["ws",{"_index":1402,"t":{"200":{"position":[[66,2]]},"202":{"position":[[119,2]]}}}],["ws://192.168.0.101",{"_index":856,"t":{"86":{"position":[[735,20]]},"88":{"position":[[451,21],[735,21]]}}}],["ws://192.168.0.101/api/live/nowplaying/websocket",{"_index":857,"t":{"86":{"position":[[759,48]]}}}],["ws://192.168.0.101:3456/mopidy/w",{"_index":1156,"t":{"148":{"position":[[1180,34]]}}}],["ws://azura.mydomain.com",{"_index":858,"t":{"86":{"position":[[808,25]]}}}],["ws://azura.mydomain.com.com/api/live/nowplaying/websocket",{"_index":859,"t":{"86":{"position":[[837,57]]}}}],["ws://localhost:6680/mopidy/w",{"_index":1150,"t":{"148":{"position":[[542,29],[1070,29]]}}}],["ws://localhost:7905",{"_index":1227,"t":{"164":{"position":[[469,19]]},"166":{"position":[[92,19],[279,22],[529,22]]}}}],["ws://mopidy.mydomain.com:6680/mopidy/w",{"_index":1155,"t":{"148":{"position":[[1120,40]]}}}],["ws://mopidy.mydomain.com:80/mopw",{"_index":1158,"t":{"148":{"position":[[1244,33]]}}}],["ws_blacklist",{"_index":1406,"t":{"202":{"position":[[246,12]]}}}],["ws_enabl",{"_index":1404,"t":{"202":{"position":[[82,9]]}}}],["ws_whitelist",{"_index":1405,"t":{"202":{"position":[[159,12]]}}}],["wss://mydomain.com/custom/azura/w",{"_index":860,"t":{"86":{"position":[[895,36],[935,34]]}}}],["ws|wss]://host:[port",{"_index":853,"t":{"86":{"position":[[401,22]]},"164":{"position":[[241,22]]}}}],["wtf",{"_index":695,"t":{"65":{"position":[[472,4]]}}}],["x",{"_index":878,"t":{"88":{"position":[[348,1]]},"344":{"position":[[840,1]]},"390":{"position":[[3119,2],[3180,2],[3196,1]]}}}],["x11",{"_index":2219,"t":{"372":{"position":[[543,5],[754,5]]}}}],["x86",{"_index":2311,"t":{"394":{"position":[[36,3]]}}}],["x86/arm",{"_index":2449,"t":{"430":{"position":[[1190,7]]}}}],["x86_64",{"_index":2220,"t":{"372":{"position":[[555,7],[766,7]]}}}],["xw",{"_index":1795,"t":{"256":{"position":[[1066,2]]},"261":{"position":[[615,6]]},"272":{"position":[[397,7]]},"276":{"position":[[494,7]]}}}],["xxx",{"_index":2362,"t":{"400":{"position":[[355,5],[378,5]]}}}],["y",{"_index":2190,"t":{"364":{"position":[[486,1]]},"390":{"position":[[3122,2],[3188,2]]}}}],["y4j3",{"_index":684,"t":{"63":{"position":[[960,5],[1211,5]]},"190":{"position":[[960,6],[1169,6],[1399,6],[1864,6],[2179,6]]}}}],["yamaha",{"_index":788,"t":{"73":{"position":[[902,6]]},"430":{"position":[[449,6]]}}}],["ye",{"_index":353,"t":{"14":{"position":[[3642,3],[3695,3]]},"37":{"position":[[94,3],[141,3]]},"41":{"position":[[97,3],[145,3]]},"45":{"position":[[91,3],[135,3]]},"49":{"position":[[93,3],[142,3]]},"56":{"position":[[516,3],[610,3]]},"63":{"position":[[657,3],[760,3]]},"88":{"position":[[73,3],[123,3],[183,3]]},"94":{"position":[[77,3]]},"104":{"position":[[78,3]]},"110":{"position":[[92,3]]},"116":{"position":[[90,3]]},"130":{"position":[[1277,3],[1351,3]]},"166":{"position":[[157,3]]},"168":{"position":[[1637,3],[1705,3]]},"178":{"position":[[100,3],[126,3]]},"182":{"position":[[96,3],[118,3],[135,3]]},"194":{"position":[[121,3]]},"206":{"position":[[92,3]]},"430":{"position":[[2136,4]]}}}],["year",{"_index":1655,"t":{"234":{"position":[[754,4]]},"236":{"position":[[151,4]]}}}],["you'll",{"_index":1533,"t":{"216":{"position":[[0,6]]}}}],["you'r",{"_index":2438,"t":{"426":{"position":[[251,6]]}}}],["you'v",{"_index":1525,"t":{"214":{"position":[[125,6]]}}}],["young",{"_index":1885,"t":{"314":{"position":[[172,7]]}}}],["yourappnam",{"_index":1488,"t":{"208":{"position":[[4498,13]]}}}],["yourconnectionstringher",{"_index":334,"t":{"14":{"position":[[2422,26]]}}}],["yourhostip:yourport",{"_index":1358,"t":{"192":{"position":[[807,19]]}}}],["yourmultiscrobblerinstance]/api/webscrobbl",{"_index":1383,"t":{"196":{"position":[[118,45]]}}}],["yourmusic.com",{"_index":1838,"t":{"282":{"position":[[729,17]]}}}],["yourmusicsource.com",{"_index":1516,"t":{"212":{"position":[[421,21]]}}}],["yourpassword",{"_index":1323,"t":{"182":{"position":[[339,15],[631,15]]}}}],["yourport",{"_index":1359,"t":{"192":{"position":[[846,8]]}}}],["yourself",{"_index":686,"t":{"65":{"position":[[41,8]]},"176":{"position":[[3866,9]]},"208":{"position":[[2086,8]]},"355":{"position":[[353,8]]}}}],["yourus",{"_index":1322,"t":{"182":{"position":[[315,11],[371,10],[607,11],[663,10]]}}}],["youtub",{"_index":691,"t":{"65":{"position":[[239,7]]},"71":{"position":[[152,7]]},"73":{"position":[[943,7]]},"430":{"position":[[466,7]]},"434":{"position":[[204,7]]}}}],["youtube.js/wiki/how",{"_index":1429,"t":{"208":{"position":[[642,19]]}}}],["youtubetv",{"_index":1427,"t":{"208":{"position":[[570,9],[4767,9]]},"376":{"position":[[224,9],[322,9]]}}}],["yt",{"_index":437,"t":{"24":{"position":[[675,2]]},"208":{"position":[[27,2],[185,2],[4975,2],[5381,2]]}}}],["ytm",{"_index":1422,"t":{"208":{"position":[[300,3],[1431,3],[1472,3],[1663,3]]},"210":{"position":[[330,3]]},"376":{"position":[[41,3],[151,3],[622,3],[803,3],[1162,3]]},"390":{"position":[[15,3],[141,3],[187,3],[513,3],[1067,3],[1211,3],[1302,3],[1454,3],[1692,3],[2292,3],[2494,3],[2663,3]]}}}],["ytm_client_id",{"_index":1500,"t":{"210":{"position":[[128,13]]}}}],["ytm_client_secret",{"_index":1502,"t":{"210":{"position":[[179,17]]}}}],["ytm_cooki",{"_index":1499,"t":{"210":{"position":[[82,10]]}}}],["ytm_log_diff",{"_index":1504,"t":{"210":{"position":[[304,12]]}}}],["ytm_log_diff=tru",{"_index":2280,"t":{"390":{"position":[[1632,17]]}}}],["ytm_redirect_uri",{"_index":1503,"t":{"210":{"position":[[238,16]]}}}],["ytmusic",{"_index":747,"t":{"67":{"position":[[2831,10]]},"208":{"position":[[1034,10],[2581,10],[2828,7],[3810,10],[4294,7]]},"210":{"position":[[990,9]]},"390":{"position":[[1534,10],[1729,8],[2369,10],[2539,7]]}}}],["ytmusic.json",{"_index":1438,"t":{"208":{"position":[[982,12],[2537,12],[3406,12]]},"390":{"position":[[1472,14]]}}}],["ytmusic/callback",{"_index":1479,"t":{"208":{"position":[[3627,16]]}}}],["z",{"_index":2308,"t":{"390":{"position":[[3130,2],[3210,2]]}}}]],"pipeline":["stemmer"]}}] 1 + [{"documents":[{"i":1,"t":"Overview","u":"/multi-scrobbler/configuration/clients/","b":["Docs","Configuration","Scrobble Clients"]},{"i":10,"t":"Overview","u":"/multi-scrobbler/configuration/","b":["Docs","Configuration"]},{"i":34,"t":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","b":["Docs","Configuration","Scrobble Clients"]},{"i":38,"t":"Last.fm","u":"/multi-scrobbler/configuration/clients/lastfm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":44,"t":"Libre.fm","u":"/multi-scrobbler/configuration/clients/librefm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":52,"t":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","b":["Docs","Configuration","Scrobble Clients"]},{"i":56,"t":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","b":["Docs","Configuration","Scrobble Clients"]},{"i":60,"t":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","b":["Docs","Configuration","Scrobble Clients"]},{"i":67,"t":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":74,"t":"Example Complex Scenario","u":"/multi-scrobbler/configuration/kitchensink/","b":["Docs","Configuration"]},{"i":80,"t":"Overview","u":"/multi-scrobbler/configuration/sources/","b":["Docs","Configuration","Scrobble Sources"]},{"i":95,"t":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":99,"t":"Deezer","u":"/multi-scrobbler/configuration/sources/deezer/","b":["Docs","Configuration","Scrobble Sources"]},{"i":107,"t":"Google Cast (Chromecast)","u":"/multi-scrobbler/configuration/sources/google-cast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":111,"t":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":115,"t":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","b":["Docs","Configuration","Scrobble Sources"]},{"i":121,"t":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","b":["Docs","Configuration","Scrobble Sources"]},{"i":123,"t":"Kodi","u":"/multi-scrobbler/configuration/sources/kodi/","b":["Docs","Configuration","Scrobble Sources"]},{"i":129,"t":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":131,"t":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","b":["Docs","Configuration","Scrobble Sources"]},{"i":137,"t":"Last.fm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":141,"t":"Libre.fm","u":"/multi-scrobbler/configuration/sources/librefm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":145,"t":"Listenbrainz (Endpoint)","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","b":["Docs","Configuration","Scrobble Sources"]},{"i":153,"t":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":157,"t":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","b":["Docs","Configuration","Scrobble Sources"]},{"i":161,"t":"Mopidy","u":"/multi-scrobbler/configuration/sources/mopidy/","b":["Docs","Configuration","Scrobble Sources"]},{"i":169,"t":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","b":["Docs","Configuration","Scrobble Sources"]},{"i":173,"t":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","b":["Docs","Configuration","Scrobble Sources"]},{"i":177,"t":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","b":["Docs","Configuration","Scrobble Sources"]},{"i":181,"t":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":187,"t":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","b":["Docs","Configuration","Scrobble Sources"]},{"i":189,"t":"Spotify","u":"/multi-scrobbler/configuration/sources/spotify/","b":["Docs","Configuration","Scrobble Sources"]},{"i":193,"t":"Subsonic","u":"/multi-scrobbler/configuration/sources/subsonic/","b":["Docs","Configuration","Scrobble Sources"]},{"i":197,"t":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":205,"t":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","b":["Docs","Configuration","Scrobble Sources"]},{"i":209,"t":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","b":["Docs","Configuration","Scrobble Sources"]},{"i":217,"t":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":221,"t":"Youtube Music","u":"/multi-scrobbler/configuration/sources/youtube-music/","b":["Docs","Configuration","Scrobble Sources"]},{"i":225,"t":"Enhancing Scrobbles","u":"/multi-scrobbler/configuration/transforms/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":247,"t":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":264,"t":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":312,"t":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":333,"t":"Client Development/Tutorial","u":"/multi-scrobbler/development/dev-client/","b":["Docs","Development"]},{"i":335,"t":"Development","u":"/multi-scrobbler/development/dev-common/","b":["Docs","Development"]},{"i":352,"t":"Flatpak","u":"/multi-scrobbler/development/flatpak/","b":["Docs","Development"]},{"i":365,"t":"Overview","u":"/multi-scrobbler/installation/","b":["Docs","Installation"]},{"i":377,"t":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","b":["Docs","Development"]},{"i":399,"t":"FAQ","u":"/multi-scrobbler/FAQ/","b":["Docs"]},{"i":421,"t":"Systemd","u":"/multi-scrobbler/installation/service/","b":["Docs","Installation"]},{"i":429,"t":"Quickstart","u":"/multi-scrobbler/quickstart/","b":["Docs"]},{"i":447,"t":"Overview","u":"/multi-scrobbler/","b":["Docs"]},{"i":469,"t":"Overview","u":"/multi-scrobbler/updating/","b":["Docs","Updating"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,2.334]],["t/10",[0,2.334]],["t/34",[1,3.396]],["t/38",[2,3.396]],["t/44",[3,3.396]],["t/52",[4,3.396]],["t/56",[5,3.022]],["t/60",[6,3.396]],["t/67",[7,3.396]],["t/74",[8,2.352,9,2.352,10,2.352]],["t/80",[0,2.334]],["t/95",[11,3.964]],["t/99",[12,3.964]],["t/107",[13,2.352,14,2.352,15,2.352]],["t/111",[16,3.964]],["t/115",[17,3.964]],["t/121",[18,3.964]],["t/123",[19,3.964]],["t/129",[1,3.396]],["t/131",[20,2.952,21,2.529]],["t/137",[2,3.396]],["t/141",[3,3.396]],["t/145",[5,2.251,21,2.529]],["t/153",[5,3.022]],["t/157",[4,3.396]],["t/161",[22,3.964]],["t/169",[23,3.964]],["t/173",[24,1.954,25,1.674,26,1.954,27,1.954]],["t/177",[28,3.964]],["t/181",[6,3.396]],["t/187",[29,3.964]],["t/189",[30,3.964]],["t/193",[31,3.964]],["t/197",[7,3.396]],["t/205",[32,3.964]],["t/209",[33,3.964]],["t/217",[34,2.952,35,2.952]],["t/221",[25,2.529,36,2.952]],["t/225",[37,2.952,38,2.952]],["t/247",[39,2.952,40,2.251]],["t/264",[40,2.251,41,2.952]],["t/312",[40,2.251,42,2.952]],["t/333",[43,2.952,44,2.529]],["t/335",[45,3.964]],["t/352",[46,3.964]],["t/365",[0,2.334]],["t/377",[44,2.529,47,2.952]],["t/399",[48,3.964]],["t/421",[49,3.964]],["t/429",[50,3.964]],["t/447",[0,2.334]],["t/469",[0,2.334]]],"invertedIndex":[["azuracast",{"_index":11,"t":{"95":{"position":[[0,9]]}}}],["cast",{"_index":14,"t":{"107":{"position":[[7,4]]}}}],["chromecast",{"_index":15,"t":{"107":{"position":[[12,12]]}}}],["client",{"_index":43,"t":{"333":{"position":[[0,6]]}}}],["complex",{"_index":9,"t":{"74":{"position":[[8,7]]}}}],["daemon",{"_index":27,"t":{"173":{"position":[[18,7]]}}}],["deezer",{"_index":12,"t":{"99":{"position":[[0,6]]}}}],["develop",{"_index":45,"t":{"335":{"position":[[0,11]]}}}],["development/tutori",{"_index":44,"t":{"333":{"position":[[7,20]]},"377":{"position":[[7,20]]}}}],["endpoint",{"_index":21,"t":{"131":{"position":[[7,10]]},"145":{"position":[[13,10]]}}}],["enhanc",{"_index":37,"t":{"225":{"position":[[0,9]]}}}],["exampl",{"_index":8,"t":{"74":{"position":[[0,7]]}}}],["faq",{"_index":48,"t":{"399":{"position":[[0,3]]}}}],["flatpak",{"_index":46,"t":{"352":{"position":[[0,7]]}}}],["googl",{"_index":13,"t":{"107":{"position":[[0,6]]}}}],["icecast",{"_index":16,"t":{"111":{"position":[[0,7]]}}}],["jellyfin",{"_index":18,"t":{"121":{"position":[[0,8]]}}}],["jriver",{"_index":17,"t":{"115":{"position":[[0,6]]}}}],["kodi",{"_index":19,"t":{"123":{"position":[[0,4]]}}}],["koito",{"_index":1,"t":{"34":{"position":[[0,5]]},"129":{"position":[[0,5]]}}}],["last.fm",{"_index":2,"t":{"38":{"position":[[0,7]]},"137":{"position":[[0,7]]}}}],["lastfm",{"_index":20,"t":{"131":{"position":[[0,6]]}}}],["libre.fm",{"_index":3,"t":{"44":{"position":[[0,8]]},"141":{"position":[[0,8]]}}}],["listenbrainz",{"_index":5,"t":{"56":{"position":[[0,12]]},"145":{"position":[[0,12]]},"153":{"position":[[0,12]]}}}],["maloja",{"_index":4,"t":{"52":{"position":[[0,6]]},"157":{"position":[[0,6]]}}}],["mopidi",{"_index":22,"t":{"161":{"position":[[0,6]]}}}],["mpd",{"_index":24,"t":{"173":{"position":[[0,3]]}}}],["mpri",{"_index":23,"t":{"169":{"position":[[0,5]]}}}],["music",{"_index":25,"t":{"173":{"position":[[4,6]]},"221":{"position":[[8,5]]}}}],["musicbrainz",{"_index":41,"t":{"264":{"position":[[0,11]]}}}],["musiccast",{"_index":35,"t":{"217":{"position":[[7,9]]}}}],["musikcub",{"_index":28,"t":{"177":{"position":[[0,9]]}}}],["nativ",{"_index":39,"t":{"247":{"position":[[0,6]]}}}],["overview",{"_index":0,"t":{"1":{"position":[[0,8]]},"10":{"position":[[0,8]]},"80":{"position":[[0,8]]},"365":{"position":[[0,8]]},"447":{"position":[[0,8]]},"469":{"position":[[0,8]]}}}],["player",{"_index":26,"t":{"173":{"position":[[11,6]]}}}],["plex",{"_index":29,"t":{"187":{"position":[[0,4]]}}}],["quickstart",{"_index":50,"t":{"429":{"position":[[0,10]]}}}],["rockski",{"_index":6,"t":{"60":{"position":[[0,7]]},"181":{"position":[[0,7]]}}}],["scenario",{"_index":10,"t":{"74":{"position":[[16,8]]}}}],["scrobbl",{"_index":38,"t":{"225":{"position":[[10,9]]}}}],["sourc",{"_index":47,"t":{"377":{"position":[[0,6]]}}}],["spotifi",{"_index":30,"t":{"189":{"position":[[0,7]]}}}],["stage",{"_index":40,"t":{"247":{"position":[[7,5]]},"264":{"position":[[12,5]]},"312":{"position":[[5,5]]}}}],["subson",{"_index":31,"t":{"193":{"position":[[0,8]]}}}],["systemd",{"_index":49,"t":{"421":{"position":[[0,7]]}}}],["teal.fm",{"_index":7,"t":{"67":{"position":[[0,7]]},"197":{"position":[[0,7]]}}}],["user",{"_index":42,"t":{"312":{"position":[[0,4]]}}}],["vlc",{"_index":32,"t":{"205":{"position":[[0,3]]}}}],["webscrobbl",{"_index":33,"t":{"209":{"position":[[0,12]]}}}],["yamaha",{"_index":34,"t":{"217":{"position":[[0,6]]}}}],["youtub",{"_index":36,"t":{"221":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Clients","u":"/multi-scrobbler/configuration/clients/","h":"#clients","p":1},{"i":5,"t":"Features","u":"/multi-scrobbler/configuration/clients/","h":"#features","p":1},{"i":6,"t":"Dead Scrobbles","u":"/multi-scrobbler/configuration/clients/","h":"#dead-scrobbles","p":1},{"i":8,"t":"Now Playing","u":"/multi-scrobbler/configuration/clients/","h":"#now-playing","p":1},{"i":12,"t":"Configuration Types","u":"/multi-scrobbler/configuration/","h":"#configuration-types","p":10},{"i":14,"t":"Setup Sources and Clients","u":"/multi-scrobbler/configuration/","h":"#setup-sources-and-clients","p":10},{"i":16,"t":"Secrets Interpolation","u":"/multi-scrobbler/configuration/","h":"#secrets-interpolation","p":10},{"i":18,"t":"Application Options","u":"/multi-scrobbler/configuration/","h":"#application-options","p":10},{"i":20,"t":"Base URL","u":"/multi-scrobbler/configuration/","h":"#base-url","p":10},{"i":22,"t":"Caching","u":"/multi-scrobbler/configuration/","h":"#caching","p":10},{"i":24,"t":"Debug Mode","u":"/multi-scrobbler/configuration/","h":"#debug-mode","p":10},{"i":26,"t":"Disable Web","u":"/multi-scrobbler/configuration/","h":"#disable-web","p":10},{"i":28,"t":"Monitoring","u":"/multi-scrobbler/configuration/","h":"#monitoring","p":10},{"i":30,"t":"Webhook Configurations","u":"/multi-scrobbler/configuration/","h":"#webhook-configurations","p":10},{"i":32,"t":"Health Endpoint","u":"/multi-scrobbler/configuration/","h":"#health-endpoint","p":10},{"i":36,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/koito/","h":"#configuration","p":34},{"i":40,"t":"Callback/Redirect URL","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#callbackredirect-url","p":38},{"i":42,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#configuration","p":38},{"i":46,"t":"Callback/Redirect URL","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#callbackredirect-url","p":44},{"i":48,"t":"Custom Libre.fm instance","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#custom-librefm-instance","p":44},{"i":50,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#configuration","p":44},{"i":54,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/maloja/","h":"#configuration","p":52},{"i":58,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"#configuration","p":56},{"i":62,"t":"Setup","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#setup","p":60},{"i":64,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#configuration","p":60},{"i":65,"t":"Handle","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#handle","p":60},{"i":69,"t":"Setup","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#setup","p":67},{"i":71,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#configuration","p":67},{"i":72,"t":"Identifier","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#identifier","p":67},{"i":76,"t":"All-in-one Config","u":"/multi-scrobbler/configuration/kitchensink/","h":"#all-in-one-config","p":74},{"i":78,"t":"Separate JSON files","u":"/multi-scrobbler/configuration/kitchensink/","h":"#separate-json-files","p":74},{"i":82,"t":"Sources","u":"/multi-scrobbler/configuration/sources/","h":"#sources","p":80},{"i":84,"t":"Features","u":"/multi-scrobbler/configuration/sources/","h":"#features","p":80},{"i":85,"t":"Types of Sources","u":"/multi-scrobbler/configuration/sources/","h":"#types-of-sources","p":80},{"i":87,"t":"Multi-Device/User","u":"/multi-scrobbler/configuration/sources/","h":"#multi-deviceuser","p":80},{"i":89,"t":"Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/sources/","h":"#limiting-scrobble-destination","p":80},{"i":91,"t":"Scrobble Thresholds","u":"/multi-scrobbler/configuration/sources/","h":"#scrobble-thresholds","p":80},{"i":93,"t":"Should Scrobble Behavior","u":"/multi-scrobbler/configuration/sources/","h":"#should-scrobble-behavior","p":80},{"i":97,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#configuration","p":95},{"i":101,"t":"Retrieve ARL","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#retrieve-arl","p":99},{"i":103,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#configuration","p":99},{"i":105,"t":"Duplicate detection","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#duplicate-detection","p":99},{"i":109,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"#configuration","p":107},{"i":113,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/icecast/","h":"#configuration","p":111},{"i":117,"t":"URL","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#url","p":115},{"i":119,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#configuration","p":115},{"i":125,"t":"URL","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#url","p":123},{"i":127,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#configuration","p":123},{"i":133,"t":"URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#url","p":131},{"i":135,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#configuration","p":131},{"i":139,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"#configuration","p":137},{"i":143,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/librefm-source/","h":"#configuration","p":141},{"i":147,"t":"URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#url","p":145},{"i":149,"t":"Token","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#token","p":145},{"i":151,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#configuration","p":145},{"i":155,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"#configuration","p":153},{"i":159,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/maloja/","h":"#configuration","p":157},{"i":163,"t":"URI Blacklist/Whitelist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#uri-blacklistwhitelist","p":161},{"i":165,"t":"Album Blacklist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#album-blacklist","p":161},{"i":167,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#configuration","p":161},{"i":171,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mpris/","h":"#configuration","p":169},{"i":175,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mpd/","h":"#configuration","p":173},{"i":179,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"#configuration","p":177},{"i":183,"t":"Setup","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#setup","p":181},{"i":185,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#configuration","p":181},{"i":191,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/spotify/","h":"#configuration","p":189},{"i":195,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#configuration","p":193},{"i":199,"t":"Setup","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#setup","p":197},{"i":201,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#configuration","p":197},{"i":203,"t":"Service Filtering","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#service-filtering","p":197},{"i":207,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/vlc/","h":"#configuration","p":205},{"i":211,"t":"Multiple Users","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#multiple-users","p":209},{"i":213,"t":"Connectors Black/Whitelist","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#connectors-blackwhitelist","p":209},{"i":215,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#configuration","p":209},{"i":219,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"#configuration","p":217},{"i":223,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"#configuration","p":221},{"i":227,"t":"Journey of a Scrobble","u":"/multi-scrobbler/configuration/transforms/","h":"#journey-of-a-scrobble","p":225},{"i":229,"t":"Lifecyle Hooks","u":"/multi-scrobbler/configuration/transforms/","h":"#lifecyle-hooks","p":225},{"i":231,"t":"Hook","u":"/multi-scrobbler/configuration/transforms/","h":"#hook","p":225},{"i":233,"t":"Modification Stage","u":"/multi-scrobbler/configuration/transforms/","h":"#stage","p":225},{"i":235,"t":"Configuring Stages","u":"/multi-scrobbler/configuration/transforms/","h":"#configuring-stages","p":225},{"i":237,"t":"Rules for Play Data","u":"/multi-scrobbler/configuration/transforms/","h":"#stage-rules","p":225},{"i":239,"t":"Stage Flow Control","u":"/multi-scrobbler/configuration/transforms/","h":"#flow-control","p":225},{"i":241,"t":"Conditionally Run","u":"/multi-scrobbler/configuration/transforms/","h":"#conditional-modification","p":225},{"i":243,"t":"Logging","u":"/multi-scrobbler/configuration/transforms/","h":"#logging","p":225},{"i":245,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/","h":"#examples","p":225},{"i":249,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#configuration","p":247},{"i":251,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/native/","h":"#rules","p":247},{"i":253,"t":"Default Stage","u":"/multi-scrobbler/configuration/transforms/native/","h":"#default-stage","p":247},{"i":255,"t":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#env-configuration","p":247},{"i":257,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/native/","h":"#examples","p":247},{"i":258,"t":"Parse only artists string using a custom delimiter","u":"/multi-scrobbler/configuration/transforms/native/","h":"#parse-only-artists-string-using-a-custom-delimiter","p":247},{"i":260,"t":"Don't parse specific artists","u":"/multi-scrobbler/configuration/transforms/native/","h":"#dont-parse-specific-artists","p":247},{"i":262,"t":"Extract Artists from Title but do not modify Title","u":"/multi-scrobbler/configuration/transforms/native/","h":"#extract-artists-from-title-but-do-not-modify-title","p":247},{"i":266,"t":"More Than Mainstream Data","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":264},{"i":268,"t":"As The Artist Intended","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":264},{"i":270,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#configuration","p":264},{"i":271,"t":"API Setup","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#api-setup","p":264},{"i":273,"t":"Stage Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#stage-configuration","p":264},{"i":275,"t":"Rules and Hooks","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#rules-and-hooks","p":264},{"i":277,"t":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#env-configuration","p":264},{"i":279,"t":"Matching with Musicbrainz","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#matching-with-musicbrainz","p":264},{"i":281,"t":"Searching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#searching","p":264},{"i":283,"t":"Refining","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#refining","p":264},{"i":284,"t":"Score","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#score","p":264},{"i":286,"t":"Filtering","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filtering","p":264},{"i":288,"t":"Sorting","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sorting","p":264},{"i":290,"t":"Best Practices","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#best-practices","p":264},{"i":291,"t":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default","p":264},{"i":293,"t":"Search Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#search-considerations","p":264},{"i":295,"t":"Filter Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filter-considerations","p":264},{"i":297,"t":"Using Partial Match","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#using-partial-match","p":264},{"i":299,"t":"Logging","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#logging","p":264},{"i":301,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#examples","p":264},{"i":302,"t":"Minimal","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#minimal","p":264},{"i":304,"t":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default-1","p":264},{"i":306,"t":"Add Metadata Only (No Scrobble Modification)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#add-metadata-only-no-scrobble-modification","p":264},{"i":308,"t":"Use Native Stage if no Musicbrainz Matches","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-native-stage-if-no-musicbrainz-matches","p":264},{"i":310,"t":"Different Search Methods Based on Source (Last.fm and Spotify)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#override-stage-configuration-example","p":264},{"i":314,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/user/","h":"#configuration","p":312},{"i":316,"t":"Search-And-Replace Expression","u":"/multi-scrobbler/configuration/transforms/user/","h":"#search-and-replace-expression","p":312},{"i":318,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rules","p":312},{"i":320,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/user/","h":"#examples","p":312},{"i":321,"t":"Usage with when condition","u":"/multi-scrobbler/configuration/transforms/user/","h":"#usage-with-when-condition","p":312},{"i":323,"t":"Remove phrase from Title in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-phrase-from-title-in-all-new-plays","p":312},{"i":325,"t":"Remove all parenthesized content from the end of a title","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-all-parenthesized-content-from-the-end-of-a-title","p":312},{"i":327,"t":"Rename misspelled artist in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rename-misspelled-artist-in-all-new-plays","p":312},{"i":329,"t":"Remove \"Various Artists\" albums in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-various-artists-albums-in-all-new-plays","p":312},{"i":331,"t":"Extract primary Artist from delimited, multi-Artist string","u":"/multi-scrobbler/configuration/transforms/user/","h":"#extract-primary-artist-from-delimited-multi-artist-string","p":312},{"i":336,"t":"Architecture","u":"/multi-scrobbler/development/dev-common/","h":"#architecture","p":335},{"i":338,"t":"Project Setup","u":"/multi-scrobbler/development/dev-common/","h":"#project-setup","p":335},{"i":340,"t":"VSCode","u":"/multi-scrobbler/development/dev-common/","h":"#vscode","p":335},{"i":342,"t":"Common Development","u":"/multi-scrobbler/development/dev-common/","h":"#common-development","p":335},{"i":344,"t":"Config","u":"/multi-scrobbler/development/dev-common/","h":"#config","p":335},{"i":346,"t":"Concrete Class","u":"/multi-scrobbler/development/dev-common/","h":"#concrete-class","p":335},{"i":348,"t":"Play Object","u":"/multi-scrobbler/development/dev-common/","h":"#play-object","p":335},{"i":350,"t":"Creating Clients and Sources","u":"/multi-scrobbler/development/dev-common/","h":"#creating-clients-and-sources","p":335},{"i":353,"t":"Install Requirements","u":"/multi-scrobbler/development/flatpak/","h":"#install-requirements","p":352},{"i":354,"t":"Flatpak and flatpak-builder","u":"/multi-scrobbler/development/flatpak/","h":"#flatpak-and-flatpak-builder","p":352},{"i":356,"t":"Update Project source","u":"/multi-scrobbler/development/flatpak/","h":"#update-project-source","p":352},{"i":358,"t":"Generate Sources and Build","u":"/multi-scrobbler/development/flatpak/","h":"#generate-sources-and-build","p":352},{"i":359,"t":"Use Setup Script","u":"/multi-scrobbler/development/flatpak/","h":"#use-setup-script","p":352},{"i":361,"t":"Manual Setup","u":"/multi-scrobbler/development/flatpak/","h":"#manual-setup","p":352},{"i":363,"t":"Run App","u":"/multi-scrobbler/development/flatpak/","h":"","p":352},{"i":367,"t":"Docker","u":"/multi-scrobbler/installation/","h":"#docker","p":365},{"i":369,"t":"Docker Usage Example","u":"/multi-scrobbler/installation/","h":"#docker-usage-example","p":365},{"i":371,"t":"Local Installation","u":"/multi-scrobbler/installation/","h":"#local-installation","p":365},{"i":373,"t":"Nodejs","u":"/multi-scrobbler/installation/","h":"#nodejs","p":365},{"i":375,"t":"Flatpak","u":"/multi-scrobbler/installation/","h":"#flatpak","p":365},{"i":379,"t":"Scenario","u":"/multi-scrobbler/development/dev-source/","h":"#scenario","p":377},{"i":381,"t":"Minimal Implementation","u":"/multi-scrobbler/development/dev-source/","h":"#minimal-implementation","p":377},{"i":382,"t":"Define and Implement Config","u":"/multi-scrobbler/development/dev-source/","h":"#define-and-implement-config","p":377},{"i":384,"t":"Create CoolPlayer Source","u":"/multi-scrobbler/development/dev-source/","h":"#create-coolplayer-source","p":377},{"i":386,"t":"Initialize Source from Config","u":"/multi-scrobbler/development/dev-source/","h":"#initialize-source-from-config","p":377},{"i":388,"t":"Implement Play Object Transform","u":"/multi-scrobbler/development/dev-source/","h":"#implement-play-object-transform","p":377},{"i":390,"t":"Implement Stages","u":"/multi-scrobbler/development/dev-source/","h":"#implement-stages","p":377},{"i":392,"t":"Implement Polling","u":"/multi-scrobbler/development/dev-source/","h":"#implement-polling","p":377},{"i":394,"t":"Further Implementation","u":"/multi-scrobbler/development/dev-source/","h":"#further-implementation","p":377},{"i":395,"t":"Backlog","u":"/multi-scrobbler/development/dev-source/","h":"#backlog","p":377},{"i":397,"t":"Other Source Types","u":"/multi-scrobbler/development/dev-source/","h":"#other-source-types","p":377},{"i":400,"t":"Connection Issues","u":"/multi-scrobbler/FAQ/","h":"#connection-issues","p":399},{"i":401,"t":"Webscrobbler/Listenbrainz Endpoint doesn't connect","u":"/multi-scrobbler/FAQ/","h":"#ingress-connection","p":399},{"i":403,"t":"Spotify/Deezer/LastFM won't authenticate","u":"/multi-scrobbler/FAQ/","h":"#spotifydeezerlastfm-wont-authenticate","p":399},{"i":405,"t":"Youtube Music fails after some time","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-fails-after-some-time","p":399},{"i":407,"t":"Configuration Issues","u":"/multi-scrobbler/FAQ/","h":"#configuration-issues","p":399},{"i":408,"t":"Config could not be parsed","u":"/multi-scrobbler/FAQ/","h":"#config-could-not-be-parsed","p":399},{"i":410,"t":"Scrobbling Issues","u":"/multi-scrobbler/FAQ/","h":"#scrobbling-issues","p":399},{"i":411,"t":"Last.fm does not scrobble tracks with multiple artists correctly","u":"/multi-scrobbler/FAQ/","h":"#lastfm-does-not-scrobble-tracks-with-multiple-artists-correctly","p":399},{"i":413,"t":"Google Cast track information is missing/incorrect or MS player has weird times","u":"/multi-scrobbler/FAQ/","h":"#google-cast-track-information-is-missingincorrect-or-ms-player-has-weird-times","p":399},{"i":415,"t":"Google Cast device does not track media","u":"/multi-scrobbler/FAQ/","h":"#google-cast-device-does-not-track-media","p":399},{"i":417,"t":"VLC is not scrobbling fields correctly","u":"/multi-scrobbler/FAQ/","h":"#vlc-is-not-scrobbling-fields-correctly","p":399},{"i":419,"t":"Youtube Music misses or duplicates scrobbles","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-misses-or-duplicates-scrobbles","p":399},{"i":423,"t":"Create A Unit File","u":"/multi-scrobbler/installation/service/","h":"#create-a-unit-file","p":421},{"i":425,"t":"Start the Service","u":"/multi-scrobbler/installation/service/","h":"#start-the-service","p":421},{"i":427,"t":"Other Service Methods","u":"/multi-scrobbler/installation/service/","h":"","p":421},{"i":431,"t":"Create Docker Compose File","u":"/multi-scrobbler/quickstart/","h":"#create-docker-compose-file","p":429},{"i":433,"t":"Setup Sources","u":"/multi-scrobbler/quickstart/","h":"#setup-sources","p":429},{"i":435,"t":"(Optional) Correct Scrobbles with Musicbrainz","u":"/multi-scrobbler/quickstart/","h":"#optional-correct-scrobbles-with-musicbrainz","p":429},{"i":437,"t":"Configure Musicbrainz API","u":"/multi-scrobbler/quickstart/","h":"","p":429},{"i":439,"t":"Enable Musicbrainz For A Source","u":"/multi-scrobbler/quickstart/","h":"","p":429},{"i":441,"t":"Setup Clients","u":"/multi-scrobbler/quickstart/","h":"#setup-clients","p":429},{"i":443,"t":"Start Multi-Scrobbler","u":"/multi-scrobbler/quickstart/","h":"#start-multi-scrobbler","p":429},{"i":445,"t":"Next Steps","u":"/multi-scrobbler/quickstart/","h":"#next-steps","p":429},{"i":449,"t":"How Does multi-scrobbler (MS) Work?","u":"/multi-scrobbler/","h":"#how-does-multi-scrobbler-ms-work","p":447},{"i":451,"t":"Source","u":"/multi-scrobbler/","h":"#source","p":447},{"i":453,"t":"Client","u":"/multi-scrobbler/","h":"#client","p":447},{"i":455,"t":"Quick Start","u":"/multi-scrobbler/","h":"#quick-start","p":447},{"i":457,"t":"Installation","u":"/multi-scrobbler/","h":"#installation","p":447},{"i":459,"t":"Configuration","u":"/multi-scrobbler/","h":"#configuration","p":447},{"i":461,"t":"Usage","u":"/multi-scrobbler/","h":"#usage","p":447},{"i":463,"t":"Help/FAQ","u":"/multi-scrobbler/","h":"#helpfaq","p":447},{"i":465,"t":"Development","u":"/multi-scrobbler/","h":"#development","p":447},{"i":467,"t":"License","u":"/multi-scrobbler/","h":"#license","p":447},{"i":470,"t":"Updating","u":"/multi-scrobbler/updating/","h":"#updating","p":469},{"i":472,"t":"Docker","u":"/multi-scrobbler/updating/","h":"#docker","p":469},{"i":474,"t":"Nodejs","u":"/multi-scrobbler/updating/","h":"#nodejs","p":469}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,4.516]],["t/5",[1,5.511]],["t/6",[2,4.908,3,2.858]],["t/8",[4,4.908,5,3.289]],["t/12",[6,1.52,7,4.055]],["t/14",[0,2.994,8,2.377,9,2.243]],["t/16",[10,4.908,11,4.908]],["t/18",[12,4.908,13,4.394]],["t/20",[14,4.394,15,3.289]],["t/22",[16,6.156]],["t/24",[17,4.908,18,4.908]],["t/26",[19,4.908,20,4.908]],["t/28",[21,6.156]],["t/30",[6,1.52,22,4.908]],["t/32",[23,4.908,24,4.394]],["t/36",[6,1.906]],["t/40",[15,3.289,25,4.394]],["t/42",[6,1.906]],["t/46",[15,3.289,25,4.394]],["t/48",[26,3.653,27,4.081,28,4.081]],["t/50",[6,1.906]],["t/54",[6,1.906]],["t/58",[6,1.906]],["t/62",[8,3.585]],["t/64",[6,1.906]],["t/65",[29,6.156]],["t/69",[8,3.585]],["t/71",[6,1.906]],["t/72",[30,6.156]],["t/76",[31,4.908,32,3.601]],["t/78",[33,4.081,34,4.081,35,3.372]],["t/82",[9,3.383]],["t/84",[1,5.511]],["t/85",[7,4.055,9,2.697]],["t/87",[36,3.803,37,4.908]],["t/89",[3,2.377,38,4.081,39,4.081]],["t/91",[3,2.858,40,4.908]],["t/93",[3,2.858,41,4.908]],["t/97",[6,1.906]],["t/101",[42,4.908,43,4.908]],["t/103",[6,1.906]],["t/105",[44,4.394,45,4.908]],["t/109",[6,1.906]],["t/113",[6,1.906]],["t/117",[15,4.125]],["t/119",[6,1.906]],["t/125",[15,4.125]],["t/127",[6,1.906]],["t/133",[15,4.125]],["t/135",[6,1.906]],["t/139",[6,1.906]],["t/143",[6,1.906]],["t/147",[15,4.125]],["t/149",[46,6.156]],["t/151",[6,1.906]],["t/155",[6,1.906]],["t/159",[6,1.906]],["t/163",[47,4.908,48,4.908]],["t/165",[49,4.394,50,4.908]],["t/167",[6,1.906]],["t/171",[6,1.906]],["t/175",[6,1.906]],["t/179",[6,1.906]],["t/183",[8,3.585]],["t/185",[6,1.906]],["t/191",[6,1.906]],["t/195",[6,1.906]],["t/199",[8,3.585]],["t/201",[6,1.906]],["t/203",[51,4.055,52,4.055]],["t/207",[6,1.906]],["t/211",[53,4.394,54,4.908]],["t/213",[55,4.908,56,4.908]],["t/215",[6,1.906]],["t/219",[6,1.906]],["t/223",[6,1.906]],["t/227",[3,2.858,57,4.908]],["t/229",[58,4.908,59,4.055]],["t/231",[59,5.087]],["t/233",[60,4.394,61,3.289]],["t/235",[6,1.52,61,3.289]],["t/237",[5,2.734,62,3.162,63,3.653]],["t/239",[61,2.734,64,4.081,65,4.081]],["t/241",[66,4.908,67,4.394]],["t/243",[68,5.511]],["t/245",[69,4.516]],["t/249",[6,1.906]],["t/251",[62,4.769]],["t/253",[61,3.289,70,4.055]],["t/255",[6,1.52,71,4.394]],["t/257",[69,4.516]],["t/258",[26,2.426,72,2.24,73,1.746,74,2.426,75,2.1,76,2.426]],["t/260",[72,2.886,73,2.25,77,3.492,78,3.492]],["t/262",[73,1.967,79,2.732,80,3.927,81,3.052]],["t/266",[63,3.653,82,4.081,83,4.081]],["t/268",[73,3.163,84,4.908]],["t/270",[6,1.906]],["t/271",[8,2.858,85,4.394]],["t/273",[6,1.52,61,3.289]],["t/275",[59,4.055,62,3.803]],["t/277",[6,1.52,71,4.394]],["t/279",[86,4.055,87,3.601]],["t/281",[88,4.769]],["t/283",[89,6.156]],["t/284",[90,6.156]],["t/286",[52,5.087]],["t/288",[91,6.156]],["t/290",[92,4.908,93,4.908]],["t/291",[70,4.055,94,4.394]],["t/293",[88,3.803,95,4.394]],["t/295",[52,4.055,95,4.394]],["t/297",[75,3.162,86,3.372,96,4.081]],["t/299",[68,5.511]],["t/301",[69,4.516]],["t/302",[97,5.511]],["t/304",[70,4.055,94,4.394]],["t/306",[3,2.034,60,3.126,98,3.492,99,3.492]],["t/308",[61,2.045,75,2.365,86,2.522,87,2.239,100,3.052]],["t/310",[9,1.339,14,2.182,88,1.888,101,2.437,102,2.182,103,2.182,104,2.437]],["t/314",[6,1.906]],["t/316",[88,3.162,105,4.081,106,4.081]],["t/318",[62,4.769]],["t/320",[69,4.516]],["t/321",[107,4.055,108,4.908]],["t/323",[5,2.045,80,2.522,109,2.522,110,3.052,111,2.522]],["t/325",[80,2.522,109,2.522,112,3.052,113,3.052,114,3.052]],["t/327",[5,2.045,73,1.967,111,2.522,115,3.052,116,3.052]],["t/329",[5,1.816,49,2.426,73,1.746,109,2.24,111,2.24,117,2.71]],["t/331",[36,1.888,73,2.56,74,2.182,76,2.182,79,2.182,118,2.437]],["t/336",[119,6.156]],["t/338",[8,2.858,120,4.394]],["t/340",[121,6.156]],["t/342",[122,4.908,123,4.394]],["t/344",[32,4.516]],["t/346",[124,4.908,125,4.908]],["t/348",[5,3.289,126,4.394]],["t/350",[0,2.994,9,2.243,127,3.162]],["t/353",[128,4.055,129,4.908]],["t/354",[130,5.294,131,4.081]],["t/356",[9,2.243,120,3.653,132,3.653]],["t/358",[9,2.243,133,4.081,134,4.081]],["t/359",[8,2.377,75,3.162,135,4.081]],["t/361",[8,2.858,136,4.908]],["t/363",[67,4.394,137,4.908]],["t/367",[138,4.769]],["t/369",[69,2.994,107,3.372,138,3.162]],["t/371",[128,4.055,139,4.908]],["t/373",[140,5.511]],["t/375",[130,5.511]],["t/379",[141,6.156]],["t/381",[97,4.394,142,3.433]],["t/382",[32,2.994,142,2.854,143,4.081]],["t/384",[9,2.243,127,3.162,144,4.081]],["t/386",[9,2.243,32,2.994,145,4.081]],["t/388",[5,2.34,126,3.126,142,2.442,146,3.492]],["t/390",[61,3.289,142,3.433]],["t/392",[142,3.433,147,4.908]],["t/394",[142,3.433,148,4.908]],["t/395",[149,6.156]],["t/397",[7,4.055,9,2.697]],["t/400",[150,4.394,151,4.055]],["t/401",[24,3.126,150,3.126,152,3.492,153,3.492]],["t/403",[154,4.081,155,4.081,156,4.081]],["t/405",[157,3.126,158,3.126,159,3.492,160,3.126]],["t/407",[6,1.52,151,4.055]],["t/408",[32,3.601,72,4.055]],["t/410",[3,2.858,151,4.055]],["t/411",[3,1.579,53,2.426,73,1.746,103,2.426,161,2.24,162,2.426]],["t/413",[160,1.816,161,1.677,163,1.816,164,1.816,165,2.029,166,2.029,167,1.816,168,2.029,169,2.029]],["t/415",[161,2.522,163,2.732,164,2.732,170,3.052,171,3.052]],["t/417",[3,2.034,162,3.126,172,3.492,173,3.492]],["t/419",[3,1.778,44,2.732,157,2.732,158,2.732,174,3.052]],["t/423",[35,3.372,127,3.162,175,4.081]],["t/425",[51,4.055,176,4.055]],["t/427",[51,4.055,102,4.394]],["t/431",[35,2.886,127,2.706,138,2.706,177,3.492]],["t/433",[8,2.858,9,2.697]],["t/435",[3,2.034,13,3.126,87,2.562,178,3.492]],["t/437",[6,1.264,85,3.653,87,2.994]],["t/439",[9,2.243,87,2.994,179,4.081]],["t/441",[0,3.601,8,2.858]],["t/443",[36,3.162,176,3.372,180,3.653]],["t/445",[181,4.908,182,4.908]],["t/449",[36,2.706,167,3.126,180,3.126,183,3.492]],["t/451",[9,3.383]],["t/453",[0,4.516]],["t/455",[176,4.055,184,4.908]],["t/457",[128,5.087]],["t/459",[6,1.906]],["t/461",[107,5.087]],["t/463",[185,6.156]],["t/465",[123,5.511]],["t/467",[186,6.156]],["t/470",[132,5.511]],["t/472",[138,4.769]],["t/474",[140,5.511]]],"invertedIndex":[["add",{"_index":98,"t":{"306":{"position":[[0,3]]}}}],["album",{"_index":49,"t":{"165":{"position":[[0,5]]},"329":{"position":[[25,6]]}}}],["api",{"_index":85,"t":{"271":{"position":[[0,3]]},"437":{"position":[[22,3]]}}}],["app",{"_index":137,"t":{"363":{"position":[[4,3]]}}}],["applic",{"_index":12,"t":{"18":{"position":[[0,11]]}}}],["architectur",{"_index":119,"t":{"336":{"position":[[0,12]]}}}],["arl",{"_index":43,"t":{"101":{"position":[[9,3]]}}}],["artist",{"_index":73,"t":{"258":{"position":[[11,7]]},"260":{"position":[[21,7]]},"262":{"position":[[8,7]]},"268":{"position":[[7,6]]},"327":{"position":[[18,6]]},"329":{"position":[[16,8]]},"331":{"position":[[16,6],[45,6]]},"411":{"position":[[47,7]]}}}],["authent",{"_index":156,"t":{"403":{"position":[[28,12]]}}}],["backlog",{"_index":149,"t":{"395":{"position":[[0,7]]}}}],["base",{"_index":14,"t":{"20":{"position":[[0,4]]},"310":{"position":[[25,5]]}}}],["behavior",{"_index":41,"t":{"93":{"position":[[16,8]]}}}],["best",{"_index":92,"t":{"290":{"position":[[0,4]]}}}],["black/whitelist",{"_index":56,"t":{"213":{"position":[[11,15]]}}}],["blacklist",{"_index":50,"t":{"165":{"position":[[6,9]]}}}],["blacklist/whitelist",{"_index":48,"t":{"163":{"position":[[4,19]]}}}],["build",{"_index":134,"t":{"358":{"position":[[21,5]]}}}],["builder",{"_index":131,"t":{"354":{"position":[[20,7]]}}}],["cach",{"_index":16,"t":{"22":{"position":[[0,7]]}}}],["callback/redirect",{"_index":25,"t":{"40":{"position":[[0,17]]},"46":{"position":[[0,17]]}}}],["cast",{"_index":164,"t":{"413":{"position":[[7,4]]},"415":{"position":[[7,4]]}}}],["class",{"_index":125,"t":{"346":{"position":[[9,5]]}}}],["client",{"_index":0,"t":{"3":{"position":[[0,7]]},"14":{"position":[[18,7]]},"350":{"position":[[9,7]]},"441":{"position":[[6,7]]},"453":{"position":[[0,6]]}}}],["common",{"_index":122,"t":{"342":{"position":[[0,6]]}}}],["compos",{"_index":177,"t":{"431":{"position":[[14,7]]}}}],["concret",{"_index":124,"t":{"346":{"position":[[0,8]]}}}],["condit",{"_index":108,"t":{"321":{"position":[[16,9]]}}}],["condition",{"_index":66,"t":{"241":{"position":[[0,13]]}}}],["config",{"_index":32,"t":{"76":{"position":[[11,6]]},"344":{"position":[[0,6]]},"382":{"position":[[21,6]]},"386":{"position":[[23,6]]},"408":{"position":[[0,6]]}}}],["configur",{"_index":6,"t":{"12":{"position":[[0,13]]},"30":{"position":[[8,14]]},"36":{"position":[[0,13]]},"42":{"position":[[0,13]]},"50":{"position":[[0,13]]},"54":{"position":[[0,13]]},"58":{"position":[[0,13]]},"64":{"position":[[0,13]]},"71":{"position":[[0,13]]},"97":{"position":[[0,13]]},"103":{"position":[[0,13]]},"109":{"position":[[0,13]]},"113":{"position":[[0,13]]},"119":{"position":[[0,13]]},"127":{"position":[[0,13]]},"135":{"position":[[0,13]]},"139":{"position":[[0,13]]},"143":{"position":[[0,13]]},"151":{"position":[[0,13]]},"155":{"position":[[0,13]]},"159":{"position":[[0,13]]},"167":{"position":[[0,13]]},"171":{"position":[[0,13]]},"175":{"position":[[0,13]]},"179":{"position":[[0,13]]},"185":{"position":[[0,13]]},"191":{"position":[[0,13]]},"195":{"position":[[0,13]]},"201":{"position":[[0,13]]},"207":{"position":[[0,13]]},"215":{"position":[[0,13]]},"219":{"position":[[0,13]]},"223":{"position":[[0,13]]},"235":{"position":[[0,11]]},"249":{"position":[[0,13]]},"255":{"position":[[4,13]]},"270":{"position":[[0,13]]},"273":{"position":[[6,13]]},"277":{"position":[[4,13]]},"314":{"position":[[0,13]]},"407":{"position":[[0,13]]},"437":{"position":[[0,9]]},"459":{"position":[[0,13]]}}}],["connect",{"_index":150,"t":{"400":{"position":[[0,10]]},"401":{"position":[[43,7]]}}}],["connector",{"_index":55,"t":{"213":{"position":[[0,10]]}}}],["consider",{"_index":95,"t":{"293":{"position":[[7,14]]},"295":{"position":[[7,14]]}}}],["content",{"_index":113,"t":{"325":{"position":[[25,7]]}}}],["control",{"_index":65,"t":{"239":{"position":[[11,7]]}}}],["coolplay",{"_index":144,"t":{"384":{"position":[[7,10]]}}}],["correct",{"_index":178,"t":{"435":{"position":[[11,7]]}}}],["correctli",{"_index":162,"t":{"411":{"position":[[55,9]]},"417":{"position":[[29,9]]}}}],["creat",{"_index":127,"t":{"350":{"position":[[0,8]]},"384":{"position":[[0,6]]},"423":{"position":[[0,6]]},"431":{"position":[[0,6]]}}}],["custom",{"_index":26,"t":{"48":{"position":[[0,6]]},"258":{"position":[[34,6]]}}}],["data",{"_index":63,"t":{"237":{"position":[[15,4]]},"266":{"position":[[21,4]]}}}],["dead",{"_index":2,"t":{"6":{"position":[[0,4]]}}}],["debug",{"_index":17,"t":{"24":{"position":[[0,5]]}}}],["default",{"_index":70,"t":{"253":{"position":[[0,7]]},"291":{"position":[[9,7]]},"304":{"position":[[9,7]]}}}],["defin",{"_index":143,"t":{"382":{"position":[[0,6]]}}}],["delimit",{"_index":76,"t":{"258":{"position":[[41,9]]},"331":{"position":[[28,10]]}}}],["destin",{"_index":39,"t":{"89":{"position":[[18,11]]}}}],["detect",{"_index":45,"t":{"105":{"position":[[10,9]]}}}],["develop",{"_index":123,"t":{"342":{"position":[[7,11]]},"465":{"position":[[0,11]]}}}],["devic",{"_index":170,"t":{"415":{"position":[[12,6]]}}}],["device/us",{"_index":37,"t":{"87":{"position":[[6,11]]}}}],["differ",{"_index":101,"t":{"310":{"position":[[0,9]]}}}],["disabl",{"_index":19,"t":{"26":{"position":[[0,7]]}}}],["docker",{"_index":138,"t":{"367":{"position":[[0,6]]},"369":{"position":[[0,6]]},"431":{"position":[[7,6]]},"472":{"position":[[0,6]]}}}],["doesn't",{"_index":153,"t":{"401":{"position":[[35,7]]}}}],["don't",{"_index":77,"t":{"260":{"position":[[0,5]]}}}],["duplic",{"_index":44,"t":{"105":{"position":[[0,9]]},"419":{"position":[[24,10]]}}}],["enabl",{"_index":179,"t":{"439":{"position":[[0,6]]}}}],["end",{"_index":114,"t":{"325":{"position":[[42,3]]}}}],["endpoint",{"_index":24,"t":{"32":{"position":[[7,8]]},"401":{"position":[[26,8]]}}}],["env",{"_index":71,"t":{"255":{"position":[[0,3]]},"277":{"position":[[0,3]]}}}],["exampl",{"_index":69,"t":{"245":{"position":[[0,8]]},"257":{"position":[[0,8]]},"301":{"position":[[0,8]]},"320":{"position":[[0,8]]},"369":{"position":[[13,7]]}}}],["express",{"_index":106,"t":{"316":{"position":[[19,10]]}}}],["extract",{"_index":79,"t":{"262":{"position":[[0,7]]},"331":{"position":[[0,7]]}}}],["fail",{"_index":159,"t":{"405":{"position":[[14,5]]}}}],["featur",{"_index":1,"t":{"5":{"position":[[0,8]]},"84":{"position":[[0,8]]}}}],["field",{"_index":173,"t":{"417":{"position":[[22,6]]}}}],["file",{"_index":35,"t":{"78":{"position":[[14,5]]},"423":{"position":[[14,4]]},"431":{"position":[[22,4]]}}}],["filter",{"_index":52,"t":{"203":{"position":[[8,9]]},"286":{"position":[[0,9]]},"295":{"position":[[0,6]]}}}],["flatpak",{"_index":130,"t":{"354":{"position":[[0,7],[12,7]]},"375":{"position":[[0,7]]}}}],["flow",{"_index":64,"t":{"239":{"position":[[6,4]]}}}],["further",{"_index":148,"t":{"394":{"position":[[0,7]]}}}],["gener",{"_index":133,"t":{"358":{"position":[[0,8]]}}}],["googl",{"_index":163,"t":{"413":{"position":[[0,6]]},"415":{"position":[[0,6]]}}}],["handl",{"_index":29,"t":{"65":{"position":[[0,6]]}}}],["health",{"_index":23,"t":{"32":{"position":[[0,6]]}}}],["help/faq",{"_index":185,"t":{"463":{"position":[[0,8]]}}}],["hook",{"_index":59,"t":{"229":{"position":[[9,5]]},"231":{"position":[[0,4]]},"275":{"position":[[10,5]]}}}],["identifi",{"_index":30,"t":{"72":{"position":[[0,10]]}}}],["implement",{"_index":142,"t":{"381":{"position":[[8,14]]},"382":{"position":[[11,9]]},"388":{"position":[[0,9]]},"390":{"position":[[0,9]]},"392":{"position":[[0,9]]},"394":{"position":[[8,14]]}}}],["inform",{"_index":165,"t":{"413":{"position":[[18,11]]}}}],["initi",{"_index":145,"t":{"386":{"position":[[0,10]]}}}],["instal",{"_index":128,"t":{"353":{"position":[[0,7]]},"371":{"position":[[6,12]]},"457":{"position":[[0,12]]}}}],["instanc",{"_index":28,"t":{"48":{"position":[[16,8]]}}}],["intend",{"_index":84,"t":{"268":{"position":[[14,8]]}}}],["interpol",{"_index":11,"t":{"16":{"position":[[8,13]]}}}],["issu",{"_index":151,"t":{"400":{"position":[[11,6]]},"407":{"position":[[14,6]]},"410":{"position":[[11,6]]}}}],["journey",{"_index":57,"t":{"227":{"position":[[0,7]]}}}],["json",{"_index":34,"t":{"78":{"position":[[9,4]]}}}],["last.fm",{"_index":103,"t":{"310":{"position":[[41,8]]},"411":{"position":[[0,7]]}}}],["libre.fm",{"_index":27,"t":{"48":{"position":[[7,8]]}}}],["licens",{"_index":186,"t":{"467":{"position":[[0,7]]}}}],["lifecyl",{"_index":58,"t":{"229":{"position":[[0,8]]}}}],["limit",{"_index":38,"t":{"89":{"position":[[0,8]]}}}],["local",{"_index":139,"t":{"371":{"position":[[0,5]]}}}],["log",{"_index":68,"t":{"243":{"position":[[0,7]]},"299":{"position":[[0,7]]}}}],["mainstream",{"_index":83,"t":{"266":{"position":[[10,10]]}}}],["manual",{"_index":136,"t":{"361":{"position":[[0,6]]}}}],["match",{"_index":86,"t":{"279":{"position":[[0,8]]},"297":{"position":[[14,5]]},"308":{"position":[[35,7]]}}}],["media",{"_index":171,"t":{"415":{"position":[[34,5]]}}}],["metadata",{"_index":99,"t":{"306":{"position":[[4,8]]}}}],["method",{"_index":102,"t":{"310":{"position":[[17,7]]},"427":{"position":[[14,7]]}}}],["minim",{"_index":97,"t":{"302":{"position":[[0,7]]},"381":{"position":[[0,7]]}}}],["miss",{"_index":174,"t":{"419":{"position":[[14,6]]}}}],["missing/incorrect",{"_index":166,"t":{"413":{"position":[[33,17]]}}}],["misspel",{"_index":116,"t":{"327":{"position":[[7,10]]}}}],["mode",{"_index":18,"t":{"24":{"position":[[6,4]]}}}],["modif",{"_index":60,"t":{"233":{"position":[[0,12]]},"306":{"position":[[31,13]]}}}],["modifi",{"_index":81,"t":{"262":{"position":[[38,6]]}}}],["monitor",{"_index":21,"t":{"28":{"position":[[0,10]]}}}],["more",{"_index":82,"t":{"266":{"position":[[0,4]]}}}],["ms",{"_index":167,"t":{"413":{"position":[[54,2]]},"449":{"position":[[25,4]]}}}],["multi",{"_index":36,"t":{"87":{"position":[[0,5]]},"331":{"position":[[39,5]]},"443":{"position":[[6,5]]},"449":{"position":[[9,5]]}}}],["multipl",{"_index":53,"t":{"211":{"position":[[0,8]]},"411":{"position":[[38,8]]}}}],["music",{"_index":158,"t":{"405":{"position":[[8,5]]},"419":{"position":[[8,5]]}}}],["musicbrainz",{"_index":87,"t":{"279":{"position":[[14,11]]},"308":{"position":[[23,11]]},"435":{"position":[[34,11]]},"437":{"position":[[10,11]]},"439":{"position":[[7,11]]}}}],["nativ",{"_index":100,"t":{"308":{"position":[[4,6]]}}}],["new",{"_index":111,"t":{"323":{"position":[[32,3]]},"327":{"position":[[32,3]]},"329":{"position":[[39,3]]}}}],["next",{"_index":181,"t":{"445":{"position":[[0,4]]}}}],["nodej",{"_index":140,"t":{"373":{"position":[[0,6]]},"474":{"position":[[0,6]]}}}],["now",{"_index":4,"t":{"8":{"position":[[0,3]]}}}],["object",{"_index":126,"t":{"348":{"position":[[5,6]]},"388":{"position":[[15,6]]}}}],["on",{"_index":31,"t":{"76":{"position":[[7,3]]}}}],["option",{"_index":13,"t":{"18":{"position":[[12,7]]},"435":{"position":[[0,10]]}}}],["parenthes",{"_index":112,"t":{"325":{"position":[[11,13]]}}}],["pars",{"_index":72,"t":{"258":{"position":[[0,5]]},"260":{"position":[[6,5]]},"408":{"position":[[20,6]]}}}],["partial",{"_index":96,"t":{"297":{"position":[[6,7]]}}}],["phrase",{"_index":110,"t":{"323":{"position":[[7,6]]}}}],["play",{"_index":5,"t":{"8":{"position":[[4,7]]},"237":{"position":[[10,4]]},"323":{"position":[[36,5]]},"327":{"position":[[36,5]]},"329":{"position":[[43,5]]},"348":{"position":[[0,4]]},"388":{"position":[[10,4]]}}}],["player",{"_index":168,"t":{"413":{"position":[[57,6]]}}}],["poll",{"_index":147,"t":{"392":{"position":[[10,7]]}}}],["practic",{"_index":93,"t":{"290":{"position":[[5,9]]}}}],["primari",{"_index":118,"t":{"331":{"position":[[8,7]]}}}],["project",{"_index":120,"t":{"338":{"position":[[0,7]]},"356":{"position":[[7,7]]}}}],["quick",{"_index":184,"t":{"455":{"position":[[0,5]]}}}],["refin",{"_index":89,"t":{"283":{"position":[[0,8]]}}}],["remov",{"_index":109,"t":{"323":{"position":[[0,6]]},"325":{"position":[[0,6]]},"329":{"position":[[0,6]]}}}],["renam",{"_index":115,"t":{"327":{"position":[[0,6]]}}}],["replac",{"_index":105,"t":{"316":{"position":[[11,7]]}}}],["requir",{"_index":129,"t":{"353":{"position":[[8,12]]}}}],["retriev",{"_index":42,"t":{"101":{"position":[[0,8]]}}}],["rule",{"_index":62,"t":{"237":{"position":[[0,5]]},"251":{"position":[[0,5]]},"275":{"position":[[0,5]]},"318":{"position":[[0,5]]}}}],["run",{"_index":67,"t":{"241":{"position":[[14,3]]},"363":{"position":[[0,3]]}}}],["scenario",{"_index":141,"t":{"379":{"position":[[0,8]]}}}],["score",{"_index":90,"t":{"284":{"position":[[0,5]]}}}],["script",{"_index":135,"t":{"359":{"position":[[10,6]]}}}],["scrobbl",{"_index":3,"t":{"6":{"position":[[5,9]]},"89":{"position":[[9,8]]},"91":{"position":[[0,8]]},"93":{"position":[[7,8]]},"227":{"position":[[13,8]]},"306":{"position":[[22,8]]},"410":{"position":[[0,10]]},"411":{"position":[[17,8]]},"417":{"position":[[11,10]]},"419":{"position":[[35,9]]},"435":{"position":[[19,9]]}}}],["scrobbler",{"_index":180,"t":{"443":{"position":[[12,9]]},"449":{"position":[[15,9]]}}}],["search",{"_index":88,"t":{"281":{"position":[[0,9]]},"293":{"position":[[0,6]]},"310":{"position":[[10,6]]},"316":{"position":[[0,6]]}}}],["secret",{"_index":10,"t":{"16":{"position":[[0,7]]}}}],["sensibl",{"_index":94,"t":{"291":{"position":[[0,8]]},"304":{"position":[[0,8]]}}}],["separ",{"_index":33,"t":{"78":{"position":[[0,8]]}}}],["servic",{"_index":51,"t":{"203":{"position":[[0,7]]},"425":{"position":[[10,7]]},"427":{"position":[[6,7]]}}}],["setup",{"_index":8,"t":{"14":{"position":[[0,5]]},"62":{"position":[[0,5]]},"69":{"position":[[0,5]]},"183":{"position":[[0,5]]},"199":{"position":[[0,5]]},"271":{"position":[[4,5]]},"338":{"position":[[8,5]]},"359":{"position":[[4,5]]},"361":{"position":[[7,5]]},"433":{"position":[[0,5]]},"441":{"position":[[0,5]]}}}],["sort",{"_index":91,"t":{"288":{"position":[[0,7]]}}}],["sourc",{"_index":9,"t":{"14":{"position":[[6,7]]},"82":{"position":[[0,7]]},"85":{"position":[[9,7]]},"310":{"position":[[34,6]]},"350":{"position":[[21,7]]},"356":{"position":[[15,6]]},"358":{"position":[[9,7]]},"384":{"position":[[18,6]]},"386":{"position":[[11,6]]},"397":{"position":[[6,6]]},"433":{"position":[[6,7]]},"439":{"position":[[25,6]]},"451":{"position":[[0,6]]}}}],["specif",{"_index":78,"t":{"260":{"position":[[12,8]]}}}],["spotifi",{"_index":104,"t":{"310":{"position":[[54,8]]}}}],["spotify/deezer/lastfm",{"_index":154,"t":{"403":{"position":[[0,21]]}}}],["stage",{"_index":61,"t":{"233":{"position":[[13,5]]},"235":{"position":[[12,6]]},"239":{"position":[[0,5]]},"253":{"position":[[8,5]]},"273":{"position":[[0,5]]},"308":{"position":[[11,5]]},"390":{"position":[[10,6]]}}}],["start",{"_index":176,"t":{"425":{"position":[[0,5]]},"443":{"position":[[0,5]]},"455":{"position":[[6,5]]}}}],["step",{"_index":182,"t":{"445":{"position":[[5,5]]}}}],["string",{"_index":74,"t":{"258":{"position":[[19,6]]},"331":{"position":[[52,6]]}}}],["threshold",{"_index":40,"t":{"91":{"position":[[9,10]]}}}],["time",{"_index":160,"t":{"405":{"position":[[31,4]]},"413":{"position":[[74,5]]}}}],["titl",{"_index":80,"t":{"262":{"position":[[21,5],[45,5]]},"323":{"position":[[19,5]]},"325":{"position":[[51,5]]}}}],["token",{"_index":46,"t":{"149":{"position":[[0,5]]}}}],["track",{"_index":161,"t":{"411":{"position":[[26,6]]},"413":{"position":[[12,5]]},"415":{"position":[[28,5]]}}}],["transform",{"_index":146,"t":{"388":{"position":[[22,9]]}}}],["type",{"_index":7,"t":{"12":{"position":[[14,5]]},"85":{"position":[[0,5]]},"397":{"position":[[13,5]]}}}],["unit",{"_index":175,"t":{"423":{"position":[[9,4]]}}}],["updat",{"_index":132,"t":{"356":{"position":[[0,6]]},"470":{"position":[[0,8]]}}}],["uri",{"_index":47,"t":{"163":{"position":[[0,3]]}}}],["url",{"_index":15,"t":{"20":{"position":[[5,3]]},"40":{"position":[[18,3]]},"46":{"position":[[18,3]]},"117":{"position":[[0,3]]},"125":{"position":[[0,3]]},"133":{"position":[[0,3]]},"147":{"position":[[0,3]]}}}],["us",{"_index":75,"t":{"258":{"position":[[26,5]]},"297":{"position":[[0,5]]},"308":{"position":[[0,3]]},"359":{"position":[[0,3]]}}}],["usag",{"_index":107,"t":{"321":{"position":[[0,5]]},"369":{"position":[[7,5]]},"461":{"position":[[0,5]]}}}],["user",{"_index":54,"t":{"211":{"position":[[9,5]]}}}],["variou",{"_index":117,"t":{"329":{"position":[[7,8]]}}}],["vlc",{"_index":172,"t":{"417":{"position":[[0,3]]}}}],["vscode",{"_index":121,"t":{"340":{"position":[[0,6]]}}}],["web",{"_index":20,"t":{"26":{"position":[[8,3]]}}}],["webhook",{"_index":22,"t":{"30":{"position":[[0,7]]}}}],["webscrobbler/listenbrainz",{"_index":152,"t":{"401":{"position":[[0,25]]}}}],["weird",{"_index":169,"t":{"413":{"position":[[68,5]]}}}],["won't",{"_index":155,"t":{"403":{"position":[[22,5]]}}}],["work",{"_index":183,"t":{"449":{"position":[[30,5]]}}}],["youtub",{"_index":157,"t":{"405":{"position":[[0,7]]},"419":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":1,"t":"A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz...","s":"Overview","u":"/multi-scrobbler/configuration/clients/","p":1},{"i":10,"t":"Check the FAQ if you have any issues after configuration!","s":"Overview","u":"/multi-scrobbler/configuration/","p":10},{"i":34,"t":"To monitor and re-scrobble activity from a Koito account create a Koito (Source)","s":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","p":34},{"i":38,"t":"* To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a Last.fm (Source)","s":"Last.fm","u":"/multi-scrobbler/configuration/clients/lastfm/","p":38},{"i":44,"t":"* To monitor and re-scrobble activity from your Libre.fm account create a Libre.fm (Source)","s":"Libre.fm","u":"/multi-scrobbler/configuration/clients/librefm/","p":44},{"i":52,"t":"Setup a Maloja server if you have not already done this.","s":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","p":52},{"i":56,"t":"* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)","s":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","p":56},{"i":60,"t":"To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)","s":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","p":60},{"i":67,"t":"To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source)","s":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","p":67},{"i":74,"t":"Scenario:","s":"Example Complex Scenario","u":"/multi-scrobbler/configuration/kitchensink/","p":74},{"i":80,"t":"A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc...","s":"Overview","u":"/multi-scrobbler/configuration/sources/","p":80},{"i":95,"t":"Azuracast may not correctly report track length or position. If this is the case you should reduce the \"listened to\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly.","s":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","p":95},{"i":99,"t":"This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer's TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk.","s":"Deezer","u":"/multi-scrobbler/configuration/sources/deezer/","p":99},{"i":107,"t":"If your media device can be Cast to using this button Chromecast Icon on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play.","s":"Google Cast (Chromecast)","u":"/multi-scrobbler/configuration/sources/google-cast/","p":107},{"i":111,"t":"Parse metadata from any Icecast Station (streams) to use for scrobbling.","s":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","p":111},{"i":115,"t":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can can be in the JRiver GUI:","s":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","p":115},{"i":121,"t":"Must be using Jellyfin 10.7 or greater","s":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","p":121},{"i":123,"t":"In order for multi-scrobbler to communicate with Kodi you must have the Web Interface enabled. This can be done in the Kodi GUI:","s":"Kodi","u":"/multi-scrobbler/configuration/sources/kodi/","p":123},{"i":129,"t":"This Source monitors a Koito account's scrobble history and then re-scrobbles discovered tracks to configured Clients.","s":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","p":129},{"i":131,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server.","s":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","p":131},{"i":137,"t":"This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients.","s":"Last.fm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","p":137},{"i":141,"t":"This Source monitors your Libre.fm scrobble history and re-scrobbles new activity to configured Clients.","s":"Libre.fm","u":"/multi-scrobbler/configuration/sources/librefm-source/","p":141},{"i":145,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server.","s":"Listenbrainz (Endpoint)","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","p":145},{"i":153,"t":"This Source monitors a Listenbrainz account's scrobble history and then re-scrobbles discovered tracks to configured clients.","s":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","p":153},{"i":157,"t":"To scrobble to a Maloja server, create a Maloja (Client)","s":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","p":157},{"i":161,"t":"Mopidy is a headless music server that supports playing music from many standard and non-standard sources such as Pandora, Bandcamp, and Tunein.","s":"Mopidy","u":"/multi-scrobbler/configuration/sources/mopidy/","p":161},{"i":169,"t":"MPRIS is a standard interface for communicating with Music Players on linux operating systems.","s":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","p":169},{"i":173,"t":"MS communicates with MPD using the TCP client connection.","s":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","p":173},{"i":177,"t":"In order to use Musikcube configure it to accept websocket connections in server setup:","s":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","p":177},{"i":181,"t":"To scrobble to* Rocksky, create a Rocksky (Client)","s":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","p":181},{"i":187,"t":"Find your Plex Token and make note of the URL and Port used to connect to your Plex instance.","s":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","p":187},{"i":189,"t":"If your Spotify player has Automix enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is \"mixed\" in your queue with a shorter play time than its actual length and Spotify does not report this modified play time in its API. This does not affect MS's ability to scrobble from Spotify but it will affect the accuracy of the duration MS reports was played.","s":"Spotify","u":"/multi-scrobbler/configuration/sources/spotify/","p":189},{"i":193,"t":"This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome)","s":"Subsonic","u":"/multi-scrobbler/configuration/sources/subsonic/","p":193},{"i":197,"t":"To scrobble to* an ATProto PDS, create a teal.fm (Client)","s":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","p":197},{"i":205,"t":"MS communicates with VLC using the Web (http) interface module","s":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","p":205},{"i":209,"t":"After installing the Webscrobbler extension open the preferences/settings for it:","s":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","p":209},{"i":217,"t":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs.","s":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","p":217},{"i":221,"t":"Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser.","s":"Youtube Music","u":"/multi-scrobbler/configuration/sources/youtube-music/","p":221},{"i":225,"t":"Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler's lifecycle.","s":"Enhancing Scrobbles","u":"/multi-scrobbler/configuration/transforms/","p":225},{"i":247,"t":"The Native Stage uses built-in heuristics to try to extract Artists from Play artist/track data.","s":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","p":247},{"i":264,"t":"The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data.","s":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","p":264},{"i":312,"t":"The User Stage uses search-and-replace expressions, provided by you, to modify/replace parts of Play data.","s":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","p":312},{"i":333,"t":"To do...","s":"Client Development/Tutorial","u":"/multi-scrobbler/development/dev-client/","p":333},{"i":335,"t":"Start here for MS development","s":"Development","u":"/multi-scrobbler/development/dev-common/","p":335},{"i":352,"t":"Building Flatpak App locally","s":"Flatpak","u":"/multi-scrobbler/development/flatpak/","p":352},{"i":365,"t":"For the difference between ENV and File examples in this document see Configuration Types.","s":"Overview","u":"/multi-scrobbler/installation/","p":365},{"i":377,"t":"This document will provide a step-by-step guide for creating a (trivial) new Source in MS alongside describing what aspects of the Source need to be implemented based on the service you use. Before using this document you should review Common Development.","s":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","p":377},{"i":399,"t":"Connection Issues","s":"FAQ","u":"/multi-scrobbler/FAQ/","p":399},{"i":421,"t":"If you have multi-scrobbler installed locally you can enable it to run as a background service when you login.","s":"Systemd","u":"/multi-scrobbler/installation/service/","p":421},{"i":429,"t":"This guide will get you up and running with multi-scrobbler using Docker and docker compose. At the end of the guide you will have:","s":"Quickstart","u":"/multi-scrobbler/quickstart/","p":429},{"i":447,"t":"Latest Release","s":"Overview","u":"/multi-scrobbler/","p":447},{"i":469,"t":"Updating","s":"Overview","u":"/multi-scrobbler/updating/","p":469}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,1.611,1,2.311,2,3.34,3,3.34,4,2.546,5,3.34,6,1.611,7,0.845,8,2.546,9,2.546,10,2.311,11,2.311]],["t/10",[12,4.755,13,4.755,14,4.074,15,2.608]],["t/34",[7,0.952,16,1.524,17,1.708,18,1.93,19,4.355,20,2.601,21,1.708,22,1.169]],["t/38",[7,0.913,10,2.497,16,1.462,17,1.639,18,1.853,20,2.497,21,1.639,22,1.122,23,2.751,24,3.609]],["t/44",[7,0.913,16,1.462,17,1.639,18,1.853,20,2.497,21,1.639,22,1.122,23,2.751,25,4.235]],["t/52",[9,3.443,26,3.869,27,2.477,28,4.516,29,3.869]],["t/56",[7,0.913,11,3.42,16,1.462,17,1.639,18,1.853,20,2.497,21,1.639,22,1.122,23,2.751]],["t/60",[7,0.993,16,1.59,17,1.782,18,2.015,21,1.782,22,1.22,30,4.481]],["t/67",[7,0.952,16,1.524,17,1.708,18,1.93,21,1.708,22,1.169,31,3.221,32,3.76,33,3.221]],["t/74",[34,5.653]],["t/80",[4,2.082,6,1.317,8,2.082,22,1.259,35,1.608,36,2.731,37,1.736,38,2.385,39,2.082,40,2.731,41,2.34,42,2.34,43,2.34,44,2.731,45,2.34,46,2.731]],["t/95",[7,1.049,37,1.79,47,2.817,48,4.145,49,2.413,50,2.413,51,2.817,52,2.817,53,2.817,54,2.817,55,2.413,56,0.922,57,2.817,58,1.279,59,1.279]],["t/99",[22,1.205,35,1.516,56,1.269,60,2.206,61,3.876,62,2.575,63,3.876,64,2.575,65,2.575,66,2.575,67,2.206,68,2.575,69,1.781,70,2.575,71,2.575,72,2.575]],["t/107",[6,1.449,7,0.761,16,1.218,38,1.769,56,0.984,58,1.365,59,1.365,73,3.005,74,3.005,75,3.005,76,3.005,77,3.005,78,3.005,79,3.005,80,2.079]],["t/111",[7,1.039,56,1.343,81,4.104,82,4.104,83,4.104,84,4.104,85,4.104]],["t/115",[27,1.903,58,1.576,59,1.576,80,2.4,86,2.042,87,4.811,88,2.645,89,2.4,90,2.042,91,2.972]],["t/121",[42,4.074,56,1.557,92,4.755,93,4.755]],["t/123",[29,2.972,58,1.576,59,1.576,80,2.4,86,2.042,88,2.645,89,2.4,90,2.042,91,2.972,94,4.811]],["t/129",[0,1.611,7,1.186,15,1.832,16,1.354,17,1.517,19,2.862,22,1.038,37,2.123,95,2.862,96,2.311,97,2.862]],["t/131",[1,2.497,7,0.913,10,2.497,22,1.122,27,1.98,58,1.639,59,1.639,90,2.124,98,2.751,99,3.092]],["t/137",[0,1.673,7,1.218,10,2.4,15,1.903,16,1.406,17,1.576,18,1.781,22,1.078,96,2.4,100,2.645]],["t/141",[0,1.673,7,1.218,15,1.903,16,1.406,17,1.576,18,1.781,22,1.078,25,2.972,96,2.4,100,2.645]],["t/145",[1,2.497,7,0.913,11,2.497,22,1.122,27,1.98,58,1.639,59,1.639,90,2.124,98,2.751,99,3.092]],["t/153",[0,1.611,7,1.186,11,2.311,15,1.832,16,1.354,17,1.517,22,1.038,37,2.123,95,2.862,96,2.311,97,2.862]],["t/157",[0,2.073,7,1.088,9,4.234,21,1.953,27,2.359]],["t/161",[6,1.402,22,0.904,27,1.595,38,2.498,101,2.908,102,2.908,103,2.012,104,2.491,105,3.635,106,2.908,107,2.491,108,2.908,109,2.908,110,2.908]],["t/169",[38,2.213,39,2.866,86,2.213,89,2.601,105,3.221,111,3.76,112,3.76,113,3.76,114,3.76]],["t/173",[0,1.979,56,1.343,86,2.416,115,2.608,116,4.104,117,4.104,118,2.839]],["t/177",[15,2.062,26,3.221,27,2.062,56,1.231,80,2.601,98,2.866,118,2.601,119,3.76,120,3.76]],["t/181",[0,2.178,7,1.143,21,2.051,30,4.91]],["t/187",[43,4.121,56,1.136,118,2.4,121,3.469,122,3.469,123,3.469,124,3.469,125,3.469,126,3.469,127,3.469]],["t/189",[6,1.737,7,0.438,37,1.802,39,1.32,41,3.569,49,2.43,50,1.483,55,1.483,56,0.567,69,1.962,90,1.019,115,1.802,128,1.731,129,1.731,130,1.731,131,1.731,132,1.483,133,1.731,134,1.731,135,1.731,136,1.731,137,1.731,138,1.483,139,2.836,140,1.731,141,1.483,142,1.731]],["t/193",[1,2.311,22,1.038,45,2.862,56,1.093,103,2.311,107,2.862,138,2.862,143,2.862,144,3.34,145,3.34,146,3.34,147,3.34]],["t/197",[0,2.073,7,1.088,21,1.953,31,3.684,33,3.684,148,4.3]],["t/205",[56,1.285,86,2.31,88,2.992,89,2.715,115,2.494,149,3.924,150,3.924,151,3.924]],["t/209",[152,3.869,153,4.516,154,4.516,155,4.516,156,4.516]],["t/217",[6,1.979,16,1.663,38,2.416,157,4.104,158,4.104,159,4.104,160,4.104]],["t/221",[38,2.332,60,2.271,67,2.271,69,1.834,86,1.56,103,1.834,161,3.962,162,2.65,163,3.962,164,2.65,165,2.65,166,2.65,167,3.962,168,2.65,169,2.65]],["t/225",[7,0.616,35,1.433,58,1.688,59,1.106,69,1.685,103,1.685,104,2.086,141,2.086,170,2.435,171,2.435,172,2.435,173,2.435,174,2.086,175,2.086,176,2.435,177,2.435,178,2.086,179,2.435,180,2.086,181,2.435,182,2.435]],["t/247",[6,1.673,35,2.042,56,1.136,178,2.972,183,3.469,184,2.645,185,3.469,186,3.469,187,3.469,188,3.469,189,3.469]],["t/264",[4,1.908,6,1.83,35,2.234,56,0.819,58,1.137,59,1.137,174,3.926,184,1.908,190,3.795,191,2.503,192,2.503,193,2.503,194,2.503,195,2.503,196,2.503,197,2.503]],["t/312",[6,1.673,35,2.042,56,1.136,175,2.972,184,2.645,198,3.469,199,3.469,200,3.469,201,2.972,202,3.469,203,3.469]],["t/333",[]],["t/335",[115,3.022,204,4.755,205,4.755,206,4.074]],["t/352",[207,4.755,208,4.755,209,4.755,210,4.074]],["t/365",[8,2.866,15,2.062,180,3.221,211,3.76,212,3.76,213,3.76,214,3.221,215,3.76,216,3.76]],["t/377",[21,1.023,22,1.088,56,1.145,100,1.717,115,1.431,143,1.929,201,1.929,206,1.929,214,2.998,217,3.499,218,1.929,219,2.252,220,2.252,221,2.252,222,2.252,223,2.252,224,2.252,225,1.929,226,2.252,227,2.252,228,2.252]],["t/399",[14,4.556,118,3.679]],["t/421",[58,1.708,59,1.708,90,2.213,152,3.221,210,3.221,225,3.221,229,3.221,230,3.76,231,3.76]],["t/429",[56,1.136,58,1.576,59,1.576,132,2.972,218,4.121,229,2.972,232,3.469,233,4.811,234,3.469]],["t/447",[235,5.318,236,5.318]],["t/469",[237,5.653]]],"invertedIndex":[["",{"_index":23,"t":{"38":{"position":[[0,1]]},"44":{"position":[[0,1]]},"56":{"position":[[0,1]]}}}],["10.7",{"_index":92,"t":{"121":{"position":[[23,4]]}}}],["abil",{"_index":141,"t":{"189":{"position":[[335,7]]},"225":{"position":[[36,7]]}}}],["accept",{"_index":98,"t":{"131":{"position":[[39,6]]},"145":{"position":[[39,6]]},"177":{"position":[[42,6]]}}}],["access",{"_index":62,"t":{"99":{"position":[[39,6]]}}}],["account",{"_index":20,"t":{"34":{"position":[[49,7]]},"38":{"position":[[65,7]]},"44":{"position":[[57,7]]},"56":{"position":[[58,7]]}}}],["account'",{"_index":95,"t":{"129":{"position":[[29,9]]},"153":{"position":[[36,9]]}}}],["accur",{"_index":130,"t":{"189":{"position":[[102,10]]}}}],["accuraci",{"_index":142,"t":{"189":{"position":[[391,8]]}}}],["activ",{"_index":18,"t":{"34":{"position":[[27,8]]},"38":{"position":[[29,8]]},"44":{"position":[[29,8]]},"56":{"position":[[29,8]]},"60":{"position":[[27,8]]},"67":{"position":[[27,8]]},"137":{"position":[[72,8]]},"141":{"position":[[73,8]]}}}],["actual",{"_index":136,"t":{"189":{"position":[[231,6]]}}}],["affect",{"_index":139,"t":{"189":{"position":[[323,6],[380,6]]}}}],["airson",{"_index":45,"t":{"80":{"position":[[167,9]]},"193":{"position":[[126,8]]}}}],["album",{"_index":179,"t":{"225":{"position":[[150,5]]}}}],["alongsid",{"_index":220,"t":{"377":{"position":[[90,9]]}}}],["alreadi",{"_index":28,"t":{"52":{"position":[[38,7]]}}}],["api",{"_index":138,"t":{"189":{"position":[[304,4]]},"193":{"position":[[73,3]]}}}],["app",{"_index":209,"t":{"352":{"position":[[17,3]]}}}],["applic",{"_index":1,"t":{"1":{"position":[[15,11]]},"131":{"position":[[69,12]]},"145":{"position":[[69,12]]},"193":{"position":[[32,11]]}}}],["artist",{"_index":178,"t":{"225":{"position":[[137,8]]},"247":{"position":[[60,7]]}}}],["artist/track",{"_index":189,"t":{"247":{"position":[[78,12]]}}}],["aspect",{"_index":222,"t":{"377":{"position":[[116,7]]}}}],["atproto",{"_index":31,"t":{"67":{"position":[[43,7]]},"197":{"position":[[19,7]]}}}],["autom",{"_index":172,"t":{"225":{"position":[[75,9]]}}}],["automix",{"_index":128,"t":{"189":{"position":[[27,7]]}}}],["azuracast",{"_index":47,"t":{"95":{"position":[[0,9]]}}}],["background",{"_index":230,"t":{"421":{"position":[[76,10]]}}}],["bandcamp",{"_index":109,"t":{"161":{"position":[[123,9]]}}}],["base",{"_index":224,"t":{"377":{"position":[[161,5]]}}}],["befor",{"_index":226,"t":{"377":{"position":[[191,6]]}}}],["between",{"_index":211,"t":{"365":{"position":[[19,7]]}}}],["break",{"_index":70,"t":{"99":{"position":[[159,8]]}}}],["browser",{"_index":169,"t":{"221":{"position":[[199,8]]}}}],["build",{"_index":207,"t":{"352":{"position":[[0,8]]}}}],["built",{"_index":185,"t":{"247":{"position":[[22,5]]}}}],["button",{"_index":76,"t":{"107":{"position":[[47,6]]}}}],["case",{"_index":52,"t":{"95":{"position":[[76,4]]}}}],["cast",{"_index":75,"t":{"107":{"position":[[28,4]]}}}],["chang",{"_index":67,"t":{"99":{"position":[[115,6]]},"221":{"position":[[166,6]]}}}],["check",{"_index":12,"t":{"10":{"position":[[0,5]]}}}],["chromecast",{"_index":77,"t":{"107":{"position":[[54,10]]}}}],["client",{"_index":0,"t":{"1":{"position":[[2,6]]},"129":{"position":[[110,8]]},"137":{"position":[[95,8]]},"141":{"position":[[96,8]]},"153":{"position":[[117,8]]},"157":{"position":[[49,8]]},"173":{"position":[[39,6]]},"181":{"position":[[42,8]]},"197":{"position":[[49,8]]}}}],["common",{"_index":228,"t":{"377":{"position":[[236,6]]}}}],["commun",{"_index":86,"t":{"115":{"position":[[32,11]]},"123":{"position":[[32,11]]},"169":{"position":[[34,13]]},"173":{"position":[[3,12]]},"205":{"position":[[3,12]]},"221":{"position":[[0,13]]}}}],["compos",{"_index":234,"t":{"429":{"position":[[84,8]]}}}],["config",{"_index":170,"t":{"225":{"position":[[16,7]]}}}],["configur",{"_index":15,"t":{"10":{"position":[[43,14]]},"129":{"position":[[99,10]]},"137":{"position":[[84,10]]},"141":{"position":[[85,10]]},"153":{"position":[[106,10]]},"177":{"position":[[26,9]]},"365":{"position":[[70,13]]}}}],["connect",{"_index":118,"t":{"173":{"position":[[46,11]]},"177":{"position":[[59,11]]},"187":{"position":[[63,7]]},"399":{"position":[[0,10]]}}}],["contain",{"_index":36,"t":{"80":{"position":[[31,8]]}}}],["correct",{"_index":195,"t":{"264":{"position":[[149,7]]}}}],["correctli",{"_index":48,"t":{"95":{"position":[[18,9],[186,10]]}}}],["creat",{"_index":21,"t":{"34":{"position":[[57,6]]},"38":{"position":[[73,6]]},"44":{"position":[[65,6]]},"56":{"position":[[66,6]]},"60":{"position":[[49,6]]},"67":{"position":[[59,6]]},"157":{"position":[[33,6]]},"181":{"position":[[25,6]]},"197":{"position":[[32,6]]},"377":{"position":[[52,8]]}}}],["data",{"_index":35,"t":{"80":{"position":[[14,4]]},"99":{"position":[[53,4]]},"225":{"position":[[64,4]]},"247":{"position":[[91,5]]},"264":{"position":[[40,4],[202,5]]},"312":{"position":[[101,5]]}}}],["databas",{"_index":191,"t":{"264":{"position":[[66,9]]}}}],["decid",{"_index":168,"t":{"221":{"position":[[155,7]]}}}],["deezer",{"_index":63,"t":{"99":{"position":[[46,6],[104,6]]}}}],["deezer'",{"_index":65,"t":{"99":{"position":[[90,8]]}}}],["describ",{"_index":221,"t":{"377":{"position":[[100,10]]}}}],["determin",{"_index":131,"t":{"189":{"position":[[113,9]]}}}],["develop",{"_index":206,"t":{"335":{"position":[[18,11]]},"377":{"position":[[243,12]]}}}],["devic",{"_index":74,"t":{"107":{"position":[[14,6]]}}}],["device/receiv",{"_index":158,"t":{"217":{"position":[[18,16]]}}}],["differ",{"_index":180,"t":{"225":{"position":[[164,9]]},"365":{"position":[[8,10]]}}}],["discov",{"_index":97,"t":{"129":{"position":[[78,10]]},"153":{"position":[[85,10]]}}}],["docker",{"_index":233,"t":{"429":{"position":[[66,6],[77,6]]}}}],["document",{"_index":214,"t":{"365":{"position":[[57,8]]},"377":{"position":[[5,8],[209,8]]}}}],["done",{"_index":29,"t":{"52":{"position":[[46,4]]},"123":{"position":[[107,4]]}}}],["durat",{"_index":55,"t":{"95":{"position":[[117,8]]},"189":{"position":[[407,8]]}}}],["enabl",{"_index":90,"t":{"115":{"position":[[91,8]]},"123":{"position":[[86,8]]},"131":{"position":[[12,7]]},"145":{"position":[[12,7]]},"189":{"position":[[35,7]]},"421":{"position":[[54,6]]}}}],["end",{"_index":132,"t":{"189":{"position":[[141,4]]},"429":{"position":[[100,3]]}}}],["endors",{"_index":162,"t":{"221":{"position":[[63,8]]}}}],["endpoint",{"_index":146,"t":{"193":{"position":[[108,8]]}}}],["enhanc",{"_index":171,"t":{"225":{"position":[[47,7]]}}}],["enough",{"_index":194,"t":{"264":{"position":[[103,6]]}}}],["env",{"_index":212,"t":{"365":{"position":[[27,3]]}}}],["etc",{"_index":46,"t":{"80":{"position":[[177,6]]}}}],["exampl",{"_index":8,"t":{"1":{"position":[[112,8]]},"80":{"position":[[114,8]]},"365":{"position":[[40,8]]}}}],["express",{"_index":200,"t":{"312":{"position":[[39,12]]}}}],["extens",{"_index":154,"t":{"209":{"position":[[34,9]]}}}],["extract",{"_index":188,"t":{"247":{"position":[[52,7]]}}}],["faq",{"_index":13,"t":{"10":{"position":[[10,3]]}}}],["fashion",{"_index":173,"t":{"225":{"position":[[85,7]]}}}],["file",{"_index":213,"t":{"365":{"position":[[35,4]]}}}],["fill",{"_index":196,"t":{"264":{"position":[[161,4]]}}}],["find",{"_index":121,"t":{"187":{"position":[[0,4]]}}}],["flatpak",{"_index":208,"t":{"352":{"position":[[9,7]]}}}],["function",{"_index":71,"t":{"99":{"position":[[168,14]]}}}],["getnowplay",{"_index":145,"t":{"193":{"position":[[94,13]]}}}],["googl",{"_index":163,"t":{"221":{"position":[[75,7],[148,6]]}}}],["greater",{"_index":93,"t":{"121":{"position":[[31,7]]}}}],["gui",{"_index":91,"t":{"115":{"position":[[130,4]]},"123":{"position":[[124,4]]}}}],["guid",{"_index":218,"t":{"377":{"position":[[42,5]]},"429":{"position":[[5,5],[111,5]]}}}],["headless",{"_index":102,"t":{"161":{"position":[[12,8]]}}}],["here",{"_index":205,"t":{"335":{"position":[[6,4]]}}}],["heurist",{"_index":186,"t":{"247":{"position":[[31,10]]}}}],["high",{"_index":193,"t":{"264":{"position":[[98,4]]}}}],["histor",{"_index":3,"t":{"1":{"position":[[43,10]]}}}],["histori",{"_index":96,"t":{"129":{"position":[[48,7]]},"137":{"position":[[43,7]]},"141":{"position":[[44,7]]},"153":{"position":[[55,7]]}}}],["http",{"_index":150,"t":{"205":{"position":[[39,6]]}}}],["icecast",{"_index":83,"t":{"111":{"position":[[24,7]]}}}],["icon",{"_index":78,"t":{"107":{"position":[[65,4]]}}}],["implement",{"_index":143,"t":{"193":{"position":[[49,10]]},"377":{"position":[[149,11]]}}}],["inform",{"_index":4,"t":{"1":{"position":[[54,11]]},"80":{"position":[[40,11]]},"264":{"position":[[177,11]]}}}],["input",{"_index":160,"t":{"217":{"position":[[70,7]]}}}],["instal",{"_index":152,"t":{"209":{"position":[[6,10]]},"421":{"position":[[28,9]]}}}],["instanc",{"_index":127,"t":{"187":{"position":[[84,9]]}}}],["integr",{"_index":165,"t":{"221":{"position":[[104,11]]}}}],["interfac",{"_index":89,"t":{"115":{"position":[[81,9]]},"123":{"position":[[76,9]]},"169":{"position":[[20,9]]},"205":{"position":[[46,9]]}}}],["issu",{"_index":14,"t":{"10":{"position":[[30,6]]},"399":{"position":[[11,6]]}}}],["jellyfin",{"_index":42,"t":{"80":{"position":[[136,9]]},"121":{"position":[[14,8]]}}}],["jriver",{"_index":87,"t":{"115":{"position":[[49,6],[123,6]]}}}],["kodi",{"_index":94,"t":{"123":{"position":[[49,4],[119,4]]}}}],["koito",{"_index":19,"t":{"34":{"position":[[43,5],[66,5]]},"129":{"position":[[23,5]]}}}],["last.fm",{"_index":10,"t":{"1":{"position":[[133,8]]},"38":{"position":[[82,7]]},"131":{"position":[[97,7]]},"137":{"position":[[26,7]]}}}],["last.fm/libre.fm",{"_index":24,"t":{"38":{"position":[[48,16]]}}}],["latest",{"_index":235,"t":{"447":{"position":[[0,6]]}}}],["length",{"_index":50,"t":{"95":{"position":[[41,6]]},"189":{"position":[[238,6]]}}}],["libre.fm",{"_index":25,"t":{"44":{"position":[[48,8],[74,8]]},"141":{"position":[[26,8]]}}}],["lifecycl",{"_index":182,"t":{"225":{"position":[[201,10]]}}}],["linux",{"_index":112,"t":{"169":{"position":[[70,5]]}}}],["listen",{"_index":54,"t":{"95":{"position":[[103,9]]}}}],["listenbrainz",{"_index":11,"t":{"1":{"position":[[142,15]]},"56":{"position":[[45,12],[75,12]]},"145":{"position":[[97,12]]},"153":{"position":[[23,12]]}}}],["local",{"_index":210,"t":{"352":{"position":[[21,7]]},"421":{"position":[[38,7]]}}}],["login",{"_index":231,"t":{"421":{"position":[[104,6]]}}}],["make",{"_index":123,"t":{"187":{"position":[[25,4]]}}}],["maloja",{"_index":9,"t":{"1":{"position":[[125,7]]},"52":{"position":[[8,6]]},"157":{"position":[[18,6],[42,6]]}}}],["mani",{"_index":104,"t":{"161":{"position":[[67,4]]},"225":{"position":[[159,4]]}}}],["match",{"_index":174,"t":{"225":{"position":[[96,8]]},"264":{"position":[[22,7],[83,5],[140,5]]}}}],["mean",{"_index":164,"t":{"221":{"position":[[88,5]]}}}],["media",{"_index":73,"t":{"107":{"position":[[8,5]]}}}],["metadata",{"_index":82,"t":{"111":{"position":[[6,8]]}}}],["method",{"_index":61,"t":{"99":{"position":[[28,7],[138,7]]}}}],["miss",{"_index":197,"t":{"264":{"position":[[169,7]]}}}],["mix",{"_index":133,"t":{"189":{"position":[[175,7]]}}}],["modifi",{"_index":137,"t":{"189":{"position":[[278,8]]}}}],["modify/replac",{"_index":202,"t":{"312":{"position":[[72,14]]}}}],["modul",{"_index":151,"t":{"205":{"position":[[56,6]]}}}],["monitor",{"_index":16,"t":{"34":{"position":[[3,7]]},"38":{"position":[[5,7]]},"44":{"position":[[5,7]]},"56":{"position":[[5,7]]},"60":{"position":[[3,7]]},"67":{"position":[[3,7]]},"107":{"position":[[118,7]]},"129":{"position":[[12,8]]},"137":{"position":[[12,8]]},"141":{"position":[[12,8]]},"153":{"position":[[12,8]]},"217":{"position":[[0,7]]}}}],["mopidi",{"_index":101,"t":{"161":{"position":[[0,6]]}}}],["mpd",{"_index":116,"t":{"173":{"position":[[21,3]]}}}],["mpri",{"_index":111,"t":{"169":{"position":[[0,5]]}}}],["ms",{"_index":115,"t":{"173":{"position":[[0,2]]},"189":{"position":[[92,2],[416,2]]},"205":{"position":[[0,2]]},"335":{"position":[[15,2]]},"377":{"position":[[87,2]]}}}],["ms'",{"_index":140,"t":{"189":{"position":[[330,4]]}}}],["multi",{"_index":58,"t":{"95":{"position":[[160,5]]},"107":{"position":[[98,5]]},"115":{"position":[[13,5]]},"123":{"position":[[13,5]]},"131":{"position":[[20,5]]},"145":{"position":[[20,5]]},"225":{"position":[[0,5],[183,5]]},"264":{"position":[[115,5]]},"421":{"position":[[12,5]]},"429":{"position":[[44,5]]}}}],["music",{"_index":38,"t":{"80":{"position":[[88,5],[160,6]]},"107":{"position":[[150,5]]},"161":{"position":[[21,5],[56,5]]},"169":{"position":[[53,5]]},"217":{"position":[[39,5]]},"221":{"position":[[22,5],[180,5]]}}}],["musicbrainz",{"_index":190,"t":{"264":{"position":[[4,11],[54,11]]}}}],["musiccast",{"_index":157,"t":{"217":{"position":[[8,9]]}}}],["musikcub",{"_index":119,"t":{"177":{"position":[[16,9]]}}}],["nativ",{"_index":183,"t":{"247":{"position":[[4,6]]}}}],["navidrom",{"_index":147,"t":{"193":{"position":[[139,10]]}}}],["need",{"_index":223,"t":{"377":{"position":[[138,4]]}}}],["network/usb/cd",{"_index":159,"t":{"217":{"position":[[55,14]]}}}],["new",{"_index":100,"t":{"137":{"position":[[68,3]]},"141":{"position":[[69,3]]},"377":{"position":[[73,3]]}}}],["non",{"_index":106,"t":{"161":{"position":[[85,3]]}}}],["note",{"_index":124,"t":{"187":{"position":[[30,4]]}}}],["open",{"_index":155,"t":{"209":{"position":[[44,4]]}}}],["oper",{"_index":113,"t":{"169":{"position":[[76,9]]}}}],["order",{"_index":80,"t":{"107":{"position":[[132,5]]},"115":{"position":[[3,5]]},"123":{"position":[[3,5]]},"177":{"position":[[3,5]]}}}],["outsid",{"_index":99,"t":{"131":{"position":[[61,7]]},"145":{"position":[[61,7]]}}}],["pandora",{"_index":108,"t":{"161":{"position":[[114,8]]}}}],["pars",{"_index":81,"t":{"111":{"position":[[0,5]]}}}],["part",{"_index":203,"t":{"312":{"position":[[87,5]]}}}],["pd",{"_index":148,"t":{"197":{"position":[[27,4]]}}}],["phone/comput",{"_index":79,"t":{"107":{"position":[[78,14]]}}}],["platform",{"_index":40,"t":{"80":{"position":[[104,9]]}}}],["play",{"_index":6,"t":{"1":{"position":[[92,6]]},"80":{"position":[[73,7]]},"107":{"position":[[160,5]]},"161":{"position":[[48,7]]},"189":{"position":[[212,4],[287,4],[431,7]]},"217":{"position":[[45,6]]},"247":{"position":[[73,4]]},"264":{"position":[[35,4],[197,4]]},"312":{"position":[[96,4]]}}}],["player",{"_index":39,"t":{"80":{"position":[[94,6]]},"169":{"position":[[59,7]]},"189":{"position":[[16,6]]}}}],["playlist/queu",{"_index":129,"t":{"189":{"position":[[72,14]]}}}],["plex",{"_index":43,"t":{"80":{"position":[[146,5]]},"187":{"position":[[10,4],[79,4]]}}}],["port",{"_index":126,"t":{"187":{"position":[[50,4]]}}}],["posit",{"_index":51,"t":{"95":{"position":[[51,9]]}}}],["preferences/set",{"_index":156,"t":{"209":{"position":[[53,20]]}}}],["profil",{"_index":32,"t":{"67":{"position":[[51,7]]}}}],["provid",{"_index":201,"t":{"312":{"position":[[52,8]]},"377":{"position":[[19,7]]}}}],["queue",{"_index":134,"t":{"189":{"position":[[191,5]]}}}],["re",{"_index":17,"t":{"34":{"position":[[15,2]]},"38":{"position":[[17,2]]},"44":{"position":[[17,2]]},"56":{"position":[[17,2]]},"60":{"position":[[15,2]]},"67":{"position":[[15,2]]},"129":{"position":[[65,2]]},"137":{"position":[[55,2]]},"141":{"position":[[56,2]]},"153":{"position":[[72,2]]}}}],["reduc",{"_index":53,"t":{"95":{"position":[[92,6]]}}}],["releas",{"_index":236,"t":{"447":{"position":[[7,7]]}}}],["remov",{"_index":68,"t":{"99":{"position":[[125,6]]}}}],["replac",{"_index":175,"t":{"225":{"position":[[109,9]]},"312":{"position":[[31,7]]}}}],["report",{"_index":49,"t":{"95":{"position":[[28,6]]},"189":{"position":[[266,6],[419,7]]}}}],["review",{"_index":227,"t":{"377":{"position":[[229,6]]}}}],["risk",{"_index":72,"t":{"99":{"position":[[211,5]]}}}],["rockski",{"_index":30,"t":{"60":{"position":[[41,7],[58,7]]},"181":{"position":[[16,8],[34,7]]}}}],["run",{"_index":229,"t":{"421":{"position":[[67,3]]},"429":{"position":[[31,7]]}}}],["scenario",{"_index":34,"t":{"74":{"position":[[0,9]]}}}],["score",{"_index":192,"t":{"264":{"position":[[89,5]]}}}],["scrobbl",{"_index":7,"t":{"1":{"position":[[99,12]]},"34":{"position":[[18,8]]},"38":{"position":[[20,8]]},"44":{"position":[[20,8]]},"56":{"position":[[20,8]]},"60":{"position":[[18,8]]},"67":{"position":[[18,8]]},"95":{"position":[[132,8],[176,9]]},"107":{"position":[[141,8]]},"111":{"position":[[61,11]]},"129":{"position":[[39,8],[68,9]]},"131":{"position":[[46,9]]},"137":{"position":[[34,8],[58,9]]},"141":{"position":[[35,8],[59,9]]},"145":{"position":[[46,9]]},"153":{"position":[[46,8],[75,9]]},"157":{"position":[[4,8]]},"181":{"position":[[3,8]]},"189":{"position":[[346,8]]},"197":{"position":[[3,8]]},"225":{"position":[[55,8]]}}}],["scrobbler",{"_index":59,"t":{"95":{"position":[[166,9]]},"107":{"position":[[104,9]]},"115":{"position":[[19,9]]},"123":{"position":[[19,9]]},"131":{"position":[[26,9]]},"145":{"position":[[26,9]]},"225":{"position":[[6,9]]},"264":{"position":[[121,9]]},"421":{"position":[[18,9]]},"429":{"position":[[50,9]]}}}],["scrobbler'",{"_index":181,"t":{"225":{"position":[[189,11]]}}}],["search",{"_index":199,"t":{"312":{"position":[[20,6]]}}}],["see",{"_index":215,"t":{"365":{"position":[[66,3]]}}}],["server",{"_index":27,"t":{"52":{"position":[[15,6]]},"115":{"position":[[74,6]]},"131":{"position":[[105,7]]},"145":{"position":[[110,7]]},"157":{"position":[[25,7]]},"161":{"position":[[27,6]]},"177":{"position":[[74,6]]}}}],["servic",{"_index":225,"t":{"377":{"position":[[174,7]]},"421":{"position":[[87,7]]}}}],["setup",{"_index":26,"t":{"52":{"position":[[0,5]]},"177":{"position":[[81,6]]}}}],["shorter",{"_index":135,"t":{"189":{"position":[[204,7]]}}}],["song",{"_index":5,"t":{"1":{"position":[[77,5]]}}}],["sourc",{"_index":22,"t":{"34":{"position":[[72,8]]},"38":{"position":[[90,8]]},"44":{"position":[[83,8]]},"56":{"position":[[88,8]]},"60":{"position":[[66,8]]},"67":{"position":[[76,8]]},"80":{"position":[[2,6],[19,6]]},"99":{"position":[[5,6],[192,6]]},"129":{"position":[[5,6]]},"131":{"position":[[5,6]]},"137":{"position":[[5,6]]},"141":{"position":[[5,6]]},"145":{"position":[[5,6]]},"153":{"position":[[5,6]]},"161":{"position":[[98,7]]},"193":{"position":[[5,6]]},"377":{"position":[[77,6],[131,6]]}}}],["spotifi",{"_index":41,"t":{"80":{"position":[[127,8]]},"189":{"position":[[8,7],[47,7],[249,7],[360,7]]}}}],["stage",{"_index":184,"t":{"247":{"position":[[11,5]]},"264":{"position":[[16,5]]},"312":{"position":[[9,5]]}}}],["standard",{"_index":105,"t":{"161":{"position":[[72,8],[89,8]]},"169":{"position":[[11,8]]}}}],["start",{"_index":204,"t":{"335":{"position":[[0,5]]}}}],["station",{"_index":84,"t":{"111":{"position":[[32,7]]}}}],["step",{"_index":217,"t":{"377":{"position":[[29,4],[37,4]]}}}],["stop",{"_index":166,"t":{"221":{"position":[[120,4]]}}}],["store",{"_index":2,"t":{"1":{"position":[[32,6]]}}}],["stream",{"_index":85,"t":{"111":{"position":[[40,9]]}}}],["string",{"_index":176,"t":{"225":{"position":[[119,7]]}}}],["subson",{"_index":144,"t":{"193":{"position":[[64,8]]}}}],["such",{"_index":107,"t":{"161":{"position":[[106,4]]},"193":{"position":[[117,5]]}}}],["support",{"_index":103,"t":{"161":{"position":[[39,8]]},"193":{"position":[[81,8]]},"221":{"position":[[50,9]]},"225":{"position":[[24,7]]}}}],["system",{"_index":114,"t":{"169":{"position":[[86,8]]}}}],["tcp",{"_index":117,"t":{"173":{"position":[[35,3]]}}}],["teal.fm",{"_index":33,"t":{"67":{"position":[[68,7]]},"197":{"position":[[41,7]]}}}],["threshold",{"_index":57,"t":{"95":{"position":[[141,10]]}}}],["time",{"_index":69,"t":{"99":{"position":[[153,5]]},"189":{"position":[[217,4],[292,4]]},"221":{"position":[[140,4]]},"225":{"position":[[174,5]]}}}],["titl",{"_index":177,"t":{"225":{"position":[[130,6]]}}}],["to",{"_index":66,"t":{"99":{"position":[[99,4]]}}}],["token",{"_index":122,"t":{"187":{"position":[[15,5]]}}}],["track",{"_index":37,"t":{"80":{"position":[[58,6]]},"95":{"position":[[35,5]]},"129":{"position":[[89,6]]},"153":{"position":[[96,6]]},"189":{"position":[[130,5],[166,5]]}}}],["tri",{"_index":187,"t":{"247":{"position":[[45,3]]}}}],["trivial",{"_index":219,"t":{"377":{"position":[[63,9]]}}}],["tunein",{"_index":110,"t":{"161":{"position":[[137,7]]}}}],["type",{"_index":216,"t":{"365":{"position":[[84,6]]}}}],["unoffici",{"_index":60,"t":{"99":{"position":[[17,10]]},"221":{"position":[[31,10]]}}}],["up",{"_index":232,"t":{"429":{"position":[[24,2]]}}}],["updat",{"_index":237,"t":{"469":{"position":[[0,8]]}}}],["url",{"_index":125,"t":{"187":{"position":[[42,3]]}}}],["us",{"_index":56,"t":{"95":{"position":[[126,5]]},"99":{"position":[[12,4],[183,3]]},"107":{"position":[[36,5]]},"111":{"position":[[53,3]]},"121":{"position":[[8,5]]},"173":{"position":[[25,5]]},"177":{"position":[[12,3]]},"187":{"position":[[55,4]]},"189":{"position":[[55,4]]},"193":{"position":[[19,4]]},"205":{"position":[[25,5]]},"247":{"position":[[17,4]]},"264":{"position":[[131,4]]},"312":{"position":[[15,4]]},"377":{"position":[[186,4],[198,5]]},"429":{"position":[[60,5]]}}}],["user",{"_index":198,"t":{"312":{"position":[[4,4]]}}}],["violat",{"_index":64,"t":{"99":{"position":[[77,9]]}}}],["vlc",{"_index":149,"t":{"205":{"position":[[21,3]]}}}],["web",{"_index":88,"t":{"115":{"position":[[70,3]]},"123":{"position":[[72,3]]},"205":{"position":[[35,3]]}}}],["webscrobbl",{"_index":153,"t":{"209":{"position":[[21,12]]}}}],["websocket",{"_index":120,"t":{"177":{"position":[[49,9]]}}}],["work",{"_index":167,"t":{"221":{"position":[[125,7],[186,5]]}}}],["youtub",{"_index":44,"t":{"80":{"position":[[152,7]]}}}],["yt",{"_index":161,"t":{"221":{"position":[[19,2],[177,2]]}}}]],"pipeline":["stemmer"]}},{"documents":[],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[],"invertedIndex":[],"pipeline":["stemmer"]}},{"documents":[{"i":2,"t":"A Client is an application that stores the historical information about what songs you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz...","s":"Overview","u":"/multi-scrobbler/configuration/clients/","h":"","p":1},{"i":4,"t":"Name Now Playing Last.fm ✅ Libre.fm ✅ Listenbrainz ✅ Koito ❌ Maloja ❌ Rocksky ❌ Teal.fm ❌","s":"Clients","u":"/multi-scrobbler/configuration/clients/","h":"#clients","p":1},{"i":7,"t":"If multi-scrobbler is unable to submit a scrobble to a Client then it places the scrobble into a queue which is retried every 5 minutes for a number of times before it gives up. After it stops automatically retrying the scrobble still exists and can be retried from the dashboard. Dead scrobbles persist between restart so you will never lose a scrobble that hasn't been successfully submitted yet.","s":"Dead Scrobbles","u":"/multi-scrobbler/configuration/clients/","h":"#dead-scrobbles","p":1},{"i":9,"t":"Multi-scrobbler can report the currently playing tracks it is monitoring to some Scrobble Clients via their individual Now Playing functionality. Now Playing is default enabled for all Clients that support it. The behavior multi-scrobbler uses for determining Now Playing reporting: Now Playing can be explicitly enabled or disabled globally using ENV NOW_PLAYING=true or NOW_PLAYING=false This only affects Clients that don't have behavior set via File/AIO (below) Now Playing will be only be reported to the same Clients a Source is configured to scrobble to A Source's Player status must be Playing, IE active, for reporting to occur This status can be verified via Player UI on the Dashboard If multiple Sources having active Players then the scrobble Client will default to reporting the track based on Source configuration name, alphabetically This is the name property set in File or AIO source configs Clients can customize the Now Playing behavior individually using File or AIO source configs: CONFIG_DIR/lastfm.json [ { \"name\": \"myLastFmClient\", \"configureAs\": \"client\", \"data\": { // ... }, \"options\": { // disable or enable //\"nowPlaying\": true // // OR define a list of Source *config* names that should be allowed to report Now Playing // order of the list determines priority for reporting Now Playing //\"nowPlaying\": [\"mySpotify1\",\"myJellyfin2\"] } }, ]","s":"Now Playing","u":"/multi-scrobbler/configuration/clients/","h":"#now-playing","p":1},{"i":11,"t":"tip Check the FAQ if you have any issues after configuration!","s":"Overview","u":"/multi-scrobbler/configuration/","h":"","p":10},{"i":13,"t":"Sources and Clients are configured using: environmental (ENV) variables client/source specific json config files an all-in-one json config file MS will parse configuration from all configuration types. You can mix and match configurations but it is generally better to stick to one or the other. ENV File File AIO MS will parse environmental variables present in the OS/container when it is run. This method means MS does not require files to run. Use ENV-based configuration if... You are the only person for whom MS is scrobbling for You have a very simple setup for MS such as one scrobble Client and one Source IE Plex -> Maloja Config Example For Docker container... docker run -e \"SPOTIFY_CLIENT_ID=yourId\" -e \"SPOTIFY_CLIENT_SECRET=yourSecret\" ... For Docker Compose docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler environment: - SPOTIFY_CLIENT_ID=yourId - SPOTIFY_CLIENT_SECRET=yourSecret - MALOJA_URL=http://domain.tld:42010 - MALOJA_API_KEY=1234 # ... # ... For a local/node installation export variables before running... SPOTIFY_CLIENT_ID=yourId SPOTIFY_CLIENT_SECRET=yourSecret npm run start MS will parse configuration files located in the directory specified by the CONFIG_DIR environmental variable. This variable defaults to: Local installation -> PROJECT_DIR/config Docker -> /config (in the container) -- see the install docs for how to configure this correctly Use File-based configuration if... You have many Sources You have many of each type of Source you want to scrobble from IE 2x Plex accounts, 3x Spotify accounts, 1x Funkwhale... You have more than one scrobble Client you want to scrobble to IE multiple Maloja servers You want only to scrobble to specific Clients You need to setup more advanced configuration for a Source/Client Most Source/Clients only support basic configuration through ENV, all configuration is possible using File/AIO tip There are example configurations for all Source/Client types and AIO config located in the /config directory of this project. These can be used as-is by renaming them to .json. For docker installations these examples are copied to your configuration directory on first-time use. There is also a kitchensink example that provides examples of using all sources/clients in a complex configuration. Each file is named by the type of the Client/Source found in below sections. Each file as an array of that type of Client/Source. Example directory structure: /CONFIG_DIR plex.json spotify.json maloja.json Config Example CONFIG_DIR/spotify.json [ { \"name\": \"MySpotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] MS will parse an all-in-one configuration file located in the directory specified by the CONFIG_DIR environmental variable. This variable defaults to: Local installation -> PROJECT_DIR/config/config.json Docker -> /config/config.json (in the container) -- see the install docs for how to configure this correctly Use AIO-based configuration if... You have many Sources You have many of each type of Source you want to scrobble from IE 2x Plex accounts, 3x Spotify accounts, 1x Funkwhale... You have more than one scrobble Client you want to scrobble to IE multiple Maloja servers You want only to scrobble to specific Clients You need to setup monitoring/webhooks You want to setup defaults for all Sources/Clients The AIO config also enables setting default options for sources/clients as well as global options for MS itself. tip An example AIO config files can be found in the project directory at /config/config.json.example For docker installations this example is copied to your configuration directory on first-time use. There is also a kitchensink example that provides examples of using all sources/clients in a complex configuration. Explore the schema for this configuration, along with an example generator and validator, here Config Example CONFIG_DIR/config.json { \"debugMode\": false, \"disableWeb\": false, \"sourceDefaults\": { \"logPayload\": false, \"logFilterFailure\": \"warn\", \"logPlayerState\": false, \"scrobbleThresholds\": { \"duration\": 30, \"percent\": 50 }, \"maxPollRetries\": 1, \"maxRequestRetries\": 1, \"retryMultiplier\": 1.5 }, \"clientDefaults\": { \"maxRequestRetries\": 1, \"retryMultiplier\": 1.5 }, \"sources\": [ { \"type\": \"spotify\", \"enable\": true, \"clients\": [\"myConfig\"], \"name\": \"mySpotifySource\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\" } } ], \"clients\": [ { \"type\": \"maloja\", \"enable\": true, \"name\": \"myConfig\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ], \"webhooks\": [ { \"name\": \"FirstGotifyServer\", \"type\": \"gotify\", \"url\": \"http://localhost:8070\", \"token\": \"MyGotifyToken\", \"priorities\": { \"info\": 5, \"warn\": 7, \"error\": 10 } }, { \"type\": \"ntfy\", \"name\": \"MyNtfyFriendlyNameForLogs\", \"url\": \"http://localhost:9991\", \"topic\": \"MyMultiScrobblerTopic\", \"username\": \"Optional\", \"password\": \"Optional\", \"priorities\": { \"info\": 3, \"warn\": 4, \"error\": 5 } } ] }","s":"Configuration Types","u":"/multi-scrobbler/configuration/","h":"#configuration-types","p":10},{"i":15,"t":"See the Configuration Types above for your options for creating Source and Client configurations. Reference Scrobble Sources for what Sources are available Reference Scrobble Clients for what Clients are available Each entry for a Source/Client includes a Configuration section that describes how to configure it using a configuration type.","s":"Setup Sources and Clients","u":"/multi-scrobbler/configuration/","h":"#setup-sources-and-clients","p":10},{"i":17,"t":"When using File or AIO Configuration, Multi-Scrobbler can interpolate Environmental Variables into your json files. This can be used, for example, to keep sensitive data (like Last.fm Client/Secret) out of your configuration files so that they can be committed to git. Multi-scrobbler will look for patterns in text fields within all of your json files: Some part of the text field matches: [[MY_ENV]] Is replaced by the value of the Environmental Variable named MY_ENV Example Given this Last.fm File config: lastfm.json [ { \"name\": \"myLastFmClient\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"[[MY_APIKEY]]\", \"secret\": \"[[MY_SECRET]]\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] And these environmental variables, in this scenario set through environment in the docker compose installation: MY_APIKEY=a89cba1569901a0671d5a9875fed4be1 MY_SECRET=ec42e09d5ae0ee0f0816ca151008412a The resulting json multi-scrobbler would use: lastfm.json [ { \"name\": \"myLastFmClient\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] Caveats ENV variable names/interpolation keys are case-insensitive Interpolation only works for string values within json. This cannot be used for numbers, booleans, objects, etc... Missing ENVs Multi-scrobbler will not throw an error if the environmental value is not found. Instead, it will leave the string as-is and log a warning (WARN level) with the names of the missing environmental variable names like so: WARN : [App] [Sources] [spotify Secrets] Matched: None | Unmatched: SPOTIFY_SECRET ENV Name Collisions Verify that interpolation keys/environmental variable names you will use do not collide with existing ENV names used by multi-scrobbler. Use the docs search to verify the name you want to use is not already used elsewhere by multi-scrobbler.","s":"Secrets Interpolation","u":"/multi-scrobbler/configuration/","h":"#secrets-interpolation","p":10},{"i":19,"t":"These options affect multi-scrobbler's behavior and are not specific to any source/client.","s":"Application Options","u":"/multi-scrobbler/configuration/","h":"#application-options","p":10},{"i":21,"t":"Defines the URL that is used to generate default redirect URLs for authentication on spotify and lastfm -- as well as some logging hints. Default => http://localhost:9078 Set with ENV BASE_URL or baseUrl all-in-one configuration If protocol is http or no protocol is specified MS will try to use port 9078 -- to override this explicitly set the port or use https Useful when running with docker so that you do not need to specify redirect URLs for each configuration. Example EX Lastfm Redirect Url is BASE_URL:PORT/lastfm/callback (when no other redirectUri is specified for lastfm configuration) BASE_URL Redirect URL 192.168.0.101 http://192.168.0.101:9078/lastfm/callback http://my.domain.local http://my.domain.local:9078/lastfm/callback http://192.168.0.101/my/subfolder http://192.168.0.101:9078/my/subfolder/lastfm/callback BASE_URL Redirect URL my.domain.local:80 http://192.168.0.101:80/lastfm/callback my.domain.local:9000 http://my.domain.local:9000/lastfm/callback 192.168.0.101:4000/my/subfolder http://192.168.0.101:4000/my/subfolder/lastfm/callback https://192.168.0.101 https://192.168.0.101:443/lastfm/callback","s":"Base URL","u":"/multi-scrobbler/configuration/","h":"#base-url","p":10},{"i":23,"t":"Multi-scrobbler caches some activities to persist important data across restarts, reduce external API calls, and make some actions faster. All of the activities below are always cached in-memory with an optional, configurable secondary store for persistence. Scrobbles Auth Data Transform API Calls Queued and Failed Scrobbles are cached so that any un-scrobbled data you have is persisted across restarts of multi-scrobbler. tip By default, this data use a Secondary File store, configured for you automatically. If you have configured a persisted volume/bind mount for configuration (/config is mounted in docker compose) then you are already done. If you are not persisting this directory then you should consider setting up Valkey Cache for this. Configuration​ Use any Secondary Cache, the config examples below show the default values: ENV AIO Environmental Variable Required? Default Description CACHE_SCROBBLE No file The cache type to use CACHE_SCROBBLE_CONN No /config config.json { \"cache\": { \"scrobble\": { \"provider\": \"file\", \"connection\": \"/config\" } }, // ... } Authentication sessions/tokens/etc... are cached for quicker requests and for persistence across restarts. tip By default, this data use a Secondary File store, configured for you automatically. If you have configured a persisted volume/bind mount for configuration (/config is mounted in docker compose) then you are already done. If you are not persisting this directory then you should consider setting up Valkey Cache for this. Configuration​ Use any Secondary Cache, the config examples below show the default values: ENV AIO Environmental Variable Required? Default Description CACHE_AUTH No file The cache type to use CACHE_AUTH_CONN No /config config.json { \"cache\": { \"auth\": { \"provider\": \"file\", \"connection\": \"/config\" } }, // ... } API Calls to external (metadata) services used to Enhance Scrobbles, like calls to Musicbrainz, can be cached to avoid duplicate calls and speed up scrobble transformations. By default, these calls are only cached in memory. If you wish for cached calls to be persisted across restarts then setup Valkey Cache. Configuration​ Use any Secondary Cache, the config examples below show the default values: ENV AIO Environmental Variable Required? Default Description CACHE_METADATA No The cache type to use CACHE_METADATA_CONN No config.json { \"cache\": { \"metadata\": { \"provider\": \"valkey\", \"connection\": \"yourConnectionStringHere\" } }, // ... } Secondary Caching Configuration​ The type of cache used, and its connection properties, can be configured through ENV or AIO config. File Valkey File cache is stored in the CONFIG_DIR directory using the pre-defined file name ms-[cacheName].cache. ENV AIO Example Environmental Variable Required? Default Description CACHE_SCROBBLE No file The cache type to use CACHE_SCROBBLE_CONN No /config The directory, within the container, to store the cache file Example config.json { \"cache\": { \"scrobble\": { \"provider\": \"file\", \"connection\": \"/config\" } }, // ... } Valkey is an open-source fork of Redis. Adding Valkey container to multi-scrobbler A valkey container can be added to the multi-scrobbler docker compose stack: docker-compose.yml services: multi-scrobbler: # ... # adding everything below valkey: image: valkey/valkey volumes: - valkeydata:/data volumes: valkeydata: driver: local Use redis://valkey:6379 as the connection string in the configurations below. The connection string used by multi-scrobbler to connect to your Valkey instance must be in the form: redis://HOST_IP:HOST_PORT ENV AIO Example Environmental Variable Required? Default Description CACHE_METADATA Yes valkey The cache type to use CACHE_METADATA_CONN Yes The host/IP and port to connect to EX: redis://192.168.0.120:6379 Example config.json { \"cache\": { \"metadata\": { \"provider\": \"valkey\", \"connection\": \"redis://192.168.0.120:6379\" } }, // ... }","s":"Caching","u":"/multi-scrobbler/configuration/","h":"#caching","p":10},{"i":25,"t":"Turning on Debug Mode will override and enable all optional \"debugging\" options found in configuration set log output to DEBUG Use this as a shortcut for enabling output that can be used for troubleshooting and issue reporting. Be aware that logs will likely be VERY noisy while Debug Mode is on. You should only have this mode on while gathering logs for troubleshooting and then turn it off afterwards. To set debug mode either add it to AIO config.json config.json { \"debugMode\": true, \"sources\": [...], // ... } or set the ENV DEBUG_MODE=true","s":"Debug Mode","u":"/multi-scrobbler/configuration/","h":"#debug-mode","p":10},{"i":27,"t":"If you do not need the dashboard and/or ingress sources, or have security concerns about ingress and cannot control your hosting environment, the web server and API can be disabled. warning Any ingress-based sources will be unusable (Webscrobbler, etc...) if this is disabled. Disable using either: ENV DISABLE_WEB=true In All-in-One File use the top-level property \"disableWeb\": true","s":"Disable Web","u":"/multi-scrobbler/configuration/","h":"#disable-web","p":10},{"i":29,"t":"Multi-scrobbler supports some common webhooks and a healthcheck endpoint in order to monitor Sources and Clients for errors.","s":"Monitoring","u":"/multi-scrobbler/configuration/","h":"#monitoring","p":10},{"i":31,"t":"Webhooks will push a notification to your configured servers on these events: Source polling started Source polling retry Source polling stopped on error Scrobble client scrobble failure Webhooks are configured in the AIO config.json file under the webhook top-level property. Multiple webhooks may be configured for each webhook type. Example config.json { \"sources\": [ //... ], \"clients\": [ //... ], \"webhooks\": [ { \"name\": \"FirstGotifyServer\", \"type\": \"gotify\", \"url\": \"http://192.168.0.100:8070\", \"token\": \"abcd\" }, { \"name\": \"SecondGotifyServer\", \"type\": \"gotify\", //... }, { \"name\": \"NtfyServerOne\", \"type\": \"ntfy\", //... }, //... ] } Gotify​ Refer to the config schema for GotifyConfig multi-scrobbler optionally supports setting message notification priority via info warn and error mappings. Example config.json { \"type\": \"gotify\", \"name\": \"MyGotifyFriendlyNameForLogs\", \"url\": \"http://192.168.0.100:8070\", \"token\": \"AQZI58fA.rfSZbm\", \"priorities\": { \"info\": 5, \"warn\": 7, \"error\": 10 } } Ntfy​ Refer to the config schema for NtfyConfig multi-scrobbler optionally supports setting message notification priority via info warn and error mappings. Example config.json { \"type\": \"ntfy\", \"name\": \"MyNtfyFriendlyNameForLogs\", \"url\": \"http://192.168.0.100:9991\", \"topic\": \"RvOwKJ1XtIVMXGLR\", \"username\": \"Optional\", \"password\": \"Optional\", \"priorities\": { \"info\": 3, \"warn\": 4, \"error\": 5 } } Apprise​ Refer to the config schema for AppriseConfig multi-scrobbler supports stateless and persistent storage endpoints as well as tags/ Example config.json { \"type\": \"apprise\", \"name\": \"MyAppriseFriendlyNameForLogs\", \"host\": \"http://192.168.0.100:8080\", \"urls\": [\"gotify://192.168.0.101:8070/MyToken\"], // stateless endpoints \"keys\": [\"e90b20526808373353afad7fb98a201198c0c3e0555bea19f182df3388af7b17\"], //persistent storage endpoints \"tags\": [\"my\",\"optional\",\"tags\"] }","s":"Webhook Configurations","u":"/multi-scrobbler/configuration/","h":"#webhook-configurations","p":10},{"i":33,"t":"An endpoint for monitoring the health of sources/clients is available at GET http://YourMultiScrobblerDomain/health Returns 200 OK when everything is working or 500 Internal Server Error if anything is not The plain url (/health) aggregates status of all clients/sources -- so any failing client/source will make status return 500 Use query params type or name to restrict client/sources aggregated IE /health?type=spotify or /health?name=MyMaloja On 500 the response returns a JSON payload with messages array that describes any issues For any clients/sources that require authentication /health will return 500 if they are not authenticated For sources that poll (spotify, yt music, subsonic) /health will 500 if they are not polling","s":"Health Endpoint","u":"/multi-scrobbler/configuration/","h":"#health-endpoint","p":10},{"i":35,"t":"Other Uses To monitor and re-scrobble activity from a Koito account create a Koito (Source) Setup a Koito server if you have not already done this. Create (or get) an API Key From your Koito server dashboard navigate to Settings (bottom-left icon) => API Keys Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key EX pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL Take note of your Koito username (used below as KOITO_USER) Determine your Koito URL This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance. EX dashboard at http://192.168.0.100:4110 => KOITO_URL is set to http://192.168.0.100:4110 Koito Base URL Using the URL path /apis/listenbrainz Koito docs describe is not required. The Koito URL used for multi-scrobbler should only be the base URL. Only include a URL path if your Koito base url is not at host:port. See the table below for examples. Base URL Examples KOITO_URL MS Detected Base URL Example Scrobble Api URL http://192.168.0.100:4110 http://192.168.0.100:4110 http://192.168.0.100:4110/apis/listenbrainz/1 https://koito.mydomain.com https://koito.mydomain.com https://koito.mydomain.com/apis/listenbrainz/1 http://192.168.0.100:4110/apis/listenbrainz http://192.168.0.100:4110 http://192.168.0.100:4110/apis/listenbrainz/1 http://192.168.0.100:80/koito http://192.168.0.100:80/koito http://192.168.0.100:80/koito/apis/listenbrainz/1 tip Ensure that Koito is configured to allow requests from multi-scrobbler! In Koito config set KOITO_ALLOWED_HOSTS to the IP the multi-scrobbler dashboard is accessible from.","s":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","h":"","p":34},{"i":37,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description KOITO_TOKEN Yes API Key from your Koito Account KOITO_USER Yes Your Koito username KOITO_URL No The base URL for the Koito server File Config Type CONFIG/koito.json [ { \"name\": \"koito-client\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"koito-client\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" }, \"type\": \"koito\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/koito/","h":"#configuration","p":34},{"i":39,"t":"Other Users To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a Last.fm (Source) To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a Last.fm (Endpoint) You will need a Last.fm account to use the Last.fm API. After creating your account, register for an API account here. The callback URL in the API account form is not used, but to keep it consistent use the same value you set using the Callback/Redirect URL section. Take note of your API Key and Secret after account creation.","s":"Last.fm","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"","p":38},{"i":41,"t":"The Redirect (Callback) URL is used to redirect your browser to multi-scrobbler after authentication has completed. So, the base of the URL you use should be the same as the URL you would use to navigate to the multi-scrobbler dashboard. Example If you can visit the multi-scrobbler dashboard by navigating to http://192.168.0.100:9078 in your web browser... then the ENV LASTFM_REDIRECT_URI, or redirectUri for last.fm/libre.fm json config, should be http://192.168.0.100:9078/lastfm/callback The Redirect URL can be explicitly specified in the configuration below, or by using the global Base URL setting.","s":"Callback/Redirect URL","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#callbackredirect-url","p":38},{"i":43,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LASTFM_API_KEY Yes Api Key from your API Account LASTFM_SECRET Yes Shared secret from your API Account LASTFM_REDIRECT_URI No http://localhost:9078/lastfm/callback Url to use for authentication. Must include lastfm/callback somewhere in it LASTFM_SESSION No Session id. Will be generated by authentication flow if not provided. File Config Type CONFIG/lastfm.json [ { \"name\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"type\": \"lastfm\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#configuration","p":38},{"i":45,"t":"Other Users To monitor and re-scrobble activity from your Libre.fm account create a Libre.fm (Source) To use the official Libre.fm instance you will need an account. Or, you can run your own Libre.fm instance using the legacy source code. No API account, API Key, or Secret is needed to use the Libre.fm API. Instead, use any values for API Key/Secret in the configuration. Authentication is done by allowing access from your account on redirect.","s":"Libre.fm","u":"/multi-scrobbler/configuration/clients/librefm/","h":"","p":44},{"i":47,"t":"The Redirect (Callback) URL is used to redirect your browser to multi-scrobbler after authentication has completed. So, the base of the URL you use should be the same as the URL you would use to navigate to the multi-scrobbler dashboard. Example If you can visit the multi-scrobbler dashboard by navigating to http://192.168.0.100:9078 in your web browser... then the ENV LIBREFM_REDIRECT_URI, or redirectUri for libre.fm json config, should be http://192.168.0.100:9078/librefm/callback The Redirect URL can be explicitly specified in the configuration below, or by using the global Base URL setting.","s":"Callback/Redirect URL","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#callbackredirect-url","p":44},{"i":49,"t":"If you are not using the official Libre.fm instance then specify your custom instance using ENV LIBREFM_URLBASE or urlBase property in the data section in File/AIO config. The value should be protocol://libre.tld/path/prefix EX: https://my.cool.libre.com/2.0/","s":"Custom Libre.fm instance","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#custom-librefm-instance","p":44},{"i":51,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LIBREFM_ENABLE No Set to true to enable Libre.fm, if not using any of the below variables LIBREFM_API_KEY No anything Optional API Key LIBREFM_SECRET No anything Optional shared secret LIBREFM_REDIRECT_URI No http://localhost:9078/librefm/callback Url to use for authentication. Must include librefm/callback somewhere in it LIBREFM_SESSION No Session id. Will be generated by authentication flow if not provided. LIBREFM_URLBASE No Use for custom Libre.fm instance only. The host + path prefix EX https://my.libre.example/2.0/ File Config Type CONFIG/librefm.json [ { \"name\": \"myLibreFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myLibreFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" }, \"type\": \"librefm\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#configuration","p":44},{"i":53,"t":"Setup a Maloja server if you have not already done this. Maloja Setup Intructions Using Maloja's example docker-compose.yml: ~/malojaData/docker-compose.yml loading... View on GitHub Uncomment environment and add MALOJA_FORCE_PASSWORD=CHANGE_ME to set an admin password Start the container: ~/malojaData docker compose up -d Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at http://myMalojaServerIP/admin_apikeys) Create a New Key and then copy the generated key value Finally, add the Maloja server URL and API Key to the configuration type you choose to use, below.","s":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","h":"","p":52},{"i":55,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MALOJA_URL Yes Base URL of your installation MALOJA_API_KEY Yes Api Key File Config Type CONFIG/maloja.json [ { \"name\": \"myMaloja-client\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myMaloja-client\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" }, \"type\": \"maloja\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/maloja/","h":"#configuration","p":52},{"i":57,"t":"Other Users To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source) To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a Listenbrainz (Endpoint) You will need to run your own Listenbrainz server or have an account on the official instance On your profile page find your User Token to use in the configuration.","s":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"","p":56},{"i":59,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LZ_TOKEN Yes User token from your LZ profile LZ_USER Yes Your LZ username LZ_URL No https://api.listenbrainz.org/ The base URL for the LZ server File Config Type CONFIG/listenbrainz.json [ { \"name\": \"brainzClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"brainzClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" }, \"type\": \"listenbrainz\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"#configuration","p":56},{"i":61,"t":"Other Uses To monitor and re-scrobble activity from Rocksky create a Rocksky (Source) Rocksky is music tracking and discovery platform built on the AT Protocol (Bluesky). How does that work? The AT Protocol is a standard to allow different applications to share and interpret your social data. Your data is stored in a personal repository in a PDS (Personal Data Server), which is data-type agnostic (it's just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc... Even though the application and the PDS/repository are independent, all of this is done for you automatically when you create a Bluesky account. So... multi-scrobbler \"scrobbles\" your plays to your repository in a JSON data structure which includes Rocksky's data type and structure at a known location for Rocksky's data (app.rocksky), in a list that is appended to as you continue to scrobble when accessing Rocksky, or another application that knows how to read it, your data is pulled from the repository to render the app Your Data Is Public The default Bluesky PDS is public, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy. No Scrobbling Guarantee Rocksky does not guarantee that every scrobble you send will be persisted. Rocksky's design goal is to store scrobbles with metdata-complete, 3rd party verifiable track information so that it can be a metadata-rich discovery platform, rather than an exhaustive scrobble data source-of-truth. To do this it asynchronously matches your scrobble data against Musicbrainz's and/or Spotify's catalogs, after the scrobble has been submitted. If the scrobble does not end up matching then it is not persisted. If you need your scrobbles to be 100% captured then you should scrobble to an additional Scrobble Client.","s":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"","p":60},{"i":63,"t":"You will need a Bluesky account to use Rocksky. note Usage is adapted from Rocksky docs on docs.rocksky.app Navigate to rocksky.app and sign up/logn using your Bluesky account Then, navigate to the RockSky developer dashboard and obtain an API Key","s":"Setup","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#setup","p":60},{"i":66,"t":"The handle used with multi-scrobbler should be your full ATProto handle, including TLD. For regular Bluesky account this will be like: alice.bsky.social For Bluesky accounts that use their website as their account this is your domain: mydomain.com For non-Bluesky users, you probably already know your handle If you do not include a TLD then multi-scrobbler will automatically append .bsky.social to your handle value. ENV File AIO ENV Config Type Environmental Variable Required? Default Description ROCKSKY_HANDLE Yes Your full ATProto handle. For Bluesky account this is like myUser.bsky.social ROCKSKY_KEY Yes API Key obtained from Rocksky developer dashboard File Config Type CONFIG/rocksky.json [ { \"name\": \"myRockskyClient\", \"configureAs\": \"client\", \"data\": { \"key\": \"7cdr86vis3mpq5b1pi01md0hkm7ykzzxjy81r\", \"handle\": \"alice.bsky.social\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myRockskyClient\", \"configureAs\": \"client\", \"data\": { \"key\": \"7cdr86vis3mpq5b1pi01md0hkm7ykzzxjy81r\", \"handle\": \"alice.bsky.social\" }, \"type\": \"rocksky\" } ] } or explore the schema with an example and live editor/validator","s":"Handle","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#handle","p":60},{"i":68,"t":"Other Uses To monitor and re-scrobble activity from a ATProto Profile create a teal.fm (Source) teal.fm is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a PDS (Personal Data Server). How does that work? The AT Protocol is a standard to allow different applications to share and interpret your social data. Your data is stored in a personal repository in a PDS (Personal Data Server), which is data-type agnostic (it's just JSON). Each application defines their own datatypes and pulls data from your repository to render to you, your network, etc... Even though the application and the PDS/repository are independent, all of this is done for you automatically when you create a Bluesky account. So... multi-scrobbler \"scrobbles\" your plays to your repository in a JSON data structure which includes teal.fm's data type and structure at a known location for teal.fm's data (fm.teal), in a list that is appended to as you continue to scrobble when accessing teal.fm, or another application that knows how to read it, your data is pulled from the repository to render the app Your Data Is Public The default Bluesky PDS is public, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy. teal.fm Is Still In Development teal.fm is still in developement and does not have a public website, yet. To view your teal.fm scrobbles you can: use wrapped.baileytownsend.dev which gives a simple stats overview of your scrobbles use teal-slice.wisp.place for a preview of teal.fm use atproto.at to view the raw data (convenience URLs are generated in multi-scrobbler for you to do this)","s":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"","p":67},{"i":70,"t":"Bluesky​ Create a Bluesky account, if you don't already have one Navigate to https://bsky.app/settings/app-passwords Settings -> Privacy and Security -> App passwords Create a new App Password and save it somewhere, it will not be shown again","s":"Setup","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#setup","p":67},{"i":73,"t":"The ATPRoto identifier used with multi-scrobbler should be either: A valid DID, starting with did:plc:... or did:web:... Your full ATProto handle, including TLD If using a handle: For regular Bluesky account this will be like: alice.bsky.social For Bluesky accounts that use their domain as their account this is your domain: mydomain.com For non-Bluesky-PDS users, you probably already know your handle If your identifier does not look like a DID and does not include a TLD then multi-scrobbler will automatically append .bsky.social to your handle value. ENV File AIO ENV Config Type Environmental Variable Required? Default Description TEALFM_IDENTIFIER Yes Your full ATProto handle or DID. For Bluesky account this is like myUser.bsky.social TEALFM_APP_PW Yes Bluesky/ATProto network App Password File Config Type CONFIG/tealfm.json [ { \"name\": \"myTeal\", \"configureAs\": \"client\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"clients\": [ { \"name\": \"myTeal\", \"configureAs\": \"client\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\" }, \"type\": \"tealfm\" } ] } or explore the schema with an example and live editor/validator","s":"Identifier","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#identifier","p":67},{"i":75,"t":"Scenario: You want to scrobble plays for yourself (Foxx), Fred, and Mary Each person has their own Maloja server Each person has their own Spotify account You have your own Airsonic (subsonic) server you to scrobble from You have your own Youtube Music account you want to scrobble from Mary has her own Last.fm account she also wants to scrobble to Fred has his own Spotify application and provides you with just his access and refresh token because he doesn't trust you (wtf Fred) Fred has a Plex server and wants to scrobble everything he plays Mary uses Fred's Plex server but only wants to scrobble her plays from the podcast library The three of you have a shared library on Plex called party that you only play when you are hanging out. You want plays from that library to be scrobbled to everyone's servers. Fred also has his own Jellyfin server and wants to scrobble everything he plays You have an android music app that can scrobble to a custom listenbrainz server","s":"Example Complex Scenario","u":"/multi-scrobbler/configuration/kitchensink/","h":"","p":74},{"i":77,"t":"CONFIG_DIR/config.json { \"sourceDefaults\": { \"maxPollRetries\": 0, // optional, default # of automatic polling restarts on error. can be overridden by property in individual config \"maxRequestRetries\": 1, // optional, default # of http request retries a source can make before error is thrown. can be overridden by property in individual config \"retryMultiplier\": 1.5, // optional, default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying). can be overridden by property in individual config }, \"clientDefaults\": { \"maxRequestRetries\": 1, // optional, default # of http request retries a client can make before error is thrown. can be overridden by property in individual config \"retryMultiplier\": 1.5, // optional, default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying). can be overridden by property in individual config }, \"sources\": [ { \"type\": \"spotify\", \"name\": \"foxxSpot\", \"clients\": [\"foxxMaloja\"], \"data\": { \"clientId\": \"foxxSpotifyAppId\", \"clientSecret\": \"foxxSpotifyAppSecret\", }, \"options\": { \"maxRequestRetries\": 2, // override default max retries because spotify can...spotty } }, { \"type\": \"spotify\", \"name\": \"marySpot\", \"clients\": [\"maryMaloja\"], \"data\": { \"clientId\": \"foxxSpotifyAppId\", // only need one application, it can be used by all users of this multi-scrobbler instance \"clientSecret\": \"foxxSpotifyAppSecret\", } }, { \"type\": \"spotify\", \"name\": \"fredSpot\", \"clients\": [\"fredMaloja\"], \"data\": { \"accessToken\": \"fredsToken\", \"refreshToken\": \"fredsRefreshToken\", \"interval\": 120, // he also wants a slower check interval because his application already has heavy api usage } }, { \"type\": \"plex\", \"name\": \"fredPlex\", \"clients\": [\"fredMaloja\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"fredUser\"] } }, { \"type\": \"plex\", \"name\": \"maryPlex\", \"clients\": [\"maryMaloja\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"maryUser\"], // still need to specify mary as user so not all users who play from 'podcasts' get scrobbled \"librariesAllow\": [\"podcasts\"] } }, { \"type\": \"plex\", \"name\": \"partyPlex\", // omitting clients (or making it empty) will make this Source scrobble to all Clients \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"librariesAllow\": [\"party\"] } }, { \"type\": \"jellyfin\", \"name\": \"FredJelly\", // omitting clients (or making it empty) will make this Source scrobble to all Clients \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\", \"usersAllow\": [\"fredUser\"] } }, { \"type\": \"subsonic\", \"name\": \"foxxAirsonic\", \"clients\": [\"foxxMaloja\"], \"data\": { \"user\": \"foxx\", \"password\": \"foxxPassword\", \"url\": \"https://airsonic.foxx.example\" } }, { \"type\": \"ytmusic\", \"name\": \"foxxYoutube\", \"clients\": [\"foxxMaloja\"], \"data\": { \"cookie\": \"__Secure-3PAPISID=3AxsXpy0MKGu75Qb/AkISXGqOnSDn1jEKn; DEVICE_INFO=ChxOekU0Tmpjek5EWTBPRGd3TlRBMk16QXpNdz09EJbS8Z0GGJbS8Z0G; ...\", } }, { \"type\": \"endpointlz\", \"name\": \"listenbrainzfoxx\", \"clients\": [\"foxxMaloja\"], \"data\": { \"token\": \"myToken\" } } ], \"clients\": [ { \"type\": \"maloja\", \"name\": \"foxxMaloja\", \"data\": { \"url\": \"https://maloja.foxx.example\", \"apiKey\": \"foxxApiKey\" } }, { \"type\": \"maloja\", \"name\": \"fredMaloja\", \"data\": { \"url\": \"https://maloja.fred.example\", \"apiKey\": \"fredApiKey\" } }, { \"type\": \"maloja\", \"name\": \"maryMaloja\", \"data\": { \"url\": \"https://maloja.mary.example\", \"apiKey\": \"maryApiKey\" } }, { \"type\": \"lastfm\", \"name\": \"maryLFM\", \"data\": { \"apiKey\": \"maryApiKey\", \"secret\": \"marySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] }","s":"All-in-one Config","u":"/multi-scrobbler/configuration/kitchensink/","h":"#all-in-one-config","p":74},{"i":79,"t":"CONFIG_DIR/spotify.json [ { // may omit 'type' property since app knows this is file is for spotify configs \"name\": \"foxxSpot\", \"clients\": [\"foxxMaloja\"], \"data\": { \"clientId\": \"foxxSpotifyAppId\", \"clientSecret\": \"foxxSpotifyAppSecret\" } }, { \"name\": \"marySpot\", \"clients\": [\"maryMaloja\"], \"data\": { \"clientId\": \"foxxSpotifyAppId\", \"clientSecret\": \"foxxSpotifyAppSecret\" } }, { \"name\": \"fredSpot\", \"clients\": [\"fredMaloja\"], \"data\": { \"accessToken\": \"fredsToken\", \"refreshToken\": \"fredsRefreshToken\", \"interval\": 120 } }, ] CONFIG_DIR/plex.json [ { \"name\": \"fredPlex\", \"clients\": [\"fredMaloja\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"fredUser\"] } }, { \"name\": \"maryPlex\", \"clients\": [\"maryMaloja\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"maryUser\"], \"librariesAllow\": [\"podcasts\"] } }, { \"name\": \"partyPlex\", \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"librariesAllow\": [\"party\"] } } ] CONFIG_DIR/jellyfin.json [ { \"name\": \"FredJelly\", \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\", \"usersAllow\": [\"fredUser\"] } } ] CONFIG_DIR/ytmusic.json [ { \"name\": \"foxxYoutube\", \"clients\": [\"foxxMaloja\"], \"data\": { \"cookie\": \"__Secure-3PAPISID=3AxsXpy0MKGu75Qb/AkISXGqOnSDn1jEKn; DEVICE_INFO=ChxOekU0Tmpjek5EWTBPRGd3TlRBMk16QXpNdz09EJbS8Z0GGJbS8Z0G; ...\", } } ] CONFIG_DIR/endpointlz.json [ { \"name\": \"listenbrainzfoxx\", \"clients\": [\"foxxMaloja\"], \"data\": { \"token\": \"myToken\", } } ] CONFIG_DIR/maloja.json [ { \"name\": \"foxxMaloja\", \"data\": { \"url\": \"https://maloja.foxx.example\", \"apiKey\": \"foxxApiKey\" } }, { \"name\": \"fredMaloja\", \"data\": { \"url\": \"https://maloja.fred.example\", \"apiKey\": \"fredApiKey\" } }, { \"name\": \"maryMaloja\", \"data\": { \"url\": \"https://maloja.mary.example\", \"apiKey\": \"maryApiKey\" } } ] CONFIG_DIR/lastfm.json [ { \"name\": \"maryLFM\", \"data\": { \"apiKey\": \"maryApiKey\", \"secret\": \"marySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ]","s":"Separate JSON files","u":"/multi-scrobbler/configuration/kitchensink/","h":"#separate-json-files","p":74},{"i":81,"t":"A Source is a data source that contains information about tracks you are playing like a music player or platform. Examples are Spotify, Jellyfin, Plex, Youtube Music, Airsonic, etc...","s":"Overview","u":"/multi-scrobbler/configuration/sources/","h":"","p":80},{"i":83,"t":"Name Networking Scrobble SOT Multi Device/User Scrobble Destination Thresholds Should Scrobble Azuracast Active Activity ❌ ✅ ✅ ✅ Deezer Active History ✅ ✅ ❌ ❌ Google Cast (Chromecast) Active Activity ✅ ✅ ✅ ❌ Icecast Active Activity ❌ ✅ ✅ ✅ Jellyfin Active Activity ✅ ✅ ✅ ❌ JRiver Active Activity ❌ ✅ ✅ ❌ Kodi Active Activity ❌ ✅ ✅ ❌ Koito Active History ❌ ✅ ❌ ❌ Last.fm Active History ❌ ✅ ❌ ❌ Libre.fm Active History ❌ ✅ ❌ ❌ Last.fm (Endpoint) Ingress History ❌ ✅ ❌ ❌ ListenBrainz Active History ❌ ✅ ❌ ❌ ListenBrainz (Endpoint) Ingress History ❌ ✅ ❌ ❌ Maloja Active History ❌ ✅ ❌ ❌ Mopidy Active Activity ❌ ✅ ✅ ❌ MPD (Music Player Daemon) Active Activity ❌ ✅ ✅ ❌ Musikcube Active Activity ❌ ✅ ✅ ❌ Plex Active Activity ✅ ✅ ✅ ❌ Rocksky Active History ❌ ✅ ❌ ❌ Spotify Active Activity ✅ ✅ ✅ ❌ Subsonic-compatible APIs Active Activity ✅ ✅ ✅ ❌ teal.fm Active History ❌ ✅ ❌ ❌ WebScrobbler Ingress History ❌ ✅ ❌ ❌ VLC Active Activity ❌ ✅ ✅ ❌ Yamaha MusicCast Active Activity ❌ ✅ ✅ ❌ Youtube Music Active History ❌ ✅ ❌ ❌","s":"Sources","u":"/multi-scrobbler/configuration/sources/","h":"#sources","p":80},{"i":86,"t":"The Sources implemented in multi-scrobbler can be broken down into two categories. By Communication Method​ How does this Source get data from the service/application? Active Ingress The MS Source makes network requests to the service which returns a response with data MS can use to monitor listening activity or scrobbles. The MS Source waits for the service/application to send data to multi-scrobbler. These types of Sources require that multi-scrobbler is accessible to the service, generally through an open port or reverse proxy. By Data Source of Truth​ How does MS determine if/when a song has been played and is scrobbable? Listening Activity Listening History These Sources expose some kind of real-time listening data for users, like: player state (paused, stopped, playing) player position (1:50/2:40) current listened duration (Track A playing for 1m:20s) For theses Sources multi-scrobbler keeps track of the real-time state of your activity and scrobbles a track after it meets certain scrobble thresholds. Some Sources expose their own version of \"this track has been scrobbled.\" Listenbrainz, Koito, and Last.fm are all scrobble services that have \"definitive\" histories of scrobbled tracks. For these Sources multi-scrobbler monitors the listening history data and scrobbles when it sees a new entry in the list.","s":"Types of Sources","u":"/multi-scrobbler/configuration/sources/","h":"#types-of-sources","p":80},{"i":88,"t":"Some Sources report which User is playing a track and/or on what device the track is being played. These Sources can be filtered with configuration to only monitor activity for specific devices or users.","s":"Multi-Device/User","u":"/multi-scrobbler/configuration/sources/","h":"#multi-deviceuser","p":80},{"i":90,"t":"To limit which Clients a Source will scrobble to use the clients property in a Source's File/AIO configuration to specify the name property of the Clients that it should scrobble to: jellyfin.json { \"name\": \"MyJellyfin\", \"clients\": [\"myMaloja\",\"koitoA\",\"listenbrainzFoo\"] \"data\": { // ... }, } note If clients is empty (\"clients\": []) or is omitted then the default is for the Source to scrobble to all configured Clients. note If a Client is configured using ENV then it is given a generated name. Check the multi-scrobbler Dashboard to find their name in a subheader under the Client type. Example: Otherwise, use the name property you gave the client in it's File/AIO config.","s":"Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/sources/","h":"#limiting-scrobble-destination","p":80},{"i":92,"t":"A Source that monitors active listening uses one of two metrics to determine if a Song is scrobbable based on your listening: percent of track listened to (50% or more) or amount of time (duration) track was listened to (4 minutes or more) These default values are based on last.fm's scrobble guidance. These values can be customized in the options of Source's file or aio config: spotify.json { \"data\": { // ... }, \"options\": { \"scrobbleThresholds\": { \"duration\": 40, // scrobbable if listened to for 40 seconds or more \"percent\": 20 // scrobbable if listened to for 20% or more of the track's length } } } These can also be configured globally for all Sources using ENVs: SOURCE_SCROBBLE_DURATION=40 SOURCE_SCROBBLE_PERCENT=20","s":"Scrobble Thresholds","u":"/multi-scrobbler/configuration/sources/","h":"#scrobble-thresholds","p":80},{"i":94,"t":"note This feature is currently available only for some Sources. Check each Source's documentation to see if it supported. For most Sources multi-scrobbler can determine if a user is listening and scrobble automatically. For Sources which multi-scrobbler cannot do this or require additional configuration, a user can indicate to MS that it should or should not scrobble. This action can be taken on the Web Dashboard by clicking the link next to Should Scrobble found in each Source's status card. Additionally, for these Sources, the default behavior for Scrobbling can be explicitly set by adding the following value to a Source's options in file or aio config: azuracast.json { \"data\": { // ... }, \"options\": { // set to true to always scrobble automatically // set to false to never scrobble automatically \"systemScrobble\": true } }","s":"Should Scrobble Behavior","u":"/multi-scrobbler/configuration/sources/","h":"#should-scrobble-behavior","p":80},{"i":96,"t":"Scrobbling Threshold Azuracast may not correctly report track length or position. If this is the case you should reduce the \"listened to\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly. The Azuracast server should have Use High-Performance Now Playing Updates enabled in Administration -> System Settings URL​ The URL used by MS to connect to Azuracast has the syntax: [ws|wss]://HOST:[PORT] MS will automatically add the path required for websockets, /api/live/nowplaying/websocket, to your URL if none is provided. If you use a reverse proxy with a path-based URL or otherwise need a custom path to access the websockets path correctly then explicitly provide it. Examples: URL From Config => MS Uses 'ws://192.168.0.101' => ws://192.168.0.101/api/live/nowplaying/websocket 'ws://azura.mydomain.com' => ws://azura.mydomain.com.com/api/live/nowplaying/websocket 'wss://mydomain.com/custom/azura/ws' => wss://mydomain.com/custom/azura/ws Should Scrobble Behavior This Source supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to Should Scrobble found in each Source's status card. Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source's options in file or aio config: azuracast.json { \"data\": { // ... }, \"options\": { // set to true to always scrobble automatically // set to false to never scrobble automatically \"systemScrobble\": true } }} Multi-scrobbler will set the default scrobbling behavior based on if either of these settings is configured: live status (AZURA_LIVE or monitorWhenLive) or listener count (AZURA_LISTENERS_NUM or monitorWhenListeners) If either is configured then MS will automatically scrobble based on when these conditions are met. If neither is configured automatic scrobble defaults to off and you should either manually initiate it or explicitly set the default behavior.","s":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"","p":95},{"i":98,"t":"ENV File AIO Environmental Variable Required? Default Description AZ_URL Yes Azuracast URL without station name AZ_STATION Yes The station name shown on the public page AZURA_LIVE No Yes Only scrobble when station status is ONLINE AZURA_LISTENERS_NUM No true Only scrobble if station has any listeners (true) or listeners are equal-to/greater-than X CONFIG_DIR/azuracast.json [ { \"type\": \"azuracast\", \"enable\": true, \"name\": \"azura\", \"data\": { \"url\": \"ws://192.168.0.101\", \"station\": \"my-station-name\", \"monitorWhenLive\": true, \"monitorWhenListeners\": 1 } } ] or explore the schema with an example and live editor/validator CONFIG_DIR/config.json { \"sources\": [ { \"type\": \"azuracast\", \"enable\": true, \"name\": \"azura\", \"data\": { \"url\": \"ws://192.168.0.101\", \"station\": \"my-station-name\", \"monitorWhenLive\": true, \"monitorWhenListeners\": 1 } } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#configuration","p":95},{"i":100,"t":"warning This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer's TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk. info This Source will work only if you have a Premium Deezer account.","s":"Deezer","u":"/multi-scrobbler/configuration/sources/deezer/","h":"","p":99},{"i":102,"t":"The arl is a browser cookie that Deezer uses to store your login information. Multi-scrobbler uses the arl value to make authorized requests to Deezer's API where it can retrieve listening history. After logging into Deezer, use one of the methods below to retrieve the arl cookie value: Chrome Firefox On deezer.com, press F12 to open the Developer Tools window. Go to the Applications tab. Press the '>>' More tabs icon if it's hidden. Under the Cookies Filter, click deezer.com, then the text bar name arl. Copy all the contents shown in the Cookie Value pane. On deezer.com, hit Ctrl+Shift+I to open Developer Tools Go to the Storage Tab, then expand Cookies in the sidebar and select deezer.com Find the row with arl as the name, then double click the Value column and right click -> copy the value","s":"Retrieve ARL","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#retrieve-arl","p":99},{"i":104,"t":"ENV File AIO Environmental Variable Required? Default Description DEEZER_ARL Yes The ARL cookie value retrieved from your browser CONFIG_DIR/deezer.json [ { \"name\": \"DeezerARL\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig\", } } ] or explore the schema with an example and live editor/validator CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"DeezerARL\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig\" }, \"type\": \"deezer\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#configuration","p":99},{"i":106,"t":"Third party integrations with Deezer (Sonos) may cause Deezer to report the same track many times in listening history. If you experience this issue modify your Deezer Source config (file-based only) to include the option \"fuzzyDiscoveryIgnore\": \"aggressive\" deezer.json example deezer.json [ { \"name\": \"MyDeezer\", \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3x...\", }, \"options\": { \"fuzzyDiscoveryIgnore\": \"aggressive\" } } ] This option comes with some trade-offs: MS will aggressively detect repeated tracks within a window of time that should eliminate all duplicates. However, this will also prevent intentionally repeated tracks from being scrobbled. See this thread for more information on how this works.","s":"Duplicate detection","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#duplicate-detection","p":99},{"i":108,"t":"If your media device can be Cast to using this button on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play. note Google Cast support is experimental. You may experience crashes and errors while using this Source. Please open an issue if you experience problems and include all information detailed in the issue template to help debug your issue. note This source relies on common, basic music data provided by the cast device which will always be less exhaustive than data parsed from full source integrations. If there is an existing Source it is recommended to configure for it and blacklist the app on Google Cast, rather than relying solely on Google Cast for scrobbling. Connecting Devices​ Cast devices can be manually configured using file-based configuration OR automatically discovered using mDNS. mDNS Discovery​ The host machine running multi-scrobbler must be configured to allow mDNS traffic on port 5353/UDP. OS Specific Instructions Linux Windows Docker The host machine must have avahi-daemon running to circumvent limitations with DNS resolution due to musl in Alpine. Most major linux distributions package avahi and many have it built-in. Once avahi is running you must pass D-Bus and the avahi daemon socket to your container like so: docker run ... -v /var/run/dbus:/var/run/dbus -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket ... foxxmd/multi-scrobbler Flatpak/Nodejs No additional steps are required. Docker Unsupported at this time. Nodejs No additional steps are required. What Media Does MS Scrobble?​ Cast devices report what type of media the current activity is (see metadata property here). The reported type is dependent on the application playing the media to correctly report it, the cast device does not magically know what the media is. If an application does not report a type it is always classified as unknown. By default, MS will only track media that is reported as MusicTrack. Allow Unknown Media Type​ Media with an Unknown (Generic) media type can be explicitly allowed by setting \"allowUnknownMedia\": true in the file-based configuration. This can also be configured to only allow unknown media types for specific applications by using a list of application names. Example chromecast.json [ { \"name\": \"MyCast\", \"type\": \"chromecast\", \"data\": { // only allow unknown if app name contains any of these phrases \"allowUnknownMedia\": [\"smarttube\", \"default media receiver\"] }, } ] Forcing Media Tracking​ MS can be forced to track media from an application regardless of media type. This is useful if an application incorrectly reports a media type you are sure should be music. Set \"forceMediaRecognitionOn\" in the file-based configuration to a list of application names that should always be tracked. Example chromecast.json [ { \"name\": \"MyCast\", \"type\": \"chromecast\", \"data\": { // media from applications that contains these phrases will always be tracked, regardless of media type reported \"forceMediaRecognitionOn\": [\"smarttube\", \"default media receiver\"] }, } ] Cast Troubleshooting​ Please include any/all logs with raw output if there are any errors encountered as this is critical to diagnosing issues. To diagnose bad/incomplete track information or strange MS player behavior please turn on payload logging and include log output of the source running to help diagnose this issue. Either enable in config using the below example OR enable Debug Mode. Example chromecast.json [ { \"name\": \"MyCast\", \"type\": \"chromecast\", \"data\": { //... }, \"options\": { \"logPayload\": true } } ]","s":"Google Cast (Chromecast)","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"","p":107},{"i":110,"t":"ENV File AIO note Manually configuring cast device connections is only available through file-based config. Environmental Variable Required? Default Description CC_ENABLE No Set to 'true' to enable Cast monitoring without needing to define other ENVs CC_WHITELIST_DEVICES No Only scrobble from these Cast devices. Comma-delimited list. EX mini-home, family-tv CC_BLACKLIST_DEVICES No Do not scrobble from these Cast devices. Comma-delimited list CC_WHITELIST_APPS No Only scrobble from these casted Apps. Comma-delimited list. EX spotify, pandora CC_BLACKLIST_APPS No Do not scrobble from these casted Apps. Comma-delimited list Example CONFIG_DIR/chromecast.json [ { \"name\": \"MyCast\", \"data\": { \"blacklistedDevices\": [], \"whitelistedDevices\": [], \"blacklistedApps\": [], \"whitelistedApps\": [] } } ] or explore the schema with an example and live editor/validator Example CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyCast\", \"data\": { \"blacklistedDevices\": [], \"whitelistedDevices\": [], \"blacklistedApps\": [], \"whitelistedApps\": [] }, \"type\": \"chromecast\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"#configuration","p":107},{"i":112,"t":"Parse metadata from any Icecast Station (streams) to use for scrobbling. note There is no standard format for presenting track information in an Icecast stream and the majority of streams that do include metadata only use a single string (StreamTitle) from which metadata can be parsed. Multi-scrobbler will do its best to parse Artist/Album/Track information from this data but the quality and consistency for this is solely based on how the Icecast broadcaster chooses to format their tracks. Multi-scrobbler cannot automatically determine if you are listening to a Station. Therefore, automatic scrobbling for Icecast Sources is off by default. Use Should Scrobble Behavior to initiate scrobbling or configure automatic scrobble. Should Scrobble Behavior This Source supports toggling scrobbling on or off manually. This action can be taken on the Web Dashboard by clicking the link next to Should Scrobble found in each Source's status card. Additionally, the default behavior for scrobbling can be explicitly set by adding the following value to a Source's options in file or aio config: icecast.json { \"data\": { // ... }, \"options\": { // set to true to always scrobble automatically // set to false to never scrobble automatically \"systemScrobble\": true } }} Scrobbling Threshold Icecast does not report track lengths so multi-scrobbler cannot determine if it should scrobble based on percent played. You should instead set a shorter \"listened to\" duration using Scrobble Thresholds. URL and Sources​ The URL should be the URL you would use to stream audio. Additional sources are supported based on those found in icecast-metadata-stats. To use these with automatic parsing based on the regular URL include a sources array in your config the same way as shown in icecast-metadata-stats: Example config.json [ { \"name\": \"myIcy\", \"enable\": true, \"data\": { \"url\": \"http://myIcecast.com/radio\", \"sources\": [\"icy\", \"ogg\", \"sevenhtml\"] } } ] To manually set these sources include the same *Endpoint options found in icecast-metadata-stats. If no sources are configured for multi-scrobbler it will automatically try to use icy and ogg.","s":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","h":"","p":111},{"i":114,"t":"ENV File AIO Environmental Variable Required? Default Description ICECAST_URL Yes Icecast URL Example CONFIG_DIR/icecast.json [ { \"name\": \"myIcy\", \"enable\": true, \"data\": { \"url\": \"http://myIcecast.com/radio\" } } ] or explore the schema with an example and live editor/validator Example CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myIcy\", \"enable\": true, \"data\": { \"url\": \"http://myIcecast.com/radio\" }, \"type\": \"icecast\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/icecast/","h":"#configuration","p":111},{"i":116,"t":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can can be in the JRiver GUI: Tools -> Options -> Media Network Check Use Media Network to share this library... If you have Authentication checked you will need to provide the Username and Password in the ENV/File configuration below.","s":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","h":"","p":115},{"i":118,"t":"The URL used to connect to JRiver, set in your file config as url. The URL used to connect ultimately must be formed like this: Syntax => [protocol]://[hostname]:[port]/[path] Default => http://localhost:52199/MCWS/v1/ If any part of this URL is missing multi-scrobbler will use a default value. This also means that if any part of your URL is not standard you must explicitly define it. Jriver Settings Make sure the port number matches what is found in Advanced section in the Media Network options. If your installation is on the same machine but you cannot connect using localhost try 0.0.0.0 instead. URL Transform Examples Examples of a given url in your file config and the final URL multi-scrobbler will use to connect to JRiver: url Transformed URL (none set) http://localhost:52199/MCWS/v1/ jriver.mydomain.com http://jriver.mydomain.com:52199/MCWS/v1/ 192.168.0.101:3456 http://192.168.0.101:3456/MCWS/v1/ mydomain.com:80/jriverReverse/MCWS/v1/ mydomain.com:80/jriverReverse/MCWS/v1/","s":"URL","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#url","p":115},{"i":120,"t":"ENV File AIO ENV Config Type Environmental Variable Required Default Description JRIVER_URL Yes http://localhost:52199/MCWS/v1/ The URL of the JRiver server JRIVER_USERNAME No If authentication is enabled, the username set JRIVER_PASSWORD No If authenticated is enabled, the password set File Config Type CONFIG_DIR/jriver.json [ { \"name\": \"MyJriver\", \"enable\": true, \"data\": { \"url\": \"0.0.0.0\", \"username\": \"auser\", \"password\": \"apassword\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyJriver\", \"enable\": true, \"data\": { \"url\": \"0.0.0.0\", \"username\": \"auser\", \"password\": \"apassword\" }, \"type\": \"jriver\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#configuration","p":115},{"i":122,"t":"Must be using Jellyfin 10.7 or greater Create an API Key for multi-scrobbler In the Jellyfin desktop web UI Navigate to -> Administration -> Dashboard -> API Keys (http://YOUR_JELLYIN_URL/web/index.html#!/apikeys.html) Click + button and create a new key with App name multi-scrobbler Copy the created API Key value for use in configuration below It is recommended to use API Key + username but if you are not an admin for your Jellyfin instance you can also authenticate with your Jellyfin username and password. Important Defaults By default... multi-scrobbler will only scrobble for the user authenticated with the API. Allowed Users (usersAllow or JELLYFIN_USERS_ALLOW) are only necessary if you want to scrobble for additional users. multi-scrobbler will only scrobble media found in Jellyfin libraries that were labelled as Music. librariesAllow or JELLYFIN_LIBRARIES_ALLOW will override this OR use additionalAllowedLibraryTypes to allow more types (like mixed or book for audiobooks) multi-scrobbler will only scrobble media Jellyfin detects as Audio. To force multi-scrobbler to scrobble when media is detected as Unknown use \"allowUnknown\": true in file/aio configuration. Configuration​ ENV File AIO Environmental Variable Required? Default Description JELLYFIN_URL Yes The URL of the Jellyfin server IE http://localhost:8096 JELLYFIN_USER Yes The user to authenticate with the API JELLYFIN_APIKEY No The API Key to use for authentication (Must provide either apikey or password) JELLYFIN_PASSWORD No The password of the user to authenticate for. (Must provide either apikey or password) JELLYFIN_USERS_ALLOW No Comma-separated list of usernames (from Jellyfin) to scrobble for JELLYFIN_USERS_BLOCK No Comma-separated list of usernames (from Jellyfin) to disallow scrobble for JELLYFIN_DEVICES_ALLOW No Comma-separated list of devices to scrobble from JELLYFIN_DEVICES_BLOCK No Comma-separated list of devices to disallow scrobbles from JELLYFIN_LIBRARIES_ALLOW No Comma-separated list of libraries to allow scrobbles from JELLYFIN_LIBRARIES_BLOCK No Comma-separated list of libraries to disallow scrobbles from CONFIG_DIR/jellyfin.json [ { \"name\": \"MyJellyfin\", \"enable\": true, \"clients\": [], \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\", // everything below is optional \"usersAllow\": [\"FoxxMD\",\"SomeOtherUser\"], \"usersBlock\": [\"AnotherUser\"], \"devicesAllow\": [\"firefox\"], \"devicesBlock\": [\"google-home\"], \"librariesAllow\": [\"GoodMusic\"], \"librariesBlock\": [\"BadMusic\"], \"additionalAllowedLibraryTypes\": [\"musicvideos\"], \"allowUnknown\": false, }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\" } } ] or explore the schema with an example and live editor/validator CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyJellyfin\", \"enable\": true, \"clients\": [], \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\", \"usersAllow\": [ \"FoxxMD\", \"SomeOtherUser\" ], \"usersBlock\": [ \"AnotherUser\" ], \"devicesAllow\": [ \"firefox\" ], \"devicesBlock\": [ \"google-home\" ], \"librariesAllow\": [ \"GoodMusic\" ], \"librariesBlock\": [ \"BadMusic\" ], \"additionalAllowedLibraryTypes\": [ \"musicvideos\" ], \"allowUnknown\": false }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\" }, \"type\": \"jellyfin\" } ] } or explore the schema with an example and live editor/validator","s":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","h":"","p":121},{"i":124,"t":"In order for multi-scrobbler to communicate with Kodi you must have the Web Interface enabled. This can be done in the Kodi GUI: Settings -> Services -> Control Check Allow remote control via HTTP Ensure you have a Username and Password set, you will need to provide them in the ENV/File configuration below.","s":"Kodi","u":"/multi-scrobbler/configuration/sources/kodi/","h":"","p":123},{"i":126,"t":"The URL used to connect to Kodi, set in your file config as url. The URL used to connect ultimately must be formed like this: Syntax => [protocol]://[hostname]:[port]/[path] Default => http://localhost:8080/jsonrpc If any part of this URL is missing multi-scrobbler will use a default value. This also means that if any part of your URL is not standard you must explicitly define it. Kodi Settings Make sure the port number matches what is found in Port in the Control section mentioned above. If your installation is on the same machine but you cannot connect using localhost try 0.0.0.0 instead. URL Transform Examples Examples of a given url in your file config and the final URL multi-scrobbler will use to connect to Kodi: url Transformed URL (none set) http://localhost:8080/jsonrpc kodi.mydomain.com http://kodi.mydomain.com:8080/jsonrpc 192.168.0.101:3456 http://192.168.0.101:3456/jsonprc mydomain.com:80/kodiReverse/jsonrpc http://mydomain.com:80/kodiReverse/jsonrpc","s":"URL","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#url","p":123},{"i":128,"t":"ENV File AIO ENV Config Type Environmental Variable Required Default Description KODI_URL Yes http://localhost:8080/jsonrpc The URL of the Kodi server KODI_USERNAME No The username set KODI_PASSWORD No The password set File Config Type CONFIG/kodi.json [ { \"name\": \"MyKodi\", \"enable\": true, \"data\": { \"url\": \"http://localhost:8080/jsonrpc\", \"username\": \"myUser\", \"password\": \"myPassword\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyKodi\", \"enable\": true, \"data\": { \"url\": \"http://localhost:8080/jsonrpc\", \"username\": \"myUser\", \"password\": \"myPassword\" }, \"type\": \"kodi\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#configuration","p":123},{"i":130,"t":"This Source monitors a Koito account's scrobble history and then re-scrobbles discovered tracks to configured Clients. Other Uses To scrobble to a Koito server, create a Koito (Client) See the Koito (Client) configuration for general setup. The only difference for Source configuration: Cannot be setup with ENV config File/AIO config must include \"configureAs\": \"source\" Configuration​ ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Koito Client config -- multi-scrobbler assumes Koito ENVs are always used for the client configuration. You must use the File or AIO config to setup Koito as a Source. File Config Type CONFIG/koito.json [ { \"name\": \"koito-source\", \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"koito-source\", \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" }, \"type\": \"koito\" } ] } or explore the schema with an example and live editor/validator","s":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","h":"","p":129},{"i":132,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server. Other Uses To scrobble to Last.fm, create a Last.fm (Client) To monitor and re-scrobble activity from your Last.fm account, create a Last.fm (Source)","s":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"","p":131},{"i":134,"t":"If a slug is not provided in configuration then multi-scrobbler will accept Last.fm scrobbles at http://localhost:9078/2.0/ which is the \"standard\" Last.fm server path for scrobbling Use a slug only if you need to setup multiple Last.fm Endpoint sources and cannot use different tokens. If a slug is used then the URL will be: http://localhost:9078/api/lastfm/mySlug","s":"URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#url","p":131},{"i":136,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LFMENDPOINT_ENABLE No Use LFM Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs LFM_SLUG No (Optional) The URL suffix to use for accepting LFM scrobbles File Config Type CONFIG/endpointlfm.json [ { \"name\": \"myLfm\", \"enable\": true, \"data\": { \"slug\": \"mySlug\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myLfm\", \"enable\": true, \"data\": { \"slug\": \"mySlug\" }, \"type\": \"endpointlfm\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#configuration","p":131},{"i":138,"t":"This Source monitors your Last.fm scrobble history and re-scrobbles new activity to configured Clients. Other Uses To scrobble to Last.fm/Libre.fm, create a Last.fm (Client) To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a Last.fm (Endpoint) To configure this Source use the same registration instructions and configuration data shown in Last.fm (Client) with the difference being \"configureAs\": \"source\" defined in the File/AIO configuration below.","s":"Last.fm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"","p":137},{"i":140,"t":"ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Last.fm Client config -- multi-scrobbler assumes Last.fm ENVs are always used for the client configuration. You must use the File or AIO config to setup Last.fm as a Source. File Config Type CONFIG/lastfm.json [ { \"name\": \"myLastFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myLastFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"type\": \"lastfm\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"#configuration","p":137},{"i":142,"t":"This Source monitors your Libre.fm scrobble history and re-scrobbles new activity to configured Clients. Other Uses To scrobble to Libre.fm, create a Libre.fm (Client) To configure this Source use the same registration instructions and configuration data shown in Libre.fm (Client) with the difference being \"configureAs\": \"source\" defined in the File/AIO configuration below.","s":"Libre.fm","u":"/multi-scrobbler/configuration/sources/librefm-source/","h":"","p":141},{"i":144,"t":"ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Libre.fm Client config -- multi-scrobbler assumes Libre.fm ENVs are always used for the client configuration. You must use the File or AIO config to setup Libre.fm as a Source. File Config Type CONFIG/librefm.json [ { \"name\": \"myLibreFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myLibreFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" }, \"type\": \"librefm\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/librefm-source/","h":"#configuration","p":141},{"i":146,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server. Other Uses To scrobble to Listenbrainz, create a Listenbrainz (Client) To monitor and re-scrobble activity from your Listenbrainz account, create a Listenbrainz (Source)","s":"Listenbrainz (Endpoint)","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"","p":145},{"i":148,"t":"If a slug is not provided in configuration then multi-scrobbler will accept Listenbrainz scrobbles at http://myMultiScrobblerIP:9078/1/submit-listens which is the \"standard\" Listenbrainz server path for scrobbling. In general, you should use http://myMultiScrobblerIP:9078/1/ as the base path when configuring your application to scrobble to multi-scrobbler. URL Setup for Popular Apps Navidrome​ Set the ListenBrainz.BaseURL (env ND_LISTENBRAINZ_BASEURL) to http://myMultiScrobblerIP:9078/1/ Use a slug only if you need to setup multiple Listenbrainz Endpoint sources and cannot use different tokens. If a slug is used then the URL will be: http://myMultiScrobblerIP:9078/api/listenbrainz/mySlug note Some Listenbrainz applications may require custom Listenbrainz URLs to be a real domain (example.com) and/or use SSL (https://). In this case you should setup multi-scrobbler behind a reverse proxy to support this functionality. It is out of the scope of this project to do this solely within multi-scrobbler.","s":"URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#url","p":145},{"i":150,"t":"Most Listenbrainz clients require a token (Authentication Token) to be provided during setup. This value can be anything you want, just make sure to use the same value for token in your multi-scrobbler configuration for the endpoint.","s":"Token","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#token","p":145},{"i":152,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description LZENDPOINT_ENABLE No Use LZ Endpoint as a Source without any other configuration. Only required if slug/token are not provided as ENVs LZE_TOKEN No LZ \"Authentication Token\" you provided to the scrobbling application LZE_SLUG No (Optional) The URL suffix to use for accepting LZ scrobbles File Config Type CONFIG/endpointlz.json [ { \"name\": \"myLz\", \"enable\": true, \"data\": { \"token\": \"myToken\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myLz\", \"enable\": true, \"data\": { \"token\": \"myToken\" }, \"type\": \"endpointlz\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#configuration","p":145},{"i":154,"t":"This Source monitors a Listenbrainz account's scrobble history and then re-scrobbles discovered tracks to configured clients. Other Uses To scrobble to a Listenbrainz server, create a Listenbrainz (Client) To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a Listenbrainz (Endpoint) You will need to run your own Listenbrainz server or have an account on the official instance. On your profile page find your User Token to use in the configuration.","s":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"","p":153},{"i":156,"t":"ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Listenbrainz Client config -- multi-scrobbler assumes Listenbrainz ENVs are always used for the client configuration. You must use the File or AIO config to setup Listenbrainz as a Source. File Config Type CONFIG/listenbrainz.json [ { \"name\": \"brainzSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"brainzSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" }, \"type\": \"listenbrainz\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"#configuration","p":153},{"i":158,"t":"Other Uses To scrobble to a Maloja server, create a Maloja (Client) See the Maloja (Client) configuration for general setup. The only difference for Source configuration: Cannot be setup with ENV config File/AIO config must include \"configureAs\": \"source\"","s":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","h":"","p":157},{"i":160,"t":"ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Maloja Client config -- multi-scrobbler assumes Maloja ENVs are always used for the client configuration. You must use the [File or AIO config to setup Maloja as a Source. File Config Type CONFIG/maloja.json [ { \"name\": \"myMaloja-source\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myMaloja-source\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" }, \"type\": \"maloja\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/maloja/","h":"#configuration","p":157},{"i":162,"t":"Mopidy is a headless music server that supports playing music from many standard and non-standard sources such as Pandora, Bandcamp, and Tunein. multi-scrobbler can scrobble tracks played from any Mopidy backend source, regardless of where you listen to them. note You must have Mopidy-HTTP extension enabled for this integration to work. URL​ The URL used to connect to the Mopidy server, set in your file config as url. The URL used to connect ultimately must be formed like this: Syntax => [protocol]://[hostname]:[port]/[path] Default => ws://localhost:6680/mopidy/ws If any part of this URL is missing multi-scrobbler will use a default value. This also means that if any part of your URL is not standard you must explicitly define it. Mopidy Configuration Make sure the hostname and port number match what is found in the Mopidy configuration file mopidy.conf: [http] hostname = localhost port = 6680 URL Transform Examples Examples of a given url in your file config and the final URL multi-scrobbler will use to connect to Mopidy: url Transformed URL (none set) ws://localhost:6680/mopidy/ws mopidy.mydomain.com ws://mopidy.mydomain.com:6680/mopidy/ws/ 192.168.0.101:3456 ws://192.168.0.101:3456/mopidy/ws/ mopidy.mydomain.com:80/MOPWS ws://mopidy.mydomain.com:80/MOPWS","s":"Mopidy","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"","p":161},{"i":164,"t":"If you wish to disallow or only allow scrobbling from some sources played through Mopidy you can specify these using uriBlacklist or uriWhitelist in your config. multi-scrobbler will check the list to see if any string matches the START of the uri on a track. If whitelist is used then blacklist is ignored. All strings are case-insensitive. Example { \"uriBlacklist\": [\"soundcloud\"] } Will prevent multi-scrobbler from scrobbling any Mopidy track that start with a uri like soundcloud:song:MySong-1234","s":"URI Blacklist/Whitelist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#uri-blacklistwhitelist","p":161},{"i":166,"t":"For 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 Album name to this list. Multi-scrobbler will still scrobble the track, just without the bad data. All strings are case-insensitive. Example { \"albumBlacklist\": [\"SoundCloud\", \"Mixcloud\"] } If a track would be scrobbled like Album: Soundcloud, Track: My Cool Track, Artist: A Cool Artist then multi-scrobbler will instead scrobble Track: My Cool Track, Artist: A Cool Artist","s":"Album Blacklist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#album-blacklist","p":161},{"i":168,"t":"ENV File AIO ENV Config Type No ENV support File Config Type CONFIG/mopidy.json [ { \"name\": \"MyMopidy\", \"enable\": true, \"data\": { \"url\": \"localhost\", \"uriBlacklist\": [], \"uriWhitelist\": [], \"albumBlacklist\": [] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyMopidy\", \"enable\": true, \"data\": { \"url\": \"localhost\", \"uriBlacklist\": [], \"uriWhitelist\": [], \"albumBlacklist\": [] }, \"type\": \"mopidy\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#configuration","p":161},{"i":170,"t":"MPRIS is a standard interface for communicating with Music Players on linux operating systems. If you run Linux and have a notification tray that shows what media you are listening to, you likely have access to MPRIS. multi-scrobbler can listen to this interface and scrobble tracks played by any media player that communicates to the operating system with MPRIS. Host Setup​ MPRIS communication requires multi-scrobbler to have access to the host's dbus-daemon. Local Docker If multi-scrobbler is running as a Local Installation, directly with node/npm, on the same host as MPRIS then no setup is required. Remote setup is also possible, see the Remote Unix Socket section in the Docker tab. If multi-scrobbler is running as a Docker Container some modifications are required... Local Unix Socket​ The most secure way is to run a multi-scrobbler container on the same host as MPRIS. In this scenario you can simply mount the user session dbus unix socket into the container. Make sure PUID and PGID ENVs are configured so the container has permissions to access the socket. Then, modify your compose stack with these additional values: docker-compose.yaml environment: - DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/UID/bus volumes: - /run/user/UID/bus:/run/user/UID/bus:ro Remote Unix Socket​ warning This method is insecure. You should not expose dbus over a network unless access to the port is restricted and the network is trusted. Use socat to bidirectionally relay communication from the host's dbus socket to a listening TCP port. To make dbus for user with uid 1000 available on port 6644: socat TCP-LISTEN:6644,reuseaddr,fork UNIX-CONNECT:/run/user/1000/bus Then, add the following value to multi-scrobbler's ENVs: DBUS_SESSION_BUS_ADDRESS=tcp:host=yourHostIP,port=6644","s":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","h":"","p":169},{"i":172,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MPRIS_ENABLE No Use MPRIS as a Source (useful when you don't need any other options) MPRIS_BLACKLIST No Comma-delimited list of player names not to scrobble from MPRIS_WHITELIST No Comma-delimited list of players names to ONLY scrobble from. Overrides blacklist File Config Type CONFIG/mpris.json [ { \"name\": \"ubuntu\", \"enable\": true, \"data\": { \"whitelist\": [ \"vlc\", \"mpd\" ], \"blacklist\": [ \"spotify\" ] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"ubuntu\", \"enable\": true, \"data\": { \"whitelist\": [ \"vlc\", \"mpd\" ], \"blacklist\": [ \"spotify\" ] }, \"type\": \"mpris\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mpris/","h":"#configuration","p":169},{"i":174,"t":"MS communicates with MPD using the TCP client connection. You should uncomment/create the following settings in your mpd config: bind_to_address \"any\" # or a specific ipv4/v6 address port \"6600\"","s":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","h":"","p":173},{"i":176,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MPD_URL No localhost:6600 MPD_PASSWORD No File Config Type CONFIG/mpd.json [ { \"enable\": true, \"name\": \"MyMPD\", \"data\": { \"url\": \"192.168.0.100:6600\", \"password\": \"MY_PASSWORD\" }, \"options\": { \"disableDiscovery\": false } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"enable\": true, \"name\": \"MyMPD\", \"data\": { \"url\": \"192.168.0.100:6600\", \"password\": \"MY_PASSWORD\" }, \"options\": { \"disableDiscovery\": false }, \"type\": \"mpd\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mpd/","h":"#configuration","p":173},{"i":178,"t":"In order to use Musikcube configure it to accept websocket connections in server setup: Enable the Metadata Server Set a Password Both of these settings are found in Musikcube -> (s)ettings -> server setup The URL used by MS has the syntax: [ws|wss]://HOST:[PORT] The port is the same as shown in the server setup screenshot from above, under metadata server enabled. If no port is provided to MS it will default to 7905. If no URL is provided to MS it will try to use ws://localhost:7905","s":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"","p":177},{"i":180,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MC_URL No ws://localhost:7905 Use port set for metadata server MC_PASSWORD Yes File Config Type CONFIG/musikcube.json [ { \"type\": \"musikcube\", \"enable\": true, \"name\": \"musikcube\", \"data\": { \"url\": \"ws://localhost:7905\", \"password\": \"MY_PASSWORD\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"type\": \"musikcube\", \"enable\": true, \"name\": \"musikcube\", \"data\": { \"url\": \"ws://localhost:7905\", \"password\": \"MY_PASSWORD\" } } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"#configuration","p":177},{"i":182,"t":"Other Uses To scrobble to Rocksky, create a Rocksky (Client) Rocksky is music tracking and discovery platform built on the AT Protocol (Bluesky). This Source monitors the Rocksky scrobbles in your PDS and then re-scrobbles discovered tracks to configured clients. Learn more about how Rocksky scrobbles work in the Rocksky (Client) docs.","s":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"","p":181},{"i":184,"t":"Follow the Setup instructions in the Rocksky (Client) docs to get access to your Bluesky PDS repository and scrobble data.","s":"Setup","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#setup","p":181},{"i":186,"t":"See the Rocksky (Client) configuration for general setup. The only difference for Source configuration: Cannot be setup with ENV config File/AIO config must include \"configureAs\": \"source\" ENV File AIO ENV Config Type note You cannot use ENV variables shown in the Rocksky Client config -- multi-scrobbler assumes Rocksky ENVs are always used for the client configuration. You must use the File or AIO config to setup Rocksky as a Source. File Config Type CONFIG/rocksky.json [ { \"name\": \"myRockskySource\", \"configureAs\": \"source\", \"data\": { \"key\": \"e4xwktm7jxm607x8el1fcda30eu14dzb64h3j\", \"handle\": \"alice.bsky.social\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myRockskySource\", \"configureAs\": \"source\", \"data\": { \"key\": \"e4xwktm7jxm607x8el1fcda30eu14dzb64h3j\", \"handle\": \"alice.bsky.social\" }, \"type\": \"rocksky\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#configuration","p":181},{"i":188,"t":"Find your Plex Token and make note of the URL and Port used to connect to your Plex instance. Allowed Users and Defaults Multi-scrobbler will automatically scrobble for these users by default: The User authenticated with the Plex Token and the Local User The Local User (PLEX_LOCAL_USER) is how Plex identifies anyone directly accessing the Plex UI from a local IP (who does not need to login). To allow MS to scrobble for other users use usersAllow or PLEX_USERS_ALLOW (env) from the below configuration docs. However, because you are overriding the default settings you must also explicitly list the authenticated user and the Local User if you want them to also be able to scrobble. Examples Defaults​ If usersallow and PLEX_USERS_ALLOW are not defined then the Plex Token authenticated User and Local User will be scrobbled for. Only A Specific User​ \"usersallow\": [\"SomeUser\"] or PLEX_USERS_ALLOW: SomeUser Only the Plex user SomeUser will be scrobbled for. The Plex Token authenticated user and the Local User will not be scrobbled for. A Specific User + Defaults​ (Assuming the plex authenticated user is FoxxMD) \"usersallow\": [\"FoxxMD\", \"PLEX_LOCAL_USER\", \"SomeUser\"] or PLEX_USERS_ALLOW: FoxxMD,PLEX_LOCAL_USER,SomeUser The Plex user SomeUser, the Plex Token authenticated user (FoxxMD) and the Local User will be scrobbled for. Allowed Libraries and Defaults By default multi-scrobbler will only scrobble media found in Plex libraries that are labelled as Music. librariesAllow or PLEX_LIBRARIES_ALLOW will override this Configuration​ ENV File AIO ENV Config Type Environmental Variable Required? Default Description PLEX_URL Yes The URL of the Plex server IE http://localhost:32400 PLEX_TOKEN Yes The Plex Token to use with the API PLEX_USERS_ALLOW No Comma-separated list of usernames (from Plex) to scrobble for PLEX_USERS_BLOCK No Comma-separated list of usernames (from Plex) to disallow scrobble for PLEX_DEVICES_ALLOW No Comma-separated list of devices to scrobble from PLEX_DEVICES_BLOCK No Comma-separated list of devices to disallow scrobbles from PLEX_LIBRARIES_ALLOW No Comma-separated list of libraries to allow scrobbles from PLEX_LIBRARIES_BLOCK No Comma-separated list of libraries to disallow scrobbles from File Config Type CONFIG/plex.json [ { \"name\": \"MyPlexApi\", \"enable\": true, \"clients\": [], \"data\": { \"token\": \"1234\", \"url\": \"http://192.168.0.120:32400\", \"usersAllow\": [ \"FoxxMD\", \"SomeOtherUser\" ], \"usersBlock\": [ \"AnotherUser\" ], \"devicesAllow\": [ \"firefox\" ], \"devicesBlock\": [ \"google-home\" ], \"librariesAllow\": [ \"GoodMusic\" ], \"librariesBlock\": [ \"BadMusic\" ] }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\", \"ignoreInvalidCert\": false } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyPlexApi\", \"enable\": true, \"clients\": [], \"data\": { \"token\": \"1234\", \"url\": \"http://192.168.0.120:32400\", \"usersAllow\": [ \"FoxxMD\", \"SomeOtherUser\" ], \"usersBlock\": [ \"AnotherUser\" ], \"devicesAllow\": [ \"firefox\" ], \"devicesBlock\": [ \"google-home\" ], \"librariesAllow\": [ \"GoodMusic\" ], \"librariesBlock\": [ \"BadMusic\" ] }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\", \"ignoreInvalidCert\": false }, \"type\": \"plex\" } ] } or explore the schema with an example and live editor/validator","s":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":187},{"i":190,"t":"Spotify and Automix If your Spotify player has Automix enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is \"mixed\" in your queue with a shorter play time than its actual length and Spotify does not report this modified play time in its API. This does not affect MS's ability to scrobble from Spotify but it will affect the accuracy of the duration MS reports was played. Authenticate Spotify with Multi-Scrobbler​ To access your Spotify history you must create a Spotify App to get a Client ID/Secret. Login to https://developer.spotify.com with your existing Spotify account and accept Developer Terms Navigate to your Spotify Developer Dashboard and start the Create App process Determine the correct Redirect URI to use and set it in your App settings Redirect URI Instructions A Redirect URI is the URL that Spotify will navigate your browser to after you complete authorization. The URL will contain the code necessary for multi-scrobbler to get a Spotify access token. Spotify no longer allows insecure URIs (start with http://) unless the address is 127.0.0.1 -- so localhost and internal IPs (192.168.0.xxx) no longer work. Use one of the following methods to specify a valid Redirect URI and complete Spotify authentication with multi-scrobbler: HTTPS Run MS Locally Echo Echo from echo.multi-scrobbler.app Use a domain you control, with SSL certificates/HTTPS enabled, to create a valid redirect URI. For example, if you are already running multi-scrobbler behind a reverse proxy (nginx/traefik/caddy) at https://scrobbler.mydomain.com then set the Spotify Redirect URI for your Spotify App, and multi-scrobbler SPOTIFY_REDIRECT_URI ENV, to https://scrobbler.mydomain.com/callback Alternatively, if multi-scrobbler is not accessible behind your domain, then use the Echo method with your own domain instead of 127.0.0.1. Run multi-scrobbler, configured for a Spotify Source, from the same machine as your browser in order to get credentials. In this scenario you can use http://127.0.0.1:9078/callback as the Spotify Redirect URI and multi-scrobbler SPOTIFY_REDIRECT_URI ENV. After completing authentication, copy the contents of local multi-scrobbler's configuration folder to the final location of where multi-scrobbler will be run. Use a docker container on the same machine your browser is on to \"intercept\" the callback URL from Spotify authentication, then manually finish the process by changing the domain to your multi-scrobbler instance. Create a container on the same machine as your browser using the mendhak/http-https-echo:36 image. This container runs a simple HTTP server that echos back any request it recieves. docker run --rm -p 127.0.0.1:5079:8080 mendhak/http-https-echo:36 Set the Spotify Redirect URI and multi-scrobbler SPOTIFY_REDIRECT_URI ENV as http://127.0.0.1:5079/callback In Authenticate Spotify with Multi-Scrobbler (outside these Redirect Instructions) go to Step 4 and continue the instructions Eventually, Spotify will redirect you to a web page with a URL like http://127.0.0.1:5079/callback?code=xxxxxx... In the URL, replace 127.0.0.1:5079 with the address/IP for your multi-scrobbler instance so the URL is similar to http://192.168.0.101:9078/callback?code=xxxxxx.... Then navigate to this URL to complete authentication. For your convenience, I run the mendhak/http-https-echo:36 container from the Echo approach on a domain I, the multi-scrobbler developer FoxxMD, control and self-host. Please be aware: I do not collect personal data or any querystrings/data sent in requests to this site It's not possible for me to use the code sent by Spotify to this URL without also having your Client ID/Secret However, there is always risk involved with trusting a service you do not control. Evaluate the risk of using this site for yourself. Use the Echo approach, starting from Step 2, with https://echo.multi-scrobbler.app/callback as Spotify Redirect URI and multi-scrobbler SPOTIFY_REDIRECT_URI ENV. Save your new App, then copy the Client ID/Secret from the App's Basic Information page. Add the Client ID, Secret, and Redirect URI to the respective field/ENV in the configuration section below Start multi-scrobbler, then visit the Web Dashboard and click (Re)authenticate on the Spotify card to start the auth process","s":"Spotify","u":"/multi-scrobbler/configuration/sources/spotify/","h":"","p":189},{"i":192,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description SPOTIFY_CLIENT_ID Yes SPOTIFY_CLIENT_SECRET Yes SPOTIFY_REDIRECT_URI No http://localhost:9078/callback URI must end in callback File Config Type CONFIG/spotify.json [ { \"name\": \"MySpotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MySpotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 }, \"type\": \"spotify\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/spotify/","h":"#configuration","p":189},{"i":194,"t":"This Source can be used for any application that implements the Subsonic API and supports the getNowPlaying endpoint (such as Airsonic and Navidrome) Known Issues Multiple artists are reported as one value and cannot be separated If using Airsonic Advanced the password used (under Credentials) must be Decodable Recommended Alternative Sources If your serivce supports scrobbling to Listenbrainz (such as Navidrome), considering using a Listenbrainz (Endpoint) Source instead of this one. Service-specific scrobble implementations tend to be more accurate and provide more information (multiple artists) compared to the Subsonic API. Use the optional usersAllow property with File or AIO configuration to restrict scrobbling to a list of defined users.","s":"Subsonic","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"","p":193},{"i":196,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description SUBSONIC_USER Yes SUBSONIC_PASSWORD Yes SUBSONIC_URL Yes Base url of your subsonic-api server File Config Type CONFIG/subsonic.json [ { \"name\": \"MySubsonic\", \"enable\": true, \"data\": { \"url\": \"http://localhost:4040/airsonic\", \"user\": \"yourUser\", \"password\": \"yourPassword\", \"usersAllow\": [ \"yourUser\" ] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MySubsonic\", \"enable\": true, \"data\": { \"url\": \"http://localhost:4040/airsonic\", \"user\": \"yourUser\", \"password\": \"yourPassword\", \"usersAllow\": [ \"yourUser\" ] }, \"type\": \"subsonic\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#configuration","p":193},{"i":198,"t":"Other Uses To scrobble to an ATProto PDS, create a teal.fm (Client) teal.fm is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a PDS (Personal Data Server). This Source monitors the teal.fm scrobbles in your PDS and then re-scrobbles discovered tracks to configured clients. Learn more about how teal.fm scrobbles work in the teal.fm (Client) docs.","s":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"","p":197},{"i":200,"t":"Follow the Setup instructions in the teal.fm (Client) docs to get access to your Bluesky PDS repository and scrobble data.","s":"Setup","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#setup","p":197},{"i":202,"t":"See the teal.fm (Client) configuration for general setup. The main differences for Source configuration: Cannot be setup with ENV config File/AIO config must include \"configureAs\": \"source\"","s":"Configuration","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#configuration","p":197},{"i":204,"t":"serviceAllow and serviceDeny are lists that can be used to filter what Plays are scrobbles from teal.fm. These correspond to the base domain of the music service where the Play is from, originally. The values in the list can be a subset of the actual service name (they do not need to be exact matches). Only one filter can be used at a time. If serviceAllow is configured then serviceDeny will be ignored. If a Play does not have an associated music service it can be allowed/denied using the special keyword unknown. If you are unsure what services are being used for your scrobbles you can check this by: use atproto.at to lookup your DID/handle View the Raw Data for the PDS Collection fm.teal.alpha.feed.play Check the musicServiceBaseDomain property for each record Examples Allowing only scrobbles from plyr.fm: tealfm.json [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [\"plyr\"], } } ] Deny scrobbles from last.fm: tealfm.json [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceDeny\": [\"last\"], } } ] Allow scrobbles from plyr.fm and unknown services: tealfm.json [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [\"plyr\", \"unknown\"], } } ] ENV File AIO ENV Config Type note You cannot use ENV variables shown in the teal.fm Client config -- multi-scrobbler assumes teal.fm ENVs are always used for the client configuration. You must use the File or AIO config to setup teal.fm as a Source. File Config Type CONFIG/tealfm.json [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [ \"plyr\" ], \"serviceDeny\": [ \"last.fm\" ] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myTealSource\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [ \"plyr\" ], \"serviceDeny\": [ \"last.fm\" ] }, \"type\": \"tealfm\" } ] } or explore the schema with an example and live editor/validator","s":"Service Filtering","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#service-filtering","p":197},{"i":206,"t":"MS communicates with VLC using the Web (http) interface module Enable HTTP Interface​ Open VLC: Tools Menu -> Preferences In the bottom left change Show Settings from Simple to All In the updated window select Interface -> Main interfaces In the Extra interface modules section enable Web and verify that http is shown in the textbox Select Interface -> Main interfaces -> Lua In Lua HTTP -> Password -> set a password in this box Click Save at the bottom to persist your changes Restart VLC Verify the HTTP interface is accessible by navigating to http://localhost:8080 in your browser If the interface is accessible, after typing in your password, VLC is now ready to be used by MS. Setting VLC Interface and Port​ These can be set by starting VLC from command line with specific options: vlc --http-host yourHostIp:yourPort or vlc --http-port yourPort or modify the configuration file for VLC by editing keys with the same values as from the command line (http-host and http-port) Filename Parsing​ If the file being played in VLC does not have ID3 tags/metadata information multi-scrobbler can attempt to extract artist, title, and album information from the raw filename using regular expressions. Mutli-scrobbler will only do this if there is no other information reported by VLC about these fields. To extract this information use named capture groups in your expression matching the field that should be extracted: artist title and/or album. MS accepts multiple expressions, the first one that matches a filename will be used. Example Example usage in a file-based config: config/vlc.json [ { \"name\": \"MyVlc\", \"enable\": true, \"data\": { // ... }, \"options\": { \"filenamePatterns\": [ // Extracts artist and title from filenames that look like: // My Artist - My Cool title.mp4 \"/^\\\\s*(?<artist>.+?) - (?<title>.+?)\\\\.\\\\w+$/i\" ], // logs to DEBUG when MS tries to extract data from a filename \"logFilenamePatterns\": true, } } ] Vlc Information Reporting​ If you find that VLC is incorrectly reporting track information (in its interface) but multi-scrobbler is not parsing it correctly it may be due to the name of the fields VLC is reporting. mutli-scrobbler uses the most common field name but does not cover all use cases. Before reporting an issue please turn on metadata logging and include output from your logs while it is turned on: Metadata Logging Configuration config/vlc.json [ { \"name\": \"MyVlc\", \"enable\": true, \"data\": { // ... }, \"options\": { \"dumpVlcMetadata\": true } } ]","s":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","h":"","p":205},{"i":208,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description VLC_URL No localhost:8080 VLC_PASSWORD Yes File Config Type CONFIG/vlc.json [ { \"enable\": true, \"name\": \"MyVlc\", \"data\": { \"url\": \"localhost:8080\", \"password\": \"changeme\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"enable\": true, \"name\": \"MyVlc\", \"data\": { \"url\": \"localhost:8080\", \"password\": \"changeme\" }, \"type\": \"vlc\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/vlc/","h":"#configuration","p":205},{"i":210,"t":"After installing the Webscrobbler extension open the preferences/settings for it: Under Accounts Add Webhook API URL: [YourMultiScrobblerInstance]/api/webscrobbler EX http://localhost:9078/api/webscrobbler Application name: (whatever you want) Reload the extension after adding the webhook. URL Types Supported by Webscrobbler On Firefox - Only FQNs (domain.tld), localhost, and 127.0.0.1 are supported for API URL due to firefox requiring https On Chromium-based Browsers - Any domain will work for API URL All other browsers are untested Public-Facing Usage Multi-scrobbler is not designed to be publicly accessible from the internet. To use Webscrobbler outside your local network you should be accessing MS through a VPN or through a reverse proxy with some kind of authentication (though this is still not recommended).","s":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"","p":209},{"i":212,"t":"If you would like use multiple WebScrobbler sources they can be matched using a slug at the end of the API URL. This requires using a file-based config. Example webscrobbler.json [ { \"name\": \"aUserWS\", \"clients\": [ \"client1Maloja\" ], \"data\": { \"slug\": \"usera\" } }, { \"name\": \"bUserWS\", \"clients\": [ \"client2Maloja\" ], \"data\": { \"slug\": \"userb\" } } ] To use aUserWS source set API URL to http://localhost:9078/api/webscrobbler/usera To use bUserWS source set API URL to http://localhost:9078/api/webscrobbler/userb tip http://localhost:9078/api/webscrobbler is matched with the first source that that does not have a slug defined.","s":"Multiple Users","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#multiple-users","p":209},{"i":214,"t":"MS can be configured to only scrobble, or NOT scrobble, from some WS connectors. Use the name of the website from the supported websites or from the Connectors tab in the extension. note This affects only MS's behavior and does not affect the general connector behavior you have configured within the WebScrobbler extension.","s":"Connectors Black/Whitelist","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#connectors-blackwhitelist","p":209},{"i":216,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description WS_ENABLE No Set to 'true' to enable WS without needing to define other ENVs WS_WHITELIST No Only scrobble from these WebScrobbler Connectors. Comma-delimited list WS_BLACKLIST No Do not scrobble from these WebScrobbler Connectors. Comma-delimited list File Config Type CONFIG/webscrobbler.json [ { \"name\": \"MyWebScrobbler\", \"data\": { \"slug\": \"MyOptionalSlug\", \"whitelist\": [], \"blacklist\": [] } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyWebScrobbler\", \"data\": { \"slug\": \"MyOptionalSlug\", \"whitelist\": [], \"blacklist\": [] }, \"type\": \"webscrobbler\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#configuration","p":209},{"i":218,"t":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs. Scrobbling Threshold Musiccast may not correctly report track length. If this is the case you should reduce the \"listened to\" duration using Scrobble Thresholds so that multi-scrobbler scrobbles correctly. URL​ If only a domain/IP:PORT is provided to multi-scrobbler it will automatically append the default Musiccast API path. If your Musiccast device is located behind a custom URL (or reverse proxy) you should explicitly provide the base path to use. EX url Transformed URL http://192.168.0.101 http://192.168.0.101/YamahaExtendedControl/v1 http://mydomain.com/reverseProxy/cast http://mydomain.com/reverseProxy/cast","s":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"","p":217},{"i":220,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description MCAST_URL Yes The Musiccast device URL File Config Type CONFIG/musiccast.json [ { \"name\": \"myYamaha\", \"enable\": true, \"data\": { \"url\": \"192.168.0.101\" } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"myYamaha\", \"enable\": true, \"data\": { \"url\": \"192.168.0.101\" }, \"type\": \"musiccast\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"#configuration","p":217},{"i":222,"t":"warning Communication with YT Music is unofficial and not supported or endorsed by Google. This means that this integration may stop working at any time if Google decides to change how YT Music works in the browser. Scrobble Troubleshooting Due to monitoring being unofficial, listening history from YTM can be inconsistent and can cause missed scrobbles. See the FAQ for a detailed explanation, how to see more details about MS's detection of tracks, and how to properly report an issue. Authentication​ Only one of these methods needs to be used. Cookies OAuth Client YoutubeTV Use instructions from https://github.com/patrickkfkan/Volumio-YouTube.js/wiki/How-to-obtain-Cookie or https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers to get the Cookie value from a browser. It is highly recommended to get the cookie from an Incognito/Private Session to limit the chance the session is invalidated from normal browsing. Add the cookie to your ytmusic.json config in data or as an ENV: { \"type\": \"ytmusic\", \"enable\": true, \"name\": \"MyYTM\", \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\" }, \"options\": { \"logAuthUpdateChanges\": true, \"logDiff\": true } } If MS gives you authentication errors (session invalidated) at some point in the future follow the same instructions to get new cookies. warning As of Sept 25' OAuth clients no longer seem to have permission to access the YTM service, as reported by the upstream YTM library developer and several other users. If you have existing, working OAuth credentials keep using them but there is no gaurantee they will continue to work. If you are setting up the YTM Source for the first time you should first try to use Cookies. Based on the instructions from here... Login to Google Cloud console (create an account, if necessary) Create a new project Go to APIs and services. Configure the OAuth consent screen Use the old experience if possible If new is unavoidable then do not fill out any branding and under Authorized Domains you can delete the empty one (in order to save) Add yourself as an authorized user Navigate to Credentials Create Credentials -> choose \"OAuth client ID\" Application Type is Web Application Name is whatever you want, leave Authorization Javascript origins blank Authorized redirect URIs This must be exactly the same as what is displayed in MS! For now leave it blank so we can generate it from MS first Create In the newly created client popup save the Client ID and Client Secret, then copy them into ytmusic.json or appropriate ENVs: { \"type\": \"ytmusic\", \"enable\": true, \"name\": \"MyYTM\", \"data\": { \"clientId\": \"8910....6jqupl.apps.googleusercontent.com\", \"clientSecret\": \"GOCSPX-WGXL6BSuQ343...\" }, \"options\": { \"logAuthUpdateChanges\": true, \"logDiff\": true } } Now, start MS and during the YTMusic startup it will log something like this: Will use custom OAuth Client: Client ID: ... Client Secret: ... Redirect URI: http://localhost:9078/api/ytmusic/callback?name=MyYTM If the beginning of the Redirect URI (before api) is EXACTLY how you would reach the MS dashboard from your browser (EX http://localhost:9078) then edit your google oauth client section for Authorized redirect URIs and add the URL MS has displayed. If it is NOT EXACTLY the same you either need to set MS's base url or you can provide your own (Custom) Redirect URI for MS to use by setting it in ytmusic.json or ENV. Using a Custom Redirect URI The three parts of the URL that must be the same: it must start with api (after domain or subdirectory IE my.domain.tld/api... or whatever.tld/subDir/api... it must end in ytmusic/callback It must include name=[NameOfSource] in the query string Remember to add your custom URL to the Authorized redirect URIs section in the google oauth client! { \"type\": \"ytmusic\", \"enable\": true, \"name\": \"MyYTM\", \"data\": { \"clientId\": \"8910....6jqupl.apps.googleusercontent.com\", \"clientSecret\": \"GOCSPX-WGXL6BSuQ343...\", \"redirectUri\": \"http://my.custom.domain/api/ytmusic/callback?name=MyYTM\" }, \"options\": { \"logAuthUpdateChanges\": true, \"logDiff\": true } } AFTER changing the Authorized redirect URIs on Google Cloud console you may need to wait a few minutes for it to take affect. Then restart MS. From the dashboard click (Re)authenticate on the YTmusic source card and follow the auth flow: On the screen about \"testing\" make sure you hit Continue (not Back To Safety) Make sure to select ALL scopes/permissions/grants it asks you about Select what [YourAppName] can access -> Select all Once the flow is finished MS will get the credentials and start polling automatically. You should not need to re-authenticate again after restarting MS as it saves the credentials to the /config folder. warning Using the built-in YoutubeTV authentication is unlikely to work due to Google restricting what permissions TV clients can have. This authentication method should not be used. To authenticate start multi-scrobbler with an empty YT Music configuration. An authentication URL/code will be logged in additon to being available from the dashboard. ERROR: Sign in with the code 'CLV-KFA-BVKY' using the authentication link on the dashboard or https://www.google.com/device Visit the authentication URL and enter the code that was provided (also available on the dashboard). After completing the setup flow MS will log Auth success and the YT Music dashboard card will display as Idle after refreshing. Click the Start link to begin monitoring.","s":"Youtube Music","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"","p":221},{"i":224,"t":"ENV File AIO ENV Config Type Environmental Variable Required? Default Description YTM_COOKIE No Value for Cookie Authentication YTM_CLIENT_ID No Client ID for OAuth Athentication YTM_CLIENT_SECRET No Client Secret for OAuth Athentication YTM_REDIRECT_URI No A custom redirect URI for OAuth Athentication YTM_LOG_DIFF No false Log YTM history changes File Config Type CONFIG/ytmusic.json [ { \"name\": \"MyYTMusic\", \"enable\": true, \"clients\": [], \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\", \"clientId\": \"891098404....apps.googleusercontent.com\", \"clientSecret\": \"GOCS...\" }, \"options\": { \"logDiff\": true } } ] or explore the schema with an example and live editor/validator AIO Config Type CONFIG_DIR/config.json { \"sources\": [ { \"name\": \"MyYTMusic\", \"enable\": true, \"clients\": [], \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\", \"clientId\": \"891098404....apps.googleusercontent.com\", \"clientSecret\": \"GOCS...\" }, \"options\": { \"logDiff\": true }, \"type\": \"ytmusic\" } ] } or explore the schema with an example and live editor/validator","s":"Configuration","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"#configuration","p":221},{"i":226,"t":"Multi-scrobbler configs support the ability to enhance scrobble data in an automated fashion by matching and replacing strings in title, artists, and album at many different times in multi-scrobbler's lifecycle. Why Would I Do This? You may need to \"clean up\" data from a Source or before sending to a scrobble Client due to any number of reasons: ID3 tags in your music collection are dirty or have repeating garbage IE [YourMusicSource.com] My Artist - My Title A Source's service often incorrectly adds data to some field IE My Artist - My Title (Album Version) when the title should just be My Title An Artist you listen to often is spelled different between a Source and a Client which causes duplicate scrobbles In any scenario where a repeating pattern can be found in the data it would be nice to be able to fix it before the data gets downstream or to help prevent duplicate scrobbling. Multi-scrobbler can help you do this.","s":"Enhancing Scrobbles","u":"/multi-scrobbler/configuration/transforms/","h":"","p":225},{"i":228,"t":"First, let's recap the lifecycle of a scrobble in multi-scrobbler: Sources are the beginning of the journey for a Play (song you've listened to long enough to be scrobblable) A Source finds a new valid Play The Source compares this new Play to all the other Plays it has already seen, if the Play is unique (title/artist/album/listened datetime) then... The Source discovers the Play, adds it to Plays it has seen already, and broadcasts the Play should be scrobbled to all Clients Scrobble Clients listen for discovered Plays from Sources, then... A Client receives a Play from a Source The Client compares this Play to all the other scrobbles it has already seen, if the Play is unique (title/artist/album/listened datetime) then... The Client scrobbles the Play downstream to the scrobble service and adds it as a Scrobble it has seen already","s":"Journey of a Scrobble","u":"/multi-scrobbler/configuration/transforms/","h":"#journey-of-a-scrobble","p":225},{"i":230,"t":"You'll notice there is a pattern above that looks like this: Before data is compared Data is compared After data is compared These points, during both Source and Client processes, are when you can hook into the scrobble lifecycle and modify it. TLDR​ In more concrete terms this is the structure of hooks within a configuration (can be used in any Source or Client): lastfm.json [ { \"name\": \"myLastFm\", \"enable\": true, \"configureAs\": \"source\", \"data\": { // ... }, \"options\": { \"playTransform\": { \"preCompare\": [/* ... */], \"compare\": [/* ... */], \"postCompare\": [/* ... */] } } } ]","s":"Lifecyle Hooks","u":"/multi-scrobbler/configuration/transforms/","h":"#lifecyle-hooks","p":225},{"i":232,"t":"For Sources: preCompare - modify Play data immediately when received compare - temporarily modify Play data when it is being compared to see if Play was already discovered postCompare - modify Play data before sending to scrobble Clients For Clients: preCompare - modify Play data immediately when received compare - temporarily modify Play data when it is being compared to see if it was already scrobbled postCompare - modify Play data before scrobbling it to downstream service and adding to already seen scrobbles Transformed Scrobbles Are Permanently Modified Keep in mind that modifying Scrobble/Play data earlier in the lifecycle will affect that data at all times later in the lifecycle (except when using the compare hook). For example, to modify the track so it's the same anywhere it is processed in multi-scrobbler you only need to modify it in the Source's preCompare hook because all later processes will receive the data with the modified track. TLDR To modify a scrobble coming from one of your Sources use the preCompare hook. Using compare hook The compare hook is slightly different than preCompare and postCompare. It consists of an object where you define which side(s) of the comparison should be modified. It also does not modify downstream data! Instead, the modifications are made only for use in the comparison. lastfm.json [ { \"name\": \"myLastFm\", // ... \"options\": { \"playTransform\": { \"compare\": [ { \"candidate\": {/* ... */}, // modify the \"new\" Play being compared \"existing\": {/* ... */}, // modify all \"existing\" Play/Scrobbles the new Play is being compared against } ], } } } ]","s":"Hook","u":"/multi-scrobbler/configuration/transforms/","h":"#hook","p":225},{"i":234,"t":"Each hook is made up of one or more Stages. A Stage is a self-contained, unique way of enhancing or modifying the Play data. Some examples of a Stage: The User Stage allows a user to define search-and-replace terms for Artist/Title/Album The Native Stage uses MS's built-in heuristics to extract Artists from a single Artist string The Musicbrainz Stage tries to match Play data with the Musicbrainz database and to standardize the Artist/Title/Album data Each Stage in a Hook receives Play data from the previous Stage. Within a hook, each Stage minimally consists of a type to identify what Stage it is along with any other data specific to that stage: { \"type\": \"native\" // optional, stage specific data here... }","s":"Modification Stage","u":"/multi-scrobbler/configuration/transforms/","h":"#stage","p":225},{"i":236,"t":"Stages may be globally configured using AIO Config config.json file in the top-level transformers block. Each Stage consists of: type the type of Stage name a unique name for the Stage, to be (potentially) used with hooks defaults - An object defining default configuration for this stage, when used in a Hook. data - An object containing any data required to initially configure the stage itself (Example: API URL, username, password, etc...) Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\", \"defaults\": { // default delimiters when this Stage is used in a hook \"delimiters\": [ \"•\" ], // default delimiters when this Stage is used in a hook \"artistsParseFrom\": [\"artists\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\" \"name\": \"MyNativeTransformer\" // when \"name\" is not defined, uses first found \"native\" transformer } ] } } } ] Multiple stages of the same type may be configured, allowing you to define several sets of default behavior. Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"DotTransformer\", \"defaults\": { \"delimiters\": [ \"•\" ], \"artistsParseFrom\": [\"artists\"] } }, { \"type\": \"native\", \"name\": \"TitleOnly\", \"defaults\": { // extracts and uses *only* artists found in title string \"artistsParseFrom\": [\"title\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\" \"name\": \"DotTransformer\" } ] } } } ] In a VLC File Config: vlc.json [ { \"name\": \"MyVLC\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\" \"name\": \"TitleOnly\" } ] } } } ] Overriding Configuration​ The default configuration you set for your Stage may be overridden in any usage of the Stage within a Hook. Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\", \"defaults\": { // default delimiters when this Stage is used in a hook \"delimiters\": [ \"•\" ], // default delimiters when this Stage is used in a hook \"artistsParseFrom\": [\"artists\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\" \"name\": \"MyNativeTransformer\", // overrides property from \"defaults\" \"artistsParseFrom\": [\"artists\", \"title\"] } ] } } } ]","s":"Configuring Stages","u":"/multi-scrobbler/configuration/transforms/","h":"#configuring-stages","p":225},{"i":238,"t":"Each Stage may specify whether it should apply the resulting transformation to different parts of the Play data by specifying title, artists and/or album in the Stage object. { \"type\": \"native\", // ... \"title\": false, // will not apply any changes to Play title \"artists\": { \"when\": {/* ... */}, // will only apply changes to Play artists if \"when\" is satisfied /* ... */ }, \"albumArtists\": true, // will always apply changes to Play album artists \"album\": true, // will always apply changes to Play album \"duration\": true, // will always apply changes to Play duration (length of track) \"meta\": true, // will always apply changes to Play meta (MBIDs, spotify links, etc...) } The actual value of each property may be different for each Stage. Check the docs for the Stage you want to use to see its usage of each. Generically, though, each property may be some value or an object combining a when condition and that value. If none of the properties are specified in the stage then it's assumed all transformed data should be used. note Specifying these Rules is not the same as configuring the Stage. Rules only determine if the result of the transformation should be used (replace) the existing Play Data.","s":"Rules for Play Data","u":"/multi-scrobbler/configuration/transforms/","h":"#stage-rules","p":225},{"i":240,"t":"Stages may be optionally configured to continue to the next Stage or stop (end early) all subsequent Stages, based on the outcome of the currently running Stage. These three properties can be added to the Modification Stage data, alongside Rules: onSuccess (default continue) - If the Stage successfully finishes processing onFailure (default stop) - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation result onSkip (default continue) - If the Stage does not process the Play data due to stage-level when or other stage-specific skip conditions tip The default behaviors for Flow Control are the same as you would intuitively think Stages should run IE the next Stage you have defined runs if the current Stage does not fail. Specifying Flow Control is only necessary if the above assumptions are not true for your scenario. Default Flow Control Example subsonic.json // ... \"options\": { \"playTransform\": { \"preCompare\": [ { // if this stage is successful, native is run // if this stage fails, native does not run \"type\": \"musicbrainz\", \"name\": \"MyMB\" }, { \"type\": \"native\", \"name\": \"MyNative\" } ] } } Customized Flow Control Example subsonic.json // ... \"options\": { \"playTransform\": { \"preCompare\": [ { // if musicbrainz is successful then do NOT run native, // only run native if musicbrainz fails to find a match (onFailure) \"type\": \"musicbrainz\", \"name\": \"MyMB\" \"onSuccess\": \"stop\", \"onFailure\": \"continue\" }, { \"type\": \"native\", \"name\": \"MyNative\" } ] } }","s":"Stage Flow Control","u":"/multi-scrobbler/configuration/transforms/","h":"#flow-control","p":225},{"i":242,"t":"Stages within a Hook, and Rules within each Stage, support a when object for testing if they should be run. The when object may have propertes for rule. Each property may be a string or regular expression. The value of the property is used to match the pre-transformation values from Play data. All parts of an individual when clause must test true to \"pass\" but if any when clauses pass the Stage/Rule is processed. If the when test does not pass then the Stage is skipped (onSkip). { \"when\": { \"artist\": \"Elephant Gym\", // Play must have an artist matching \"Elephant Gym\" (AND) \"album\": \"Dreams\" // Play object must have an album matching \"Dreams\" (AND) } } { \"when\": [ { \"artist\": \"Elephant Gym\", // Play must have an artist matching \"Elephant Gym\" (AND) \"album\": \"Dreams\" // Play object must have an album matching \"Dreams\" (AND) }, // OR { \"title\": \"/(Remastered)$/\", // Play title must match regular expression (AND) \"album\": \"Various Artists\" // Play album must match \"Various Artists\" (AND) } ] } More succinctly: All parts (artist album albumArtist duration meta title) of a when are AND conditions All part-objects in the when array are OR conditions Example of Stage with when condition { // IF the artist is Elephant Gym // THEN Run native stage \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", \"when\": [ { \"artist\": \"/Elephant Gym/\" } ] } ], } } Example of individual rule with when condition { // Always run native Stage // // IF artist matches \"Elephant Gym\" // THEN use result of native stage for \"artists\" of Play data \"playTransform\": { \"preCompare\": { \"type\": \"native\", \"artists\": { \"when\": [ { \"artist\": \"/Elephant Gym/\" } ] }, } } }","s":"Conditionally Run","u":"/multi-scrobbler/configuration/transforms/","h":"#conditional-modification","p":225},{"i":244,"t":"MS can log a diff of Stage transformations if/when they occur. In the playTransform object of a Source/Client config use log: \"log\": true => Output original play + final transformed output of last Stage in the array This can also be enabled by using DEBUG_MODE=true \"log\": \"all\" => Output original play + final transformed output of each Stage in the array { \"name\": \"myThing\", \"data\": {/*...*/}, \"options\": { \"playTransform\": { \"preCompare\": {/*...*/}, \"log\": true } } } Example The output shows the diff between the previous stage (or original Play) and the current stage. In docker logs this is highlighted with diff syntax: [2025-12-17 08:53:10.467 -0500] DEBUG : [App] [Sources] [Lastfm - mylfm] [Play Transform] [preCompare] [VLDJJo] Transform Diff - Original + musicbrainz-MyMB Title : Demons Theme Part II (original 12\" mix) Artists : LTJ Bukem Album Artists: (None) - Album : Producer 05: Rarities (Original 12\" Version) + Album : Producer 05: Rarities (original 12\" version) Meta : * brainz-album: 36759a8a-d3df-47da-a236-60f84fdc0cab + * brainz-artist: 28c1b7b7-355a-48b1-b2c4-75b8eb8080ef + * brainz-track: a0d51240-7ef1-4676-882e-be9f354075cb + * brainz-releaseGroup: e0cce74f-abcc-343b-9390-1673e4d57ce7","s":"Logging","u":"/multi-scrobbler/configuration/transforms/","h":"#logging","p":225},{"i":246,"t":"See Examples sections in specific Stage docs (also in the sidebar): User Stage Native Stage Musicbrainz Stage","s":"Examples","u":"/multi-scrobbler/configuration/transforms/","h":"#examples","p":225},{"i":248,"t":"The Native Stage uses built-in heuristics to try to extract Artists from Play artist/track data. This Stage is most useful for Sources that report limited data such as: Subsonic - Reports Artists as a single string A non-exhaustive list of heuristics: Splits artists in artist string using common delimiters EX Foo Artist, Bar Guy, Baz Band - My Cool Song Does not split artists with & in name, if other delimiters are present Does not split artist name when only one delimiter is present Splits artists on common joiner phrases (ft. feat. vs. etc...) Extracts artists from Play title using joiner phrases EX My Cool Song (feat. SomeGuy) A practical example of what the Native Stage will do to Play data: This Scrobble from Subsonic { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup & Punk Rock Factory\"] } Will be transformed into this { \"title\": \"Endless Possibility\", \"artists\": [\"Bowling For Soup\", \"Punk Rock Factory\", \"Wheatus\"] }","s":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","h":"","p":247},{"i":250,"t":"Available properties for Stage Configuration: delimitersExtra - A list of string characters that should be considered delimiters for artists in addition to multi-scrobbler's default list (, / \\ ) delimiters - A list of string characters that should be considered delimiters for artists. Replaces all delimiters (MS not use any defaults, only what you give it) artistsIgnore - a list of strings and/or regular expressions. Any monolothic artist string that matches from the list will not be modified. artistsParseFrom a list of the properties that should be used to try to extract artists. Can be artists title or both. Defaults to both when not provided in options ( [\"artists\", \"title\"] ) When artists is present it tries to extract additional artists from artist strings When title is present it tries to extract artists from ft. feat. vs. etc... found in the track title Importantly, if artists is not present in artistsParseFrom then no artists are used at all (only those from title, if present) artistsParseMonolithicOnly - boolean value, defaults to true. When true native tranformer will only attempt to extract artists if the scrobble data has only one string for artist (pre-transform) This means that, for Sources like Spotify/Jellyfin/etc. that provide proper lists of artists in their data and the list has more than one string, it will not try to extract artists from their strings Example of the behavior for artistsParseFrom The Foos, The Bars - My Cool Track (ft. Frank) Config => extracted artists \"artistsParseFrom\": [\"artists\", \"title\"] => The Foos, The Bars, Frank \"artistsParseFrom\": [\"artists\"] => The Foos, The Bars \"artistsParseFrom\": [\"title\"] => Frank \"artistsParseFrom\": [] =>","s":"Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#configuration","p":247},{"i":252,"t":"Each Rule should be either a boolean, specifying if the transformed data should be used for this field, or a when condition.: { \"type\": \"native\", // ... \"title\": false, // will not apply any changes to Play title \"artists\": { \"when\": {/* ... */}, // will only apply changes to Play artists if \"when\" is satisfied /* ... */ }, \"album\": true // will always apply changes to Play album } If a rule is not present then multi-scrobbler defaults it to true.","s":"Rules","u":"/multi-scrobbler/configuration/transforms/native/","h":"#rules","p":247},{"i":254,"t":"For your convenience, if you do not define any Native Stage Configurations then multi-scrobbler automatically builds one using the defaults shown in configuration. This can be used by omitting the name in your modification Stage. Example In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", // do not include name, the default native stage will be used } ] } } } ]","s":"Default Stage","u":"/multi-scrobbler/configuration/transforms/native/","h":"#default-stage","p":247},{"i":256,"t":"The default configuration shown above can also be applied using ENV Config for individual Sources/Clients. Use ENV *_TRANSFORMS=native on each Source/Client you wish to apply this stage to. This applies the stage in the preTransform Hook with all Rules enabled. The * stands for the prefix used for each Source/Client's ENV keys. Refer to the individual Source/Client Configuration sections to find this. Example All Subsonic Source ENVs look like SUBSONIC_USER=myuser etc... Use SUBSONIC_TRANSFORMS=native Example Full Docker Deploy with ENV Configuration Using Jellyfin + Maloja example from Quickstart: services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - JELLYFIN_URL=192.168.0.110:8096 - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b - JELLYFIN_USER=MyUser - JELLYFIN_TRANSFORMS=native # applies native Stage to preTransform of Jellyfin source - MALOJA_URL=http://192.168.0.100:42010 # maloja receives enhanced scrobble from Jellyfin - MALOJA_API_KEY=myApiKey volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped","s":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#env-configuration","p":247},{"i":259,"t":"Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\", \"defaults\": { // default delimiters when this Stage is used in a hook \"delimiters\": [ \"•\" ], // default delimiters when this Stage is used in a hook \"artistsParseFrom\": [\"artists\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\" } ] } } } ]","s":"Parse only artists string using a custom delimiter","u":"/multi-scrobbler/configuration/transforms/native/","h":"#parse-only-artists-string-using-a-custom-delimiter","p":247},{"i":261,"t":"Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\", \"defaults\": { \"artistsIgnore\": [ \"Crosby, Stills, Nash & Young\", \"Polo & Pan\" ] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", \"name\": \"MyNativeTransformer\" } ] } } } ]","s":"Don't parse specific artists","u":"/multi-scrobbler/configuration/transforms/native/","h":"#dont-parse-specific-artists","p":247},{"i":263,"t":"In the scenario where you want to extract Artists from Track titles with joiners like My Cool Track (feat. Foobar) but want to keep the title as-is: Example No additional stage configuration is required so we can use the default Stage. In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"native\", \"title\": false // do not modify title } ] } } } ]","s":"Extract Artists from Title but do not modify Title","u":"/multi-scrobbler/configuration/transforms/native/","h":"#extract-artists-from-title-but-do-not-modify-title","p":247},{"i":265,"t":"The Musicbrainz Stage matches your Play data with the MusicBrainz database. If the match score is high enough then Multi-Scrobbler uses the match to correct and fill-in missing information in your Play data. This Stage is useful for standardizing your Scrobble's Play data, regardless of the Source it is coming from. Even if you have have strong opinions about the way your existing music is already tagged/organized you should consider adding the Musicbrainz Stage to your Sources, if only to benefit from adding MBIDs to scrobbled metadata. Why Should I Prefer MusicBrainz? More Than Mainstream Data The MusicBrainz database contains 37 million+ tracks 5 million+ albums 2.7 million+ artists in over 200 languages, contributed by 10,000+ editors each year with many more users voting on edits. The database covers a much wider range of music than most commercial services since it isn't restricted by licensing or incentivized to prioritize mainstream music due to business interests. You are much more likely to find data for obscure, indie, and international artists. As The Artist Intended While some large services (Spotify) may be more consistent in data structure, the MusicBrainz equivalent data is likely to be more true to the way the Artist originally intended since individuals can devote effort to individual artists. A fan of an artist is much more likely to \"get it right\" for their favorite band than a corporate business trying to do the least amount of work for the largest result. tip If you are using ENV Config for multi-scrobbler and just want a quick and easy setup, skip to ENV Configuration. tip Set up Valkey Caching to cache Musicbrainz API calls for faster processing.","s":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":264},{"i":267,"t":"The MusicBrainz database contains 37 million+ tracks 5 million+ albums 2.7 million+ artists in over 200 languages, contributed by 10,000+ editors each year with many more users voting on edits. The database covers a much wider range of music than most commercial services since it isn't restricted by licensing or incentivized to prioritize mainstream music due to business interests. You are much more likely to find data for obscure, indie, and international artists.","s":"More Than Mainstream Data","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":264},{"i":269,"t":"While some large services (Spotify) may be more consistent in data structure, the MusicBrainz equivalent data is likely to be more true to the way the Artist originally intended since individuals can devote effort to individual artists. A fan of an artist is much more likely to \"get it right\" for their favorite band than a corporate business trying to do the least amount of work for the largest result.","s":"As The Artist Intended","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":264},{"i":272,"t":"To avoid rate limiting, MusicBrainz requires API users to identify themself using a User-Agent that contains an email or URL. You must set this in the data for your stage configuration in your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, } ] } Additional Musicbrainz Servers Other, or additional, Musicbrainz Servers/Mirrors can be added to the API configuration. If more than one server is defined then multi-scrobbler will round-robin load balance API calls. Use url to define the base URL of the Musicbrainz server to use. If url is not defined multi-scrobbler assumes it is the primary Musicbrainz server, https://musicbrainz.org. Example of multiple servers: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" // uses default Musicbrainz server https://musicbrainz.org }, // additional server { \"contact\": \"contact@mydomain.com\", \"url\": \"https://my.mb.mirror.domain.com\" } ] }, } ] }","s":"API Setup","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#api-setup","p":264},{"i":274,"t":"All of the properties found in Matching with Musicbrainz section are configured in Stage Configuration as defaults. Example: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ], \"defaults\": { \"releaseStatusPriority\": [\"official\"], \"releaseAllowEmpty\": true } }, } ] }","s":"Stage Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#stage-configuration","p":264},{"i":276,"t":"Add your Stage to a Source or Client by specifying it in a Hook: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ] Each Stage Rule should be either a boolean, specifying if the transformed data should be used for this field, or a when condition: Example subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" // ... \"title\": false, // will not apply any changes to Play title \"artists\": { \"when\": {/* ... */}, // will only apply changes to Play artists if \"when\" is satisfied /* ... */ }, \"album\": true // will always apply changes to Play album \"meta\": true // adds MusicBrainz MBIDs to scrobble data } ] } } } ] Per Component Override The defaults you set in Stage Configuration can be overriden/added to (per property) in each Hook. Example subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"releaseStatusPriority\": [\"psuedo-release\"], // override from defaults \"searchOrder\": [\"freetext\"] // add new property, combined with defaults } ] } } } ]","s":"Rules and Hooks","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#rules-and-hooks","p":264},{"i":278,"t":"The general configuration shown above can also be configured from a selection of presets using ENV Config for individual Sources/Clients. You must always include the MB_CONTACT ENV to identify your application: MB_CONTACT=contact@mydomain.com To configure stage defaults use MB_PRESETS with a comma-delimited list of presets you wish to apply. More than one preset can be applied, in which case they combine. You must choose at least one of the presets below: default - Adds the default searchOrder isrc+basic (same as using no presets that affect searchOrder) id - Adds searchOrder methods that priorites searching by ID: isrc + mbidrecording + basicOrIds + basic native - Adds Extracted Artists (artist) in native mode to searchOrder aggressive - Adds Free Text Search (freetext) to searchOrder fields - Applies Field Scoring to match sorting so match text is baised towards similarity to original scrobble sensible - Applies the Sensible Default configuration for sorting releases Finally, use ENV *_TRANSFORMS=musicbrainz on each Source/Client you wish to apply this stage to. This applies the stage in the preTransform Hook with all Rules enabled. The * stands for the prefix used for each Source/Client's ENV keys. Refer to the individual Source/Client Configuration sections to find this. Example: All Subsonic Source ENVs look like SUBSONIC_USER=myuser etc... Use SUBSONIC_TRANSFORMS=musicbrainz Example Full Docker Deploy with ENV Configuration Using Jellyfin + Maloja example from Quickstart: services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - MB_CONTACT=contact@mydomain.com # searches with sensible release sorting with the searchOrder # isrc => basic => artist (native mode) - MB_PRESETS=default,sensible,native - JELLYFIN_URL=192.168.0.110:8096 - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b - JELLYFIN_USER=MyUser # applies musicbrainz Stage to preTransform of Jellyfin source - JELLYFIN_TRANSFORMS=musicbrainz # maloja receives enhanced scrobble from Jellyfin - MALOJA_URL=http://192.168.0.100:42010 - MALOJA_API_KEY=myApiKey volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped","s":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#env-configuration","p":264},{"i":280,"t":"note All properties found in this section are optional. If you just want a sensible default for configuraion refer to the Best Practices section. Matching your Scrobble's Play data with a result from Musicbrainz is comprised of two steps: Searching Musicbrainz using parts of your Scrobble as queries Refining matched results to select the desired/allowed match Both steps have separate configuration.","s":"Matching with Musicbrainz","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#matching-with-musicbrainz","p":264},{"i":282,"t":"Should MS Search?​ Before MS begins a search it checks if your Scrobble data already contains: MBIDs for artists, album, and specific track/recording and duration If it already has all required data types then the entire Musicbrainz Stage is skipped. If any are missing then a search is performed. Define which data types are required using: searchWhenMissing (defaults to all) - A list containing any of: artists title album duration forceSearch (default false) - Force searching even if all required data is present Example Stage Configuration example: // ... \"defaults\": { // only search if MBIDs for artists or album is missing \"searchWithMissing\": [\"artists\", \"album\"] // uncomment to make the stage always search, even if above data is present //forceSearch: true } If required data is missing then the next step is making search queries to the Musicbrainz database to try to get potential candidates. Search Methods​ Multi-scrobbler can search for Musicbrainz matches using multiple methods. You control: the search methods that are used the order in which search methods are executed All search methods will be run in the order they were defined until one method returns at least one match. The methods you choose, and the order they run in, can drastically change how many API calls are needed to get a match, and what types of matches are returned. See Search Considerations for guidance on how to decide on methods based on Source. To set search methods and their order use the searchOrder option in your Stage Configuration: // ... \"defaults\": { // only searches using these methods, in the order they are listed here \"searchOrder\": [\"isrc\", \"mbidrecording\", \"basic\",\"freetext\"] } Default Search Methods If searchOrder is undefined then Multi-scrobbler will default to using isrc then basic method. Available Methods ISRC (isrc) If your Scrobble data contains an ISRC (usually from Spotify) then Multi-scrobbler can search using this ID, only. Stage Configuration example: // ... \"defaults\": { // will only search using isrc \"searchOrder\": [\"isrc\"] } Track MBID (mbidrecording) If your Scrobble data contains an Track (Recording) MBID then Multi-scrobbler can search using this MBID, only. Stage Configuration example: // ... \"defaults\": { // will only search using recording mbid \"searchOrder\": [\"mbidrecording\"] } Album, Artist, and Title Fields (basic) Will search Musicbrainz using any/all available text fields from your scrobble: Album, Artists(s), and Title. Does not leverage any existing MBIDs. Stage Configuration example: // ... \"defaults\": { // will only search using album, artist(s), and title \"searchOrder\": [\"basic\"] } Album/Artist/Title OR MBIDs (basicOrIds) This is the same as the above Album, Artist, and Title Fields search except that if the scrobble data contains any corresponding MBIDs it will use those instead of the plain text field. Stage Configuration example: // ... \"defaults\": { // will only search using album, artist(s), and title \"searchOrder\": [\"basicOrIds\"] } Example: { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup\"] \"albumMbid\": \"c9f91cdc-984e-4303-9a51-4ac0dfa2348f\", \"album\": \"My Cool Album\" } Multi-scrobbler will search Musicbrainz using title, artists, and albumMbid but NOT album. Album And Title Only (album) If your Scrobble data contains a title, artist(s), and an album (all three fields) then Multi-scrobbler can search using only title and album by using album for searchOrder: Stage Configuration example: // ... \"defaults\": { // will only search using only title + album name \"searchOrder\": [\"album\"] } Extracted Artists (artist) If your scrobble data contains only one artist string then Multi-scrobbler can attempt to extract multiple artists from your artist and track string. Use artist with searchOrder and optionally specify the extraction mode with searchArtistMethod: Stage Configuration example: // ... \"defaults\": { // will only search using title/album + extracted artists \"searchOrder\": [\"artist\"], //searchArtistMethod: 'native' // optional } searchArtistMethod can be set to Native or Naive mode: Native (Recommended) Naive Native (native) mode uses an aggressive configuration of the Native Stage to extract artists using common delimiters and common \"joined\" artist patterns from the artist and title string of your Scrobble data. tip If you already have a Native Stage configured you should use that instead, running it before the Musicbrainz stage. Native Mode Example { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup & Punk Rock Factory, My Cool Band\"] } Extracts Bowling For Soup Punk Rock Factory My Cool Band from artist string Extracts Wheatus from title string Removes (feat. Wheatus) from title string because it found an artist there Resulting data used for Musicbrainz search: { \"title\": \"Endless Possibility\", \"artists\": [\"Bowling For Soup\", \"Punk Rock Factory\", \"My Cool Band\", \"Wheatus\"] } Stage Configuration example: // ... \"defaults\": { // will only search using title/album + native extracted artists \"searchOrder\": [\"artist\"], \"searchArtistMethod\": \"native\" } Naive (naive) mode looks for the first found common delimiter in the artist string. If it finds one then it uses the preceding value as the only artist in the Musicbrainz search. It does not try to extract additional artists from the artist string, or extract anything from the title string. Naive Mode Example { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup, Punk Rock Factory & Wheatus\"] } Finds & as first common delimiter, extracts \"Bowling For Soup\" Resulting data used for Musicbrainz search: { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup\"] } Stage Configuration example: // ... \"defaults\": { // will only search using title/album + naive extracted artists \"searchOrder\": [\"artist\"], \"searchArtistMethod\": \"naive\" } Free Text (freetext) This will search Musicbrainz for all text of your Scrobble data artist/title/album, without constraint. warning Free text search is unconstrained which means that Musicbrainz will match text in any part of a Recording (artist, release, or recording field), regardless of where it is found. This may lead to results that are unexpected and undesired. If you know your Source's Play data is well organized you should not enable this. Free Text search should only be used if: your music is not well organized or there may be many alternative titles/artists for the music you listen to (such as with psuedo-releases) you can tolerate that matches may not be accurate for releases. Generally, if you keep score high then matched releases should at least be the right artist or what you would expect within a reason, as a match. The release may not be the one you actually listened to but it would be \"close enough\". Stage Configuration example: // ... \"defaults\": { // ... // will only search using free text search of all artist/album/title \"searchOrder\": [\"freetext\"], } note If all defined search methods do not return any results then the stage is marked as failed (onFailure) for Flow Control.","s":"Searching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#searching","p":264},{"i":285,"t":"Each match returned by MusicBrainz contains a numeric score representing how close it was to the search parameters. Set score in configuration to set a minimum score that must be met by matches. Default is 90. { // ... \"score\": 90 // matches must score 90 or higher to be considered }","s":"Score","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#score","p":264},{"i":287,"t":"There are several attributes associated with the Release a Recording (individual Track/song) belongs to that you may be interested in controlling. MS can use these attributes to filter what the final Recording selected to match against your Play data is. An easy way to think about this: Do you prefer Albums, Singles, or EPs? Do you always want to use an official album release, or are bootleg or cancelled albums okay to use? Should a track that belongs to a Compilation album be allowed to match? What country do you prefer an album release to be from? Release Attributes​ These attributes (attribute_name in config) are: Release Status (releaseStatus) - Is this release/album/ep official, promotional, bootleg, etc... Release Group Primary Type (releaseGroupPrimaryType) - Is this release an Album, Single, EP, etc... Release Group Secondary Type (releaseGroupSecondaryType) - Is this release a compilation, soundtrack, remix, etc... Release Country (releaseCountry) - What ISO2 country was this released in? US, GB, MX, etc... MusicBrainz uses the special code XW to represent a \"Worldwide\" release AKA release not made specifically for a country Each of the above attributes can be used to filter matches using allow (explicitly include) or deny (exclude) terms. The correct property name for each is like so: [attribute_name]Allow = [...] [attribute_name]Deny EX to explicitly allow only release status \"official\" \"releaseStatusAllow\": [\"official\"] EX to exclude compilations \"releaseGroupSecondaryTypeDeny\": [\"compilation\"] Empty Releases​ Sometimes a Recording may not have any associated Releases. This may be because there is not enough information about the Recording yet, or it was never included on an actual Release. You may want to filter the majority of your matches by releases but allow matching a Recording that has no releases to begin with. To allow this set releaseAllowEmpty to true in configuration: // ... \"defaults\": { // ... \"releaseAllowEmpty\": true // don't remove a match during filtering just because it has no releases }","s":"Filtering","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filtering","p":264},{"i":289,"t":"After matches have been filtered, the remaining matches and their releases* can be sorted. Matches/Releases with an attribute that does not match are not removed, but they are sorted lower than matches that do match. Sorting can be a good alternative to filtering: with filters there is a possibility your filters may eliminate all matches; if you want to ensure that some match will be used then sorting can ensure that the best choice out of those given will always be used, without accidentally ending up with no choice. Sorting can be used instead of filters, or in conjunction with filters, it's your choice. Release Attributes​ Each Release Attribute has one additional property that can be used to rank releases based on the order of the values you give it. This is the priority property. In configuration: [attribute_name]Priority = [...] EX to prefer \"official\" releases over everything else \"releaseStatusPriority\": [\"official\"] EX to prefer albums, then singles, over everything else \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\"] Field Scoring​ Matches can additionally be sorted/ranked based on how similar their fields are to the original Scrobble. Use these properties for sorting when you want the final Musicbrainz match to be as closely matched to the original Scrobble, as opposed to what may be the most \"correct\" match based on the Musicbrainz score or suggested Release. Example Scenario You scrobble this track from spotify, which has an English title, Album name, and Artist name. { \"track\": \"Price\", \"artists\": [\"ATLUS Sound Team\"], \"album\": \"PERSONA5 ORIGINAL SOUNDTRACK\" } However, the Recording found by Musicbrainz has multiple Releases (albums). The first suggested release is a related Album with similar name (Persona 25th Anniversary Deluxe Vinyl Box Set) but it's not the same as your album. Additionally, the artists for this album are in Japanese, rather than English. You have used releaseStatusPriority to prioritize psuedo-release which does work but there are still multiple releases chosen, and some are non-English (『ペルソナ5』オリジナル・サウンドトラック). Using \"albumWeight\": 0.4 and \"artistWeight\": 0.3 ensures that the releases that have an album name, and artist names, more similar to your original scrobble are ranked higher. Resulting in the correct Release (PERSONA5 ORIGINAL SOUNDTRACK) being chosen as the final match. Add one or more of these weight properties to your Stage Configuration to enable Field Scoring: // ... \"defaults\": { // ... // enables album text similiarity scoring \"albumWeight\": 0.33, // enables title text similiarity scoring \"titleWeight\": 0.33, // enables artist text similiarity scoring \"artistWeight\": 0.33 } While not enforced, it's a good idea to keep these weights under 1. And if using more than one weight, they should be add up to 1. How Scoring is Combined The score similarity from albumWeight will be added to the score accumulated by Release Attributes to affect the final ranking of each Release for a Match/Recording. In the final sorting of Recordings, title score + artist score is combined with the top ranked release album score. The top ranked score is then used to choose the matched Recording.","s":"Sorting","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sorting","p":264},{"i":292,"t":"Generally, the Musicbrainz Stage can be used without any of the optional configuration and you should still see good results from matches. The top scored match is, anecdotally, good enough for correcting and filling in surface-level play data like Title and Artist names. For a more opinionated match that will mirror what you would expect from data from large music services: { // use official release over anything else \"releaseStatusPriority\": [\"official\"], // prefer album, then single, then ep \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], // prefer worldwide release \"releaseCountryPriority\": [\"XW\"] } Consider adding Artist Extraction (artist) in Native Mode if any of your Sources do not support multiple artists or your music collection is not tagged well. Details { // use official release over anything else \"releaseStatusPriority\": [\"official\"], // prefer album, then single, then ep \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], // prefer worldwide release \"releaseCountryPriority\": [\"XW\"], // search using extracted artist as last search attempt \"searchOrder\": [\"isrc\", \"basic\", \"artist\"], \"searchArtistMethod\": \"native\" }","s":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default","p":264},{"i":294,"t":"How complete, and accurate, your scrobble data is from a certain Source should dictate what Search Methods you should use for matching. Musicbrainz agressively normalizes artist, album, and title fields in its database which means that if your Scrobble data contains major innaccuracies or phrases fields in a non-normal way, it's possible Musicbrainz won't find any matches. This is a more common occurrence when trying to match Scrobble data from Sources that don't support multiple artist data, like Subsonic and Last.fm. Examples of Bad Data Last.fm Scrobble returns an Artist in the title and combines two artists into one string: { \"title\": \"Endless Possibility (feat. Wheatus)\", \"artists\": [\"Bowling For Soup & Punk Rock Factory\"] } The corresponding Musicbrainz Recording has all artists separated and no artist in the title: { \"title\": \"Endless Possibility\", \"artists\": [\"Bowling For Soup\", \"Punk Rock Factory\", \"Wheatus\"] } In general, you should prioritize methods that search by unique identifiers (isrc mbidRecording basicOrIds) if you know your Sources may contain accurate data for these. Such as: Spotify, Jellyfin, Plex, and Listenbrainz (Source). Use field-based methods if your Sources do not return IDs consistently (or at all). Add more field-based methods the more inaccurate your scrobble data may be, but be aware that more aggressive/broad searches may return less accurate results. Matching Scrobbles from Last.fm Last.fm is inconsistent when it comes to matching your scrobbles. It will accept (almost) any fields for track/title/album and aggressively attempt to match/correct these, regardless of your intentions. Unless the client scrobbling to Last.fm is also sending an mbid, it's likely your scrobble will not be consistently matched correctly and so the mbid supplied by last.fm in its scrobble data will be wrong. Therefore, you should avoid using mbidRecording and basicOrIds as the primary search methods (or understand the risks of using them). Instead, prefer to use field-based methods before falling back to id-based methods.","s":"Search Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#search-considerations","p":264},{"i":296,"t":"When using your own filters consider: Prefer deny over allow Releases come in all kinds of formats. Since allow is explicit you may filter out your desired match without realizing it (correct data except for release type). Or the Musicbrainz data for a higher scored match may be appropriate but you did not include it, exhaustively. Prefer Sorting over Filtering Sorting does not eliminate any matches. It is, generally, better to get some match than it is to have your Play data completely uncorrected because filtering eliminated all matches","s":"Filter Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filter-considerations","p":264},{"i":298,"t":"Use Rules to apply MusicBrainz match data selectively. If you know that your music collection is well organized and you do not want to change the artists/title/album etc... sent to a Client, you can still benefit from matches by only applying MBIDs using meta so that any Client that supports Musicbrainz data (Koito, Tealfm, Listenbrainz, Rocksky) can still get that data. Example subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"title\": false, \"artists\": false, \"album\": false, \"albumArtists\": false, \"meta\": true } ] } } } ]","s":"Using Partial Match","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#using-partial-match","p":264},{"i":300,"t":"If Musicbrainz is not returning matches Multi-scrobbler is using the wrong match or the resulting enhanced Scrobble is not what you expected Enable logging by turning on Debug Mode to help diagnose any issues with the Musicbrainz API and Scrobble enhancement. Before creating an issue please enable logging and include any logs with your issue as this is needed to debug. If you have multiple Modification Stages and need to see the diff for your Play between each Stage, enable \"log\": \"all\" in the individual Modification Stage. Example In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"log\": \"all\", \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", } ] } } } ]","s":"Logging","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#logging","p":264},{"i":303,"t":"Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ]","s":"Minimal","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#minimal","p":264},{"i":305,"t":"Using the config shown in Sensible Default with File/AIO config, instead of ENV Config. Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { \"releaseStatusPriority\": [\"official\"], \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], \"releaseCountryPriority\": [\"XW\"], \"searchArtistMethod\": \"native\" \"searchOrder\": [\"isrc\", \"basic\", \"artist\"] } } ] } In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ]","s":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default-1","p":264},{"i":307,"t":"If you do not want your scrobble data to be modified (artists/album/title) but still want to benefit from associating the scrobble with a Musicbrainz match (for Scrobble Clients like Tealfm, Rocksky, and Koito), then use Partial Match rules to specify only meta to be updated. Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { // maybe something like Sensible Default? } } ] } In a Jellyfin File Config: jellyfin.json [ { \"name\": \"MyJellyfin\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"title\": false, \"artists\": false, \"album\": false, \"albumArtists\": false, \"meta\": true // only update scrobble metadata with MBIDs } ] } } } ]","s":"Add Metadata Only (No Scrobble Modification)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#add-metadata-only-no-scrobble-modification","p":264},{"i":309,"t":"Musicbrainz Stage configured with Sensible Defaults Fallback search with Artist Extraction Default Native Stage Uses Flow Control to run Native only if there are no Musicbrainz matches Example Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { \"releaseStatusPriority\": [\"official\"], \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], \"releaseCountryPriority\": [\"XW\"], \"searchArtistMethod\": \"native\", \"searchOrder\": [\"isrc\",\"basic\", \"artist\"] } } ] } In a Jellyfin File Config: jellyfin.json [ { \"name\": \"MyJellyfin\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { // if musicbrainz is successful then do NOT run native, // only run native if musicbrainz fails to find a match (onFailure) \"type\": \"musicbrainz\", \"name\": \"MyMB\" \"onSuccess\": \"stop\", \"onFailure\": \"continue\" }, { \"type\": \"native\" } ] } } } ]","s":"Use Native Stage if no Musicbrainz Matches","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-native-stage-if-no-musicbrainz-matches","p":264},{"i":311,"t":"Last.fm has unreliable MBIDs and Spotify provides an ISRC and consistent formatting. For Spotify, we want to rely on ID searches and matches that are close to original scrobble text For Last.fm, we want to use only text searches and take whatever correction is given to us Use Per Component Overrides with the default (or sensible) Stage Configuration to specify different search behavior for each Source. Example Stage Configuration config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ], \"defaults\": {} // maybe use sensible? }, } ] } lastfm.json [ { \"name\": \"MyLFM\", \"configureAs\": \"source\" \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"searchArtistMethod\": \"native\" // does not use any ID searches // fallback to more aggressive/broad searches \"searchOrder\": [\"basic\", \"artist\", \"freetext\"] } ] } } } ] spotify.json [ { \"name\": \"MySpotify\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", // use ISRC as first search \"searchOrder\": [\"isrc\", \"basic\"] // bias matches towards similarity to original data \"albumWeight\": 0.33, \"titleWeight\": 0.33, \"artistWeight\": 0.33 } ] } } } ]","s":"Different Search Methods Based on Source (Last.fm and Spotify)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#override-stage-configuration-example","p":264},{"i":313,"t":"The User Stage uses search-and-replace expressions, provided by you, to modify/replace parts of Play data. This Stage is most useful for correcting individual instances of bad data, or patterns, in your known data. Example scenarios: Removing (Album Version) from all Titles Removing Various Artists from Artist data Correcting spelling mistakes for individual Artist names The user Stage type is user.","s":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","h":"","p":312},{"i":315,"t":"All Stage Configuration is done using search-and-replace expressions inside individual rules. Default configuration for all Rules can still be done using Stage defaults. Example config.json { // ... \"transformers\": [ { \"type\": \"user\", \"name\": \"Normalizer\", \"defaults\": { \"title\": [ \"(Album Version)\" ], \"artists\": [ \"Various Artists\" ] } } ] } Default Stage​ For your convenience, if you do not define any User Stage Configurations then multi-scrobbler automatically builds an empty one for you. This can be used by omitting the name in your modification Stage. Example In a Subsonic File Config: subsonic.json [ { \"name\": \"MySubsonic\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"user\", // do not include name, the default user stage will be used \"title\": [ // removes badterm from track title \"badterm\" ] } ] } } } ]","s":"Configuration","u":"/multi-scrobbler/configuration/transforms/user/","h":"#configuration","p":312},{"i":317,"t":"A Search-And-Replace Expression can be a plain string that matches a literal, then removes it: Expression: \"badTerm\" \"this is badTerm cool string\" => \"this is a cool string\" or a regular expression that matches and removes the match: Expression: \"/bad\\w+/i\" \"this is badSomething cool string\" => \"this is a cool string\" Or it may be an object that specifies what to match (using either plain string or regular expression) and what to replace it with: { \"search\": \"anotherBadTerm\", // match all instances of 'anotherBadTerm' \"replace\": \"goodTerm\" // replace with the string 'goodTerm' } \"this is anotherBadTerm cool string\" => \"this is goodTerm cool string\" { \"search\": \"/^\\(\\w+.com)/i\", // matches any string that starts with EX '(YourMusic.com)' \"replace\": \"[MySite.com]\" // replace with the string '[MySite.com]' } \"(Foo.com) this is a cool string\" => \"[MySite.com] this is a cool string\" The replace property uses javascript's replace() function and so can use any special string characters.","s":"Search-And-Replace Expression","u":"/multi-scrobbler/configuration/transforms/user/","h":"#search-and-replace-expression","p":312},{"i":319,"t":"Each Rule must be an array of search-and-replace expressions: lastfm.json [ { \"name\": \"myLastFm\", \"configureAs\": \"source\", \"data\": { // ... }, \"options\": { \"playTransform\": { \"type\": \"user\", \"preCompare\": [ { \"title\": [ // removes \"badTerm\" from title \"badTerm\", { // removes \"fooTerm\" from title and replaces it with \"barTerm\" \"search\": \"fooTerm\", \"replace\": \"barTerm\" } ] } ], } } } ] note If the value of the field (title, an artist, album) is an empty string after transforming then the field is removed.","s":"Rules","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rules","p":312},{"i":322,"t":"Using when for Conditional Modification Example // On search-replace in title... // IF artist matches \"Elephant Gym\" // THEN Run regex search-replace ELSE skip this rule // // Run live|remastered regex remove on title { \"title\": [ { \"search\": \"/\\\\s\\\\-\\\\s滾石40\\\\s滾石撞樂隊\\\\s40團拚經典(.+)$/i\", \"replace\": \"\", \"when\": [ { \"artist\": \"/Elephant Gym/\" } ] }, \"/(\\\\s\\\\-\\\\s|\\\\s)(feat\\\\.(.+)|live|remastered(.+))$/i\" ], }","s":"Usage with when condition","u":"/multi-scrobbler/configuration/transforms/user/","h":"#usage-with-when-condition","p":312},{"i":324,"t":"Removes the phrase (Album Version) from the Title of a Play Example { \"title\": [ \"(Album Version)\" ] }","s":"Remove phrase from Title in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-phrase-from-title-in-all-new-plays","p":312},{"i":326,"t":"Example { \"compare\": { \"candidate\": { \"title\": [ \"/(\\(.+\\))\\s*$/\" ] }, \"existing\": { \"title\": [ \"/(\\(.+\\))\\s*$/\" ] }, }, }","s":"Remove all parenthesized content from the end of a title","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-all-parenthesized-content-from-the-end-of-a-title","p":312},{"i":328,"t":"Example { \"artists\": [ { \"search\": \"Boz Skaggs\", \"replace\": \"Boz Scaggs\" } ] }","s":"Rename misspelled artist in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rename-misspelled-artist-in-all-new-plays","p":312},{"i":330,"t":"Example { \"album\": [ { \"search\": \"Various Artists\", \"replace\": \"\" } ] }","s":"Remove \"Various Artists\" albums in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#remove-various-artists-albums-in-all-new-plays","p":312},{"i":332,"t":"Details When the Artist string is actually a multi-artist, delimited string, this search-and-replace will replace the string with just the first artist found. Ex My Artist One / My Artist Two / Another Guy My Artist One Artists are delimited with a spaced forward slash (/) in the regex below. Replace the contents of the delim capture group with the delimiter for your use case. Some more common scenarios: (?<delim>\\\\/) No spaces between slash IE My Artist One/My Artist Two/Another Guy (?<delim>\\\\s*\\\\\\\\\\s*) Backslash instead of forward slash IE My Artist One \\ My Artist Two \\ Another Guy (?<delim>,) Comma IE My Artist One, My Artist Two, Another Guy Example { \"artists\": [ { \"search\": \"(.*?)(?<delim>\\\\s*\\\\/\\\\s*)(.*$)\", \"replace\": \"$1\" } ] }","s":"Extract primary Artist from delimited, multi-Artist string","u":"/multi-scrobbler/configuration/transforms/user/","h":"#extract-primary-artist-from-delimited-multi-artist-string","p":312},{"i":334,"t":"To do...","s":"Client Development/Tutorial","u":"/multi-scrobbler/development/dev-client/","h":"","p":333},{"i":337,"t":"Multi-scrobbler is written entirely in Typescript. It consists of a backend and frontend. The backend handles all Source/Client logic, mounts web server endpoints that listen for Auth callbacks and Source ingress using expressjs, and serves the frontend. The frontend is a standalone Vitejs app that communicates via API to the backend in order to render the dashboard.","s":"Architecture","u":"/multi-scrobbler/development/dev-common/","h":"#architecture","p":335},{"i":339,"t":"Development requires Node v18.19.1 or higher is installed on your system. tip When running locally (not with a devcontainer) you can use nvm to manage the installed node version. Clone this repository somewhere and then install from the working directory git clone https://github.com/FoxxMD/multi-scrobbler.git . cd multi-scrobbler nvm use # optional, sets correct node version when running without devcontainer npm install npm run start","s":"Project Setup","u":"/multi-scrobbler/development/dev-common/","h":"#project-setup","p":335},{"i":341,"t":"This repository contains workspace settings for development with VSCode. These include: Run/Debug Launch configurations for the application and tests Devcontainer for development with all dependencies already installed Useful extensions for linting and running tests To use the Devcontainer simple open the repository in VSCode and \"Use Devcontainer\" when the notification is presented. npm install will be run when a new container is created.","s":"VSCode","u":"/multi-scrobbler/development/dev-common/","h":"#vscode","p":335},{"i":343,"t":"info In this document, when referring to aspects of Sources and Clients that are shared between both, the Source/Client will be referred to as a Component. A Component is composed of two parts: Typescript interfaces describing structure of configuration for that Component A concrete class inheriting from a common \"startup\" abstract class that enforces how the Component is built and operates In both parts Source/Clients share some common properties/behavior before diverging in how they operate.","s":"Common Development","u":"/multi-scrobbler/development/dev-common/","h":"#common-development","p":335},{"i":345,"t":"The configuration for a Component should always have this minimum shape, enforced respectively by the interfaces CommonSourceConfig and CommonClientConfig: interface MyConfig { name: string data?: object options?: object } data contains data that is required for a Component to operate such as credentials, callback urls, api keys, endpoints, etc... options are optional settings that can be used to fine-tune the usage of the Component but are not required or do not majorly affect behavior. EX additional logging toggles","s":"Config","u":"/multi-scrobbler/development/dev-common/","h":"#config","p":335},{"i":347,"t":"Components inherit from an abstract base class, AbstractComponent, that defines different \"stages\" of how a Component is built and initialized when MS first starts as well as when restarting the Component in the event it stops due to an error/network failure/etc... Stages​ Stages below are invoked in the order listed. All stages are asynchronous to allow fetching network requests or reading files. The stage function (described in each stage below) should return a value or throw: return null if the stage is not required return true if the stage succeeded return a string if the stage succeeded and you wish to append a result to the log output for this stage throw an Exception if the stage failed for any reason and the Component should not continue to run/start up Stage: Build Data​ This stage should be used to validate user configuration, parse any additional data from async sources (file, network), and finalize the shape of any configuration/data needed for the Component to operate. info Implement doBuildInitData in your child class to invoke this stage. Examples Parse a full URL like http://SOME_IP:7000/subfolder/api from user config containing a base url like data.baseUrl: 'SOME_IP' and then store this in the class config Validate that config data contains required properties user password salt Read stored credentials from ${this.configDir}/currentCreds-MySource-${name}.json; Stage: Check Connection​ This stage is used to validate that MS can communicate with the service the Component is interacting with. This stage is invoked on MS startup as well as any time the Component tries to restart after a failure. If the Component depends on ingress (like Jellyfin/Plex webhook) this stage is not necessary. info Implement doCheckConnection in your child class to invoke this stage. Examples Make a request to the service's server to ensure it is accessible Open a websocket connection and check for a ping-pong Stage: Test Auth​ MS determines if Auth is required for a Component based on two class properties. You should set these properties during constructor initialization for your Component class: requiresAuth - (default false) Set to true if MS should check/test Auth for this Component requiresAuthInteraction - (default false) Set to true if user interaction is required to complete auth IE user needs to visit a callback URL If the Component requires authentication in order to communicate with a service then any required data should be built in this stage and a request made to the service to ensure the authentication data is valid. This stage should return: true if auth succeeded false if auth failed without unexpected errors IE the authentication data is not valid and requires user interaction to resolve the failure throw an exception if network failure or unexpected error occurred You should attempt to re-authenticate, if possible. Only throw an exception or return false if there is no way to recover from an authentication failure. info Implement doAuthentication in your child class to invoke this stage. Examples Generate a Bearer Token for Basic Auth from user/password given in config and store in class properties Make a request to a known endpoint with Authorization token from read credentials file to see if succeeds or returns 403 Catch a 403 and attempt to reauthenticate at an auth endpoint with user/password given in config","s":"Concrete Class","u":"/multi-scrobbler/development/dev-common/","h":"#concrete-class","p":335},{"i":349,"t":"The PlayObject is the standard data structure MS uses to store listen (track) information and data required for scrobbling. It consists of: Track Data -- a standard format for storing track, artists, album, track duration, the date the track was played at, etc... Listen Metadata -- Optional but useful data related to the specific play or specifics about the Source/Client context for this play such as Platform specific ID, web URL to track, device/user ID that played this track, etc... Both Sources and Clients use the PlayObject interface. When a Component receives track info from its corresponding service it must transform this data into a PlayObject before it can be interacted with. For more refer to the TS documentation for PlayObject or AmbPlayObject in your project","s":"Play Object","u":"/multi-scrobbler/development/dev-common/","h":"#play-object","p":335},{"i":351,"t":"Source Development and Tutorial Client Development and Tutorial","s":"Creating Clients and Sources","u":"/multi-scrobbler/development/dev-common/","h":"#creating-clients-and-sources","p":335},{"i":355,"t":"Install Flatpak Install flatpak-builder flatpak-node-generator​ Requires python 3.7+, pip/pipx","s":"Flatpak and flatpak-builder","u":"/multi-scrobbler/development/flatpak/","h":"#flatpak-and-flatpak-builder","p":352},{"i":357,"t":"Set the branch tag or commit to use for MS in the source section of io.github.foxxmd.multiscrobbler.yml","s":"Update Project source","u":"/multi-scrobbler/development/flatpak/","h":"#update-project-source","p":352},{"i":360,"t":"A convenience bash script is provided that automates generating offline sources and building the flatpak app for you. This is the recommend method to use. Located in the project at flatpak/setup.sh, run it from the flatpak directory with this syntax: ./setup.sh -o -b /path/to/flatpak/build/dir Args: -o => Delete and overwrite any existing generated sources -b => The absolute path to the directory that should be used for flatpak build/artifacts. If not defined will use `CWD/build` -y => Proceed without confirming settings","s":"Use Setup Script","u":"/multi-scrobbler/development/flatpak/","h":"#use-setup-script","p":352},{"i":362,"t":"If you cannot use setup.sh follow the below to manually generate sources and build the flatpak app: Instructions Use flatpak-node-generator to generate sources​ First, make sure node_modules is deleted or empty for both the project and docsite directories. Then, from MS project root: PROJECT_DIR flatpak-node-generator npm package-lock.json Move generated-sources.json into PROJECT_DIR/flatpak and rename generated-sources.0.json Then, generate docsite sources: PROJECT_DIR flatpak-node-generator npm docsite/package-lock.json Move generated-sources.json into PROJECT_DIR/flatpak and rename generated-sources.1.json Build flatpak​ In the below command replace /home/yourUser/multi-scrobbler-flatpak with a directory to use for storing flatpak build/artifacts. PROJECT_DIR/flatpak flatpak-builder --repo=/home/yourUser/multi-scrobbler-flatpak/repo --state-dir=/home/yourUser/multi-scrobbler-flatpak/state /home/yourUser/multi-scrobbler-flatpak/build io.github.foxxmd.multiscrobbler.yml --force-clean info Append --install --user to the above command to have the app installed immediately.","s":"Manual Setup","u":"/multi-scrobbler/development/flatpak/","h":"#manual-setup","p":352},{"i":364,"t":"If built with --install --user (default when using setup.sh) you can now run MS using the command flatpak run -u io.github.foxxmd.multiscrobbler","s":"Run App","u":"/multi-scrobbler/development/flatpak/","h":"","p":352},{"i":366,"t":"tip For the difference between ENV and File examples in this document see Configuration Types.","s":"Overview","u":"/multi-scrobbler/installation/","h":"","p":365},{"i":368,"t":"Cross-platform images are built for x86 (Intel/AMD) and ARM64 (IE Raspberry Pi) Available Images Dockerhub Github Packages Repository Page docker.io/foxxmd/multi-scrobbler:latest Repository Page ghcr.io/foxxmd/multi-scrobbler:latest Or use the example docker-compose.yml, found in the repo, after modifying it to fit your configuration: docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones #- JELLYFIN_APIKEY= #- JELLYFIN_URL= #- JELLYFIN_USER= #- MALOJA_URL=http://maloja:42010 #- MALOJA_API_KEY= #- PUID=1000 # required if running docker on linux host, see main README Docker setup instructions #- PGID=1000 # required if running docker on linux host, see main README Docker setup instructions # set if using a source/client with redirect URI that you have not explicitly set and MS is NOT running on the same machine that you will view the dashboard from # EX: You will view MS dashboard at 'http://192.168.0.101:9078' -> set BASE_URL=http://192.168.0.101:9078 #- BASE_URL=http://MyHostIP:9078 volumes: - \"./config:/config\" #networks: # - (optional to add container to the same bridge network that maloja is inside to be able to use docker internal networking & dns to resolve and connect to maloja URL via http://maloja:port) ports: - 9078:9078 # first port is the HOST port multi-scrobbler will serve UI and API on restart: unless-stopped Recommended configuration steps for docker or docker-compose usage: Storage​ You should bind a host directory into the container for storing configurations and credentials. Otherwise, these will be lost when the container is updated. Example Docker Docker Compose Using -v method for docker: docker run ... -v \"$(pwd)/config:/config\" foxxmd/multi-scrobbler Using docker-compose: docker-compose.yml services: multi-scrobbler: # ... volumes: - \"./config:/config\" Networking​ If you are using a bridge network (default docker setup) you must map a port to the container in order to access the dashboard and use MS with some sources (Webscrobbler, LFM/LZ Endpoints). The default container port is 9078. Example Docker Docker Compose Docker run publish options: docker run ... -p 9078:9078 foxxmd/multi-scrobbler docker-compose: docker-compose.yml services: multi-scrobbler: # ... ports: - \"9078:9078\" Base URL​ Optionally, when using a Source or Client that has a \"Redirect URI\" that you have not explicitly defined and using a bridge network or installing MS on a different machine than the one used to view the dashboard set the Base URL as the IP of the host machine. (This is the IP you would use to view the dashboard in a browser) Example Docker Docker Compose docker run ... -e BASE_URL=\"http://hostMachineIP\" foxxmd/multi-scrobbler docker-compose: docker-compose.yml services: multi-scrobbler: # ... environment: - BASE_URL=http://hostMachineIP Other​ (Optionally) set the timezone for the container using the environmental variable TZ (docker) (docker-compose) Linux Host​ info If you are running this container with Docker on a Linux Host you must specify user:group permissions of the user who owns the configuration directory on the host to avoid docker file permission problems. These can be specified using the environmental variables PUID and PGID. To get the UID and GID for the current user run these commands from a terminal: id -u -- prints UID id -g -- prints GID Read Only​ MS can be hardended by setting the file system as read only with read_only, with a few exceptions: docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler # ... read_only: true tmpfs: - /run:exec - /tmp:noexec","s":"Docker","u":"/multi-scrobbler/installation/","h":"#docker","p":365},{"i":370,"t":"tip See the Quick Start Guide for another guided docker-compose example The example scenario: Jellyfin Source Maloja Client Serving app on port 9078 Docker container located on a different IP (192.168.0.100) so use Base URL Config/data directory on host machine in a directory next to docker-compose.yml Linux uid/gid is 1000:1000 Docker Docker Compose ENV File docker run --name multi-scrobbler -e \"JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c\" -e \"JELLYFIN_URL=192.168.0.101:8096\" -e \"JELLYFIN_USER=MyUser\" -e \"BASE_URL=192.168.0.100\" -e \"MALOJA_URL=http://domain.tld\" -e \"MALOJA_API_KEY=1234\" -e \"PUID=1000\" -e \"PGID=1000\" -p 9078:9078 -v /home/myUser/ms:/config foxxmd/multi-scrobbler docker run --name multi-scrobbler -e \"PUID=1000\" -e \"PGID=1000\" -e \"BASE_URL=192.168.0.100\" -p 9078:9078 -v \"$(pwd)/config:/config\" foxxmd/multi-scrobbler See docker-compose.yml sample above for more options and annotations. docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c - JELLYFIN_URL=192.168.0.101:8096 - JELLYFIN_USER=MyUser - BASE_URL=http://192.168.0.100:9078 - MALOJA_URL=http://domain.tld:42010 - MALOJA_API_KEY=1234 - PUID=1000 - PGID=1000 volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped","s":"Docker Usage Example","u":"/multi-scrobbler/installation/","h":"#docker-usage-example","p":365},{"i":372,"t":"After installation see service.md to configure multi-scrobbler to run automatically in the background.","s":"Local Installation","u":"/multi-scrobbler/installation/","h":"#local-installation","p":365},{"i":374,"t":"Clone this repository somewhere and then install from the working directory git clone https://github.com/FoxxMD/multi-scrobbler.git . cd multi-scrobbler nvm use # optional, to set correct Node version npm install npm run docs:install && npm run build npm run start Rollup build error​ During building if you encounter an error like: Your current platform \"XXX\" and architecture \"XXX\" combination is not yet supported by the native Rollup build. Modify overrides in package.json to use @rollup/wasm-node as a drop-in replacement for rollup: \"overrides\": { \"spotify-web-api-node\": { \"superagent\": \"$superagent\" } \"vite\": { \"rollup\": \"npm:@rollup/wasm-node@^4.9.6\" } } See this issue for more detail. Usage Examples​ ENV File JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c JELLYFIN_URL=192.168.0.101:8096 JELLYFIN_USER=MyUser MALOJA_URL=\"http://domain.tld\" node src/index.js ./config/config.json ./config/config.json { \"sources\": [ { \"type\": \"jellyfin\", \"clients\": [\"myConfig\"], \"name\": \"myJellyfinSource\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"url\": \"http://192.168.0.101:8096\", \"user\": \"MyUser\" } } ], \"clients\": [ { \"type\": \"maloja\", \"name\": \"myConfig\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ], } npm run start tip The web UI and API is served on port 9078. This can be modified using the PORT environmental variable.","s":"Nodejs","u":"/multi-scrobbler/installation/","h":"#nodejs","p":365},{"i":376,"t":"Unsupported Flatpak/Flathub installs are no longer supported. You can still build MS as a Flatpak app from source. See more information about Flatpak EOL.","s":"Flatpak","u":"/multi-scrobbler/installation/","h":"#flatpak","p":365},{"i":378,"t":"This document will provide a step-by-step guide for creating a (trivial) new Source in MS alongside describing what aspects of the Source need to be implemented based on the service you use. Before using this document you should review Common Development.","s":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","h":"","p":377},{"i":380,"t":"You are the developer of a fancy, new self-hosted web-based media player called Cool Player. Cool Player has a slick interface and many bells and whistles, but most importantly it has an API. The API: Has an unauthenticated health endpoint at /api/health that returns 200 if the service is running properly Has authenticated endpoints that require a user-generated token in the header Authorization MY_TOKEN Has a /api/recent endpoint that lists recently played tracks with a timestamp Has a /api/now-playing endpoint that returns information about the state of the player like current track, player position in the track, etc... Cool Player is by default accessed on port 6969 Your personal instance of Cool Player is hosted at http://192.168.0.100:6969 and the api is accessed at http://192.168.0.100:6969/api Because there is an API that MS can actively read this will be a polling Source where MS sends requests to Cool Player to get scrobble information -- as opposed to an ingress Source like Jellyfin/Plex that uses webhooks from the service to send data to MS.","s":"Scenario","u":"/multi-scrobbler/development/dev-source/","h":"#scenario","p":377},{"i":383,"t":"We will create a new config interface for Cool Player using the Common Config and tell MS it is a valid config that can be used. Create a new file for your config: /src/backend/common/infrastructure/config/source/coolplayer.ts import { PollingOptions } from \"../common.js\"; import { CommonSourceConfig, CommonSourceData } from \"./index.js\"; // all of the required data for the Build Data and Test Auth stages (from Common Development docs) // should go here export interface CoolPlayerSourceData extends CommonSourceData, PollingOptions { // remember to annotation your properties! /** * The user-generated token for Cool Player auth created in Cool Player -> Settings -> User -> Tokens * * @example f243331e-cf5b-49d7-846b-0845bdc965b4 * */ token: string /** * The host and port where Cool Player is hosted * * @example http://192.168.0.100:6969 * */ baseUrl: string } export interface CoolPlayerSourceConfig extends CommonSourceConfig { data: CoolPlayerSourceData } export interface CoolPlayerSourceAIOConfig extends CoolPlayerSourceConfig { // when using the all-in-one 'config.json' this is how users will identify this source type: 'coolplayer' } Add the new interface to the list of valid interfaces for sources: src/backend/common/infrastructure/config/source/sources.ts import { ChromecastSourceAIOConfig, ChromecastSourceConfig } from \"./chromecast.js\"; // ... import { CoolPlayerSourceAIOConfig, CoolPlayerSourceConfig } from \"./coolplayer.js\"; export type SourceConfig = SpotifySourceConfig // ... | CoolPlayerSourceConfig; export type SourceAIOConfig = SpotifySourceAIOConfig // ... | CoolPlayerSourceAIOConfig; Finally, add the source type identifier to the list of valid identifiers src/backend/common/infrastructure/Atomic.ts export type SourceType = 'spotify' // ... | 'coolplayer'; export const sourceTypes: SourceType[] = [ 'spotify', // ... 'coolplayer' ]; Now we will create a new Source inheriting from AbstractComponent that: accepts our config interface implements a function to transform CoolPlayer's track data into a PlayObject implements required stages implements required methods to current player state and/or now playing track","s":"Define and Implement Config","u":"/multi-scrobbler/development/dev-source/","h":"#define-and-implement-config","p":377},{"i":385,"t":"First we create a new Source called CoolPlayerSource and setup our constructor to accept the config and specify Auth behavior. src/backend/sources/SpotifySource.ts import { CoolPlayerSourceConfig } from \"../common/infrastructure/config/source/coolplayer.js\"; import MemorySource from \"./MemorySource.js\"; import { InternalConfig, } from \"../common/infrastructure/Atomic.js\"; // MemorySource is the base class used for polling-type Sources export default class CoolPlayerSource extends MemorySource { // type hints for TS to know what the base class config looks like declare config: CoolPlayerSourceConfig; constructor(name: any, config: CoolPlayerSourceConfig, internal: InternalConfig, emitter: EventEmitter) { super('coolplayer', name, config, internal, emitter); // Cool Player required authentication this.requiresAuth = true; // but does not require user interaction for auth to work this.requiresAuthInteraction = false; // tells MS this is a Source that can be activity monitored through API this.canPoll = true; } }","s":"Create CoolPlayer Source","u":"/multi-scrobbler/development/dev-source/","h":"#create-coolplayer-source","p":377},{"i":387,"t":"When MS starts it reads all configs and determines which Source to build based on the configs found. We need to tell it to build a CoolPlayerSource when a coolplayer config type is found. We modify ScrobbleSources.ts to add CoolPlayerSource as an option: src/backend/sources/ScrobbleSources.ts // ... import { CoolPlayerSource, CoolPlayerData } from \"./CoolPlayerSource.js\"; export default class ScrobbleSources { // ... buildSourcesFromConfig = async (additionalConfigs: ParsedConfig[] = []) => { // ... // if CoolPlayerSource should be able to be built from ENVs only // then add it as a case statement here for (const sourceType of sourceTypes) { switch (sourceType) { // ... case 'musikcube': // ... break; case 'coolplayer': const cp = { baseUrl: process.env.COOL_URL, token: process.env.COOL_TOKEN } if (!Object.values(cp).every(x => x === undefined)) { configs.push({ type: 'coolplayer', name: 'unnamed', source: 'ENV', mode: 'single', configureAs: defaultConfigureAs, data: cp as CoolPlayerData }); } break; default: break; } } } // ... // (required) create new CoolPlayerSource if source config type is 'coolplayer' addSource = async (clientConfig: ParsedConfig, defaults: SourceDefaults = {}) => { // ... let newSource: AbstractSource; switch (type) { // ... case 'musikcube': // ... break; case 'coolplayer': newSource = await new CoolPlayerSource(name, compositeConfig as CoolPlayerSourceConfig, internal, this.emitter); break; default: break; } } }","s":"Initialize Source from Config","u":"/multi-scrobbler/development/dev-source/","h":"#initialize-source-from-config","p":377},{"i":389,"t":"Now we will create a static function that is used to take the track data returned from Cool Player's API and return a standard PlayObject. src/backend/sources/CoolPlayerSource.ts import dayjs from \"dayjs\"; import { FormatPlayObjectOptions, } from \"../common/infrastructure/Atomic.js\"; import { PlayObject } from \"../../core/Atomic.js\"; export default class CoolPlayerSource extends MemorySource { // ... // 'obj' should ideally be a real TS interface // if CoolPlayer has a ts/js client we would use that otherwise // we should build our own interfaces to represent track data from Cool Player's API static formatPlayObj(obj: any, options: FormatPlayObjectOptions = {}): PlayObject { const { trackName, artistName, albumName, duration, playedAt, } = obj; return { data: { artists: [artistName], album: albumName, track: trackName, // assuming seconds duration, // assuming playedAt is an ISO8601 timestamp playDate: dayjs(playedAt) }, meta: { source: 'CoolPlayer' } } } }","s":"Implement Play Object Transform","u":"/multi-scrobbler/development/dev-source/","h":"#implement-play-object-transform","p":377},{"i":391,"t":"Next we will implement the Stages required to get CoolPlayerSource running. Build Data​ First we implement the Build Data Stage. We will check that the token and baseUrl properties have been provided by the user. Additionally, we will parse the baseUrl and add default ports/prefix. src/backend/sources/CoolPlayerSource.ts import { URL } from \"url\"; // ... export default class CoolPlayerSource extends MemorySource { baseUrl!: URL; // ... static parseConnectionUrl(val: string) { const normal = normalizeUrl(val, {removeTrailingSlash: false, normalizeProtocol: true}) const url = new URL(normal); if (url.port === null || url.port === '') { url.port = '6969'; } if (url.pathname === '/') { url.pathname = '/api/'; } return url; } protected async doBuildInitData(): Promise<true | string | undefined> { const { token, baseUrl } = this.config; if (token === null || token === undefined || (typeof token === 'string' && token.trim() === '')) { throw new Error(`'token' must be defined`); } if (baseUrl === null || baseUrl === undefined || (typeof baseUrl === 'string' && baseUrl.trim() === '')) { throw new Error(`'baseUrl' must be defined`); } try { this.baseUrl = CoolPlayerSource.parseConnectionUrl(baseUrl); } catch (e) { throw new Error(`Could not parse baseUrl: ${baseUrl}`, {cause: e}); } this.logger.verbose(`Config URL: ${baseUrl} => Normalized: '${this.url.toString()}'`); return true; } } Check Connection​ Second we will implement the Check Connection Stage: src/backend/sources/CoolPlayerSource.ts import request from 'superagent'; import { UpstreamError } from \"../common/errors/UpstreamError.js\"; // ... export default class CoolPlayerSource extends MemorySource { // ... protected async doCheckConnection(): Promise<true | string | undefined> { try { const resp = await request.get(`${this.baseUrl}/health`); return true; // if /health returned version info we could instead read response and return a string with version info for visibility to the user // return `Cool Player Version: ${resp.body.version}`; } catch (e) { throw e; } } } Test Auth​ Finally, we will implement Auth Test Stage: src/backend/sources/CoolPlayerSource.ts import request from 'superagent'; import { UpstreamError } from \"../common/errors/UpstreamError.js\"; // ... export default class CoolPlayerSource extends MemorySource { // ... doAuthentication = async () => { try { const resp = await request .get(`${this.baseUrl}/recent`) .set('Authorization', `Token ${this.config.token}`); return true; } catch (e) { // if Cool Player returned an error as json we could parse it from error body and throw new Error with the message throw e; } } }","s":"Implement Stages","u":"/multi-scrobbler/development/dev-source/","h":"#implement-stages","p":377},{"i":393,"t":"The majority of Sources MS monitors primarily operate as a source of truth for a music player rather than a played music history. Only Listenbrainz and Last.fm operate as a source of music history. To this end, MS implements a state machine that emulates the behavior of a music player in order to keep track of when a song you are listening to should be scrobbled. It does this by monitoring the \"currently playing\" track reported by a Source's service, with varying degrees of accuracy depending on what information is returned from the service. The state machine is implemented in MemorySource which our CoolPlayerSource inherits from. For a polling Source to work properly we need to implement a function, getRecentlyPlayed, that returns PlayObjects that are \"newly\" played. These are then checked against previously \"discovered\" plays and their timestamp to determine if they should be surfaced to Clients to scrobble. To take advantage of the MemorySource state machine we will additionally use processRecentPlays from MemorySource inside getRecentlyPlayed. We pass track and/or player state returned from the Source service to processRecentPlayers. It then takes care of deriving Source player state based on how this data changes over time. The advantage to using processRecentPlays is that our Source service does not necessarily need to pass any player information -- as long as the track info has a duration we can more-or-less determine if it has been played long enough to scrobble. src/backend/sources/CoolPlayerSource.ts import request from 'superagent'; import { SourceData, PlayerStateData, SINGLE_USER_PLATFORM_ID } from \"../common/infrastructure/Atomic.js\"; // ... export default class CoolPlayerSource extends MemorySource { // ... protected async getRecentlyPlayed(options: RecentlyPlayedOptions = {}): Promise<PlayObject[]> { const plays: SourceData[] = []; try { // currently playing tracks/player state data const resp = await request .get(`${this.baseUrl}/now-playing`) .set('Authorization', `Token ${this.config.token}`); const { body: { playerState, // 'playing' or 'stopped' or 'paused'... position, // number of seconds into the track IE at position 48 -> ( 0:48/3:56 in player UI ) play: { /* track data */} } } = resp; // transform into standard player state data const playerData: PlayerStateData = { platformId: SINGLE_USER_PLATFORM_ID, play: CoolPlayerSource.formatPlayObj(play), position }; // if Cool Player does return player state we can also push a regular PlayObject to this list plays.push(playerData); } catch (e) { throw e; } // process player state through state machine // if the track changes or player state changes // and currently played track has been listened to long enough to be scrobbled it will return in newPlays const newPlays = this.processRecentPlays(plays); // finally, we return new plays and MS checks to see if they have been previously seen // before signalling to Clients that they can be scrobbled return newPlays; } } Congratulations! Your CoolPlayerSource has been minimally implemented and can now be used in multi-scrobbler.","s":"Implement Polling","u":"/multi-scrobbler/development/dev-source/","h":"#implement-polling","p":377},{"i":396,"t":"To have your Source try to scrobble \"missed\" tracks when MS starts up the Source's service must be able to provide: track information timestamp of when the track was played In your Source implement getBackloggedPlays and set setting in constructor indicating it has backlogging capabilities: src/backend/sources/CoolPlayerSource.ts import request from 'superagent'; import { PlayObject, } from \"../common/infrastructure/Atomic.js\"; // ... export default class CoolPlayerSource extends MemorySource { constructor(/* ... */) { super(/* ... */); // ... // tell MS it should try to get backlogged tracks on startup this.canBacklog = true; } // ... protected getBackloggedPlays = async (options: RecentlyPlayedOptions): Promise<PlayObject[]> => { try { const resp = await request .get(`${this.baseUrl}/recent`) .set('Authorization', `Token ${this.config.token}`); // assuming list from body looks like track info returned in // \"Implement Play Object Transform\" section const { body = [] } = resp; return body.map(x => CoolPlayerSource.formatPlayObj(x)); } catch (e) { throw new Error('Error occurred while getting recently played', {cause: e}); } } }","s":"Backlog","u":"/multi-scrobbler/development/dev-source/","h":"#backlog","p":377},{"i":398,"t":"There are some scenarios where polling and/or state machine is not the right tool to handle determining if incoming data should be scrobbled: The Source service handles scrobble threshold internally, the data being received should always be scrobbled (WebScrobbler, Plex, Tautulli, Listenbrainz, Last.fm) You prefer to handle the scrobble determination yourself Music History Source​ If the Source is still polling but the track returned should always be scrobbled if not already seen IE the Source service is a music history source (Listenbrainz, Last.fm), rather than a music player, then simply indicate to MS the source of truth type by setting it in the constructor. The state machine will always return a track if it is new and not seen, regardless of how recently it was seen: src/backend/sources/CoolPlayerSource.ts import { SOURCE_SOT } from \"../../core/Atomic.js\"; // ... export default class CoolPlayerSource extends MemorySource { constructor(/* ... */) { super(/* ... */); // ... // tell MS it should immediately scrobble any new, unseen tracks from the upstream service this.playerSourceOfTruth = SOURCE_SOT.HISTORY; } } Non-Polling Source​ Ingress Sources (like Plex, Tautulli, Webscrobbler, Jellyfin) do not having a polling mechanism because the upstream service contacts MS when there is an event, rather than MS contacting the upstream service. For these Sources you will need to implement endpoints in src/service/api.ts and corresponding files. See the existing Sources in the project as references for how to do this. You may still wish to use the state machine MemorySource (like Jellyfin) if the events received are not \"scrobble\" events but instead of implementing getRecentlyPlayed you will implement your own function in your Source class, like handle(), that receives data and then uses processRecentPlays. After new plays have been determined see the next section for how to scrobble... Basic Source​ At the core of a Source that implements AbstractSource's functionality is the ability to Discover and Scrobble plays. These functions are not seen in the MVP CoolPlayerSource because they are automatically done by the polling functionality after being returned from getRecentlyPlayed. Discovery​ A Source keeps track of all the \"plays\" that are determined to be valid for scrobbling. When a play is valid it is checked to see if it has already been \"discovered\" by comparing the track info and timestamp of the play against already discovered plays. This prevents duplicate scrobbling by using the Source's own data and simplifies scrobbling for Sources by allowing your implementation to \"always\" ingest track data without having to worry about whether its new or not -- AbstractSource and discover() will take care of that for you. src/backend/sources/MyBasicSource.ts export default class MyBasicSource extends AbstractSource { handle(somePlay: PlayObject) { // if the track is \"new\" and not seen before it is returned in the discovered list // we then know it is OK to be sent to Clients for scrobbling const discovered: PlayObject[] = this.discover([somePlay]); } } This additionally will be surfaced to the user in the Dashboard in the \"Tracks Discovered\" page. Scrobbling​ After a play is verified to be discovered we can then scrobble it. This will emit the plays to the ScrobbleClients service which then disseminates the play to all Clients that were configured to listen in the Source's config. src/backend/sources/MyBasicSource.ts export default class MyBasicSourceSource extends AbstractSource { handle(somePlay: PlayObject) { const discovered: PlayObject[] = this.discover([somePlay]); // emit plays that can be scrobbled by clients this.scrobble(discovered); } } If your service only emits an event when a play is scrobbled you can technically skip using discover() but it is good practice to use it unless you have a very good reason not to. note Using scrobble() does not guarantee a track is actually scrobbled! The Scrobble Clients also check the play against their own \"recently scrobbled\" list to prevent duplicates.","s":"Other Source Types","u":"/multi-scrobbler/development/dev-source/","h":"#other-source-types","p":377},{"i":402,"t":"These sources are ingress-based which means that multi-scrobbler waits for the Webscrobbler extension or app using Listenbrainz Endpoint to contact multi-scrobbler, as opposed to multi-scrobbler contacting them. multi-scrobbler will log information about any server that connects to it for these services. In the logs it looks something like this: [2025-07-10 12:32:21.417 -0400] INFO : [App] [API] [Ingress] [WebScrobbler] [Ingress] [WebScrobbler] Received request from a new remote address: ::ffff:127.0.0.1 (192.168.0.100) (UA: Mozilla/5.0 (X11; Linux x86_64; rv:139.0) Gecko/20100101 Firefox/139.0) [2025-07-10 12:32:21.418 -0400] INFO : [App] [API] [Ingress] [WebScrobbler] [Ingress] [WebScrobbler] ::ffff:127.0.0.1 (192.168.0.100) (UA: Mozilla/5.0 (X11; Linux x86_64; rv:139.0) Gecko/20100101 Firefox/139.0) Received data for API URL slug '(none)' for the first time. It also logs if a server tries to connect to a URL that it does not recognize: 2023-02-22T11:16:12-05:00 debug : [App ] Server received POST request from ::ffff:192.168.0.100 (UA: PlexMediaServer/1.24.5.5173-8dcc73a59) to unknown route: /plkex So, if you do not see either of these in your logs then the Source is not able to connect to your multi-scrobbler instance at all. This is not something multi-scrobbler can fix and means you have an issue in your network. Troubleshooting​ Check or try all these steps before submitting an issue: Turn on Debug Logging​ First, turn on debug logging for multi-scrobbler by setting the environmental variable DEBUG_MODE=true. Then, check the output for any additional information. Check Host name and URL​ The URLs examples in the configuration documentation assume you are running Webscrobbler/LFM Endpoint on the same server as multi-scrobbler. If these are not the same machine then you need to determine the IP address or domain name that multi-scrobbler is reachable at and use that instead of localhost when configuring these sources. This is likely the same host name that you would use to access the web interface for multi-scrobbler. EX http://localhost:9078/api/webscrobbler -> http://192.168.0.140:9078/api/webscrobbler Check Firewall and Port Forwarding​ If the machine multi-scrobbler is running on has a firewall ensure that port 9078 is open. Or if it is in another network entirely make sure your router is forwarding this port and it is open to the correct machine. Check Source Service Logs​ Webscrobbler​ See Debugging the extension to get logs which should have information about failed requests.","s":"Webscrobbler/Listenbrainz Endpoint doesn't connect","u":"/multi-scrobbler/FAQ/","h":"#ingress-connection","p":399},{"i":404,"t":"Ensure any client id or secrets are correct in your configuration. The callback/redirect URL for these services must be: the same address you would use to access the multi-scrobbler web interface the web-interface must be accessible from the browser you are completing authentication from. If multi-scrobbler is not running on the same machine your browser is on then the default/example addresses (http://localhost...) will not work. You must determine the address you can reach the web interface at (such as http://192.168.0.140:9078) then use that in place of localhost in the callback URLs. EX http://localhost:9078/lastfm/callback -> http://192.168.0.220:9078/lastfm/callback","s":"Spotify/Deezer/LastFM won't authenticate","u":"/multi-scrobbler/FAQ/","h":"#spotifydeezerlastfm-wont-authenticate","p":399},{"i":406,"t":"If you see errors in multi-scrobbler for YTM that contain 401 or 403 like Error: Could not send the specified request to browse. Status code: 401 then YTM has invalidated your authentication. First, ensure you are NOT using YoutubeTV authentication. If you completed authentication by entering a \"User Code\" you are using YoutubeTV which has stopped working. You should reauthenticate using Cookies or Custom OAuth. When using OAuth Client Authentication​ Refresh your authentication by using the (Re)authenticate link from MS's web dashboard. When using Cookies Authentication​ The library MS uses relies on scraping the YTM site by using cookies from your actual browser to pretend it is a browser. It does its best to keep these up to date but since this is not an official way to access the service YTM may invalidate your access to the authenticated session at any time. How this is triggered is unknown and not something multi-scrobbler can control. You can help limit the chance of your session being invalidated by getting the cookie from an Incognito/Private Session and then immediately closing the browser afterwards. To re-authenticate MS follow the YTM instructions to retrieve a new set of cookies for multi-scrobbler and then restart MS to potentially resolve the problem.","s":"Youtube Music fails after some time","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-fails-after-some-time","p":399},{"i":409,"t":"If you see something like this in your logs: 2023-02-19T10:05:42-06:00 warn : [App] App config file exists but could not be parsed! 2023-02-19T10:05:42-06:00 error : [App] Exited with uncaught error 2023-02-19T10:05:42-06:00 error : [App] Error: config.json could not be parsed It means the JSON in your configuration file is not valid. Copy and paste your configuration into a site like JSONLint to find out where errors you have and fix them.","s":"Config could not be parsed","u":"/multi-scrobbler/FAQ/","h":"#config-could-not-be-parsed","p":399},{"i":412,"t":"This is a limitation of the Last.fm API where the artist field is only one string and Last.fm does not recognize (play well) with \"combined\" artists. Multi-scrobbler works the same was the official Spotify-Last.fm integration works -- it only scrobbles the first artist on a multi-artist track.","s":"Last.fm does not scrobble tracks with multiple artists correctly","u":"/multi-scrobbler/FAQ/","h":"#lastfm-does-not-scrobble-tracks-with-multiple-artists-correctly","p":399},{"i":414,"t":"The Google Cast integration relies on a few common fields in the data it receives from your casting device. Every platform that can cast (Spotify, Pandora, etc...) should use these fields the same but there are slight differences between their implementations that may confuse multi-scrobbler. Specific platforms may also return more information in non-common fields that are undocumented. To diagnose these issues you must enable payload logging for your google cast Source, run MS, and then include logs with this output from that run. Without the raw data logged from your cast device it will be nearly impossible to resolve your issue.","s":"Google Cast track information is missing/incorrect or MS player has weird times","u":"/multi-scrobbler/FAQ/","h":"#google-cast-track-information-is-missingincorrect-or-ms-player-has-weird-times","p":399},{"i":416,"t":"It is likely the app playing on the cast device is incorrectly reporting the media type as not music. MS logs will tell you what type the media is reported as with lines like: My Artist - Example Track has 'unknown' media type and allowUnknownMedia=false, will not track Refer to Allow Unknown Media Type section to fix this My Artist - Example Track has 'movie' media type so will not track Refer to Force Media Tracking section to fix this","s":"Google Cast device does not track media","u":"/multi-scrobbler/FAQ/","h":"#google-cast-device-does-not-track-media","p":399},{"i":418,"t":"Before reporting an issue turn on metadata logging in the MS VLC configuration, see the VLC documentation.","s":"VLC is not scrobbling fields correctly","u":"/multi-scrobbler/FAQ/","h":"#vlc-is-not-scrobbling-fields-correctly","p":399},{"i":420,"t":"How MS detects YTM history In order for multi-scrobbler to accurately determine if a song has been scrobbled it needs a source of truth. For YTM this is a \"history\" list scraped from the YTM website. Unfortunately, the data in this list can be (often) inconsistent which makes it hard for multi-scrobbler to \"trust\" that it is correct and determine when/if new scrobbles occur. This inconsistency is not something multi-scrobbler can control -- it is a side-effect of having to use an unofficial method to access YTM (scraping). To compensate for this multi-scrobbler resets when it considers this list the \"source of truth\" based on if the list changes in an inconsistent way between consecutive checks. New scrobbles can only be detected when this list is \"OK\" as a source of truth for N+1 checks. Therefore, any new tracks that appear when the list is inconsistent will be ignored. Duplicate scrobbles can also occur if the change between two checks is technically consistent. For instance, if you listen to a track twice in some period, separated by other music, YTM will sometimes \"remove\" the track from the earlier time (further down in your history) and \"re-add\" it at the top of the history. Reporting YTM scrobble issues​ If you experience scrobble detection issues you can help improve MS's YTM heureistic by providing thorough feedback as an issue. Please do the following to provide the most useful report: Turn on Change Detection​ In your YTM configuration (ytmusic.json) add logDiff under options like this: { \"type\": \"ytmusic\", \"name\": \"MyYTM\", \"data\": { ... }, \"options\": { \"logDiff\": true } } or set either ENVs: YTM_LOG_DIFF=true DEBUG_MODE=true This will cause MS to log YTM history changes similar to this: [Ytmusic - MyYTM] Changes from last seen list: 1. (tuhe1CpHRxY) KNOWER - I’m The President --- undefined => Moved - Originally at 6 2. (Mtg8V6Xa2nc) Vulfpeck - Romanian Drinking Song --- Schvitz => Moved - Originally at 1 3. (rxbCaiyYSXM) Nightmares On Wax - You Wish --- In A Space Outta Sound => Moved - Originally at 2 4. (tMt_YXr90AM) Gorillaz - O Green World --- undefined => Moved - Originally at 3 ... Which are essential to troubleshooting this behavior. Turn on File Logging​ Optionally, if your logs are busy due to many other sources, you can log only YTM logs to a file. Turn this on with the logToFile config option: { \"type\": \"ytmusic\", \"name\": \"MyYTM\", \"data\": { ... }, \"options\": { \"logDiff\": true, \"logToFile\": true } } This will cause MS to write YTM logs to a file in your logs folder named ytmusic-MyYTM.log (based on your source name). Provide Detail and Context​ Provide a detailed account of how you were using YTM when the issue occurred, including things like: the platform listening on (desktop, mobile, 3rd party client, etc...) any changes in platform I switched from desktop to listening on my phone... how you were listening to music I was playing an album start to finish I listened to two songs in a row, then browsed for a new song in library by artist, then went back to a song in the queue... Explain the expected behavior (it should have scrobbled songs x, y, then z) and what actually happened (it scrobbled songs x, then y, then x again, then z) Provide ALL logs from the time when the issue occurred including logs from BEFORE (ideally 2-3 minutes of logs) and AFTER the issue.","s":"Youtube Music misses or duplicates scrobbles","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-misses-or-duplicates-scrobbles","p":399},{"i":422,"t":"Systemd is system and service manager that is used by most popular linux distros including Ubuntu, Fedora, Pop!_OS, Debian, and Arch. This setup will create a user service that runs on login.","s":"Systemd","u":"/multi-scrobbler/installation/service/","h":"","p":421},{"i":424,"t":"Create a new service file for multi-scrobbler under your HOME config: mkdir -p ~/.config/systemd/user touch ~/.config/systemd/user/multi-scrobbler.service In a text editor add contents below to the file you created, multi-scrobbler.service: [Unit] Description=multi-scrobbler After=network.target [Service] Type=simple WorkingDirectory=/path/to/multi-scrobbler/directory ExecStart=npm run start Restart=no [Install] WantedBy=default.target","s":"Create A Unit File","u":"/multi-scrobbler/installation/service/","h":"#create-a-unit-file","p":421},{"i":426,"t":"Save the file then run: systemctl daemon-reload systemctl --user enable multi-scrobbler.service systemctl --user start multi-scrobbler.service This will scan for new services and pickup our multi-scrobbler user service enable the service to run at login automatically start the service now","s":"Start the Service","u":"/multi-scrobbler/installation/service/","h":"#start-the-service","p":421},{"i":428,"t":"Open a PR if you would like to document setting up multi-scrobbler for other service managers!","s":"Other Service Methods","u":"/multi-scrobbler/installation/service/","h":"","p":421},{"i":430,"t":"This guide will get you up and running with multi-scrobbler using Docker and docker compose. At the end of the guide you will have: the dashboard served on port 9078 of a host machine which has an IP of 192.168.0.100 data saved to the same directory as the docker-compose.yml file multi-scrobbler monitoring Spotify, Jellyfin, Navidrome, Plex, and/or Last.fm for listening activity multi-scrobbler scrobbling to Lastfm, Maloja, and/or Koito note If the multi-scrobbler container is on the same machine you will be viewing the dashboard from (IE localhost) you can remove and ignore BASE_URL usage below. Additionally, replace usage of 192.168.0.100 with localhost.","s":"Quickstart","u":"/multi-scrobbler/quickstart/","h":"","p":429},{"i":432,"t":"Create a new folder for multi-scrobbler related data and then create docker-compose.yml with this content: ~/msData/docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - BASE_URL=http://192.168.0.100:9078 # all Environmental Variables in below examples go here! volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped","s":"Create Docker Compose File","u":"/multi-scrobbler/quickstart/","h":"#create-docker-compose-file","p":429},{"i":434,"t":"Sources are the services/music players multi-scrobbler monitors to look for listening activity. Jellyfin Spotify Navidrome Plex Last.fm Follow the Jellyfin configuration instructions for setting up an API Key. Then, add these values to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - JELLYFIN_URL=192.168.0.110:8096 # URL to Jellyfin UI - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b # Api Key created in previous step - JELLYFIN_USER=MyUser # Your username in Jellyfin To access your Spotify activity you must create a Spotify App to get a Client ID/Secret and set a valid Redirect URI. Refer to the Spotify Authentication instructions in the docs. Assuming you used the HTTPS method for your Redirect URI from the instructions above...after the application is created add these values to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - SPOTIFY_CLIENT_ID=yourClientId - SPOTIFY_CLIENT_SECRET=yourClientSecret - SPOTIFY_REDIRECT_URI=https://multi-scrobbler.mydomain.com/callback Later, after starting multi-scrobbler, visit the dashboard at http://192.168.0.100:9078 and click (Re)authenticate on the Spotify card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete. Navidrome supports scrobbling using Listenbrainz. You should use this, rather than a Subsonic Source because Navidrome's internal scrobbling functionality supports providing multiple artists and offline scrobbling while the Subsonic Source does not. To setup Navidrome to scrobble to multi-scrobbler via the Listenbrainz option: Create Listenbrainz Endpoint Source​ Create a new Listenbrainz Endpoint Source in multi-scrobbler by creating a token to use with the endpoint via ENV Config in environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - LZE_TOKEN=myCoolToken The token can be anything. (Re)start multi-scrobbler after making this change. Configure Navidrome​ Set the ListenBrainz.BaseURL (env ND_LISTENBRAINZ_BASEURL) to http://myMultiScrobblerIP:9078/1/ in your Navidrome installation. Assuming you are using the docker installation, modify environment to add: docker-compose.yml - ND_LISTENBRAINZ_BASEURL=http://192.168.0.100:9078/1/ Restart Navidrome after making this change. Then, follow the directions for enabling Listenbrainz scrobbling in Navidrome. The Listenbrainz user token is the token you created for LZE_TOKEN earlier. Find your Plex Token and make note of the URL and Port used to connect to your Plex instance. Add these values to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - PLEX_URL=http://192.168.0.101:32400 - PLEX_TOKEN=6c0ihz8j7__f5r18oa0zm8 # optional, restrict scrobbling to a list of comma-delimited users #- PLEX_USERS_ALLOW=myPlexUsername Restart multi-scrobbler to create the new Source. You may wish to refer to the User and Library defaults/filtering in the Plex Source docs for a more granular setup. If you are already scrobbling to Last.fm and wish to mirror your scrobbling activity to one or more other Clients, use this Source. If, instead, you want to scrobble from multi-scrobbler to Last.fm then see the Last.fm tab in the Setup Clients section below. Register for an API account at Last.fm. Use the following for Callback URL: http://192.168.0.100:9078/lastfm/callback After account creation make note of the Api Key and Secret that are displayed. Create a new File named lastfm.json in the ./config directory that will be used with your docker-compose.yml stack and copy the below contents, replacing placeholders with the data you got from Last.fm API account creation: ~/msData/config/lastfm.json [ { \"name\": \"myLastFmSource\", \"configureAs\": \"source\", \"data\": { \"apiKey\": \"MY_API_KEY_PLACEDHOLDER\", \"secret\": \"MY_SECRET_PLACEHOLDER\", \"redirectUri\": \"http://192.168.0.100:9078/lastfm/callback\" } } ] Later, after starting multi-scrobbler, visit the dashboard at http://192.168.0.100:9078 and click (Re)authenticate on the Last.fm (Source) card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete.","s":"Setup Sources","u":"/multi-scrobbler/quickstart/","h":"#setup-sources","p":429},{"i":436,"t":"Multi-scrobbler can use Musicbrainz to match activity from your Sources in order to fill in missing data, or correct/normalize existing data, before it is scrobbled to the Clients below. This step is optional. Musicbrainz Setup Instructions Configure Musicbrainz API note This step only needs to be performed once regardless of how many Sources you want to use Musicbrainz for. You must provide a way for Musicbrainz to contact you. Add these value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml # an email or personal website musicbrainz can use to contact you - MB_CONTACT=myCoolName@emailProvider.com # how musicbrainz searches and selects matches - MB_PRESETS=sensible,native Presets are found here. Enable Musicbrainz For A Source Musicbrainz can be enabled for multiple Sources. Follow the directions in each tab to enable it for that Source. Jellyfin Spotify Navidrome Plex Last.fm Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - JELLYFIN_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - SPOTIFY_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - LZE_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - PLEX_TRANSFORMS=musicbrainz Modify the lastfm.json file you created in the Setup Sources step to add the highlighted section in the example below. The comma at the top highlighted section is important! ~/msData/config/lastfm.json [ { \"name\": \"myLastFmSource\", \"configureAs\": \"source\", \"data\": { \"apiKey\": \"MY_API_KEY_PLACEDHOLDER\", \"secret\": \"MY_SECRET_PLACEHOLDER\", \"redirectUri\": \"http://192.168.0.100:9078/lastfm/callback\" }, \"options\": { \"playTransform\": { \"preCompare\": { \"type\": \"musicbrainz\" } } } } ]","s":"(Optional) Correct Scrobbles with Musicbrainz","u":"/multi-scrobbler/quickstart/","h":"#optional-correct-scrobbles-with-musicbrainz","p":429},{"i":438,"t":"note This step only needs to be performed once regardless of how many Sources you want to use Musicbrainz for. You must provide a way for Musicbrainz to contact you. Add these value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml # an email or personal website musicbrainz can use to contact you - MB_CONTACT=myCoolName@emailProvider.com # how musicbrainz searches and selects matches - MB_PRESETS=sensible,native Presets are found here.","s":"Configure Musicbrainz API","u":"/multi-scrobbler/quickstart/","h":"","p":429},{"i":440,"t":"Musicbrainz can be enabled for multiple Sources. Follow the directions in each tab to enable it for that Source. Jellyfin Spotify Navidrome Plex Last.fm Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - JELLYFIN_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - SPOTIFY_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - LZE_TRANSFORMS=musicbrainz Add this value to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - PLEX_TRANSFORMS=musicbrainz Modify the lastfm.json file you created in the Setup Sources step to add the highlighted section in the example below. The comma at the top highlighted section is important! ~/msData/config/lastfm.json [ { \"name\": \"myLastFmSource\", \"configureAs\": \"source\", \"data\": { \"apiKey\": \"MY_API_KEY_PLACEDHOLDER\", \"secret\": \"MY_SECRET_PLACEHOLDER\", \"redirectUri\": \"http://192.168.0.100:9078/lastfm/callback\" }, \"options\": { \"playTransform\": { \"preCompare\": { \"type\": \"musicbrainz\" } } } } ]","s":"Enable Musicbrainz For A Source","u":"/multi-scrobbler/quickstart/","h":"","p":429},{"i":442,"t":"Clients are services that store scrobbles. Multi-scrobbler will scrobble all listening activity from the Sources you configured to all Clients you configure here. Maloja Last.fm Koito Setup a Maloja server if you have not already done this. Maloja Setup Intructions Using Maloja's example docker-compose.yml: ~/malojaData/docker-compose.yml loading... View on GitHub Uncomment environment and add MALOJA_FORCE_PASSWORD=CHANGE_ME to set an admin password Start the container: ~/malojaData docker compose up -d Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at http://192.168.0.100:42010/admin_apikeys) Create a New Key and then copy the generated key value Finally, add these values to the environment section in the docker-compose.yml you created for multi-scrobbler earlier. ~/msData/docker-compose.yml - MALOJA_URL=http://192.168.0.100:42010 - MALOJA_API_KEY=myApiKey Register for an API account at Last.fm. Use the following for Callback URL: http://192.168.0.100:9078/lastfm/callback After account creation use the displayed information and add these values to the environment section in the docker-compose.yml you created for multi-scrobbler earlier. ~/msData/docker-compose.yml - LASTFM_API_KEY=myApiKey - LASTFM_SECRET=myApiSecret Setup a Koito server if you have not already done this. Create (or get) an API Key From your Koito server dashboard navigate to Settings (bottom-left icon) => API Keys Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key EX pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL Take note of your Koito username (used below as myUser) Determine your Koito URL This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance. EX dashboard at http://192.168.0.100:4110 => replace myURL below with http://192.168.0.100:4110 More info on the URL to use is the full docs Add/Substitute values above into these examples values and add them to the environment section in the docker-compose.yml you created for multi-scrobbler earlier. ~/msData/docker-compose.yml - KOITO_TOKEN=myToken - KOITO_USER=myUser - KOITO_URL=myURL tip Ensure that Koito is configured to allow requests from multi-scrobbler! In Koito config set KOITO_ALLOWED_HOSTS to the IP the multi-scrobbler dashboard is accessible from.","s":"Setup Clients","u":"/multi-scrobbler/quickstart/","h":"#setup-clients","p":429},{"i":444,"t":"tip If you are running your multi-scrobbler container on a Linux host see these instructions for setting proper file permissions. From the same directory as the docker-compose.yml you created earlier start the container: ~/msData docker compose up -d You're done! Multi-scrobbler is now running. It will monitor the sources you configured and scrobble to clients you set up. Visit http://192.168.0.100:9078 to see the dashboard where configured Sources/Clients show current status and authentication options display statistics about discovered/scrobbled tracks and Now Playing status a real-time log shows multi-scrobbler's activity","s":"Start Multi-Scrobbler","u":"/multi-scrobbler/quickstart/","h":"#start-multi-scrobbler","p":429},{"i":446,"t":"See more advanced docker options as well as other install methods in the Installation docs Review the Configuration docs Learn about how to configure multi-scrobbler using files for more complicated Source/Client scenarios See all available Sources and Clients alongside configuration examples Learn how to set up notification webhooks Check out the kitchensink example Setup Scrobble Enhancements with Musicbrainz to automatically correct and fill in missing track information for your scrobbles Consult the FAQ for solutions to common problems","s":"Next Steps","u":"/multi-scrobbler/quickstart/","h":"#next-steps","p":429},{"i":448,"t":"A javascript app to scrobble music you listened to, to Maloja, Last.fm, ListenBrainz, and Koito. Supports scrobbling from many Sources Azuracast Deezer Google Cast (Chromecast) Icecast Jellyfin JRiver Kodi Koito Last.fm Libre.fm Last.fm (Endpoint) ListenBrainz ListenBrainz (Endpoint) Maloja Mopidy MPD (Music Player Daemon) MPRIS (Linux Desktop) Musikcube Plex Rocksky Spotify Subsonic-compatible APIs (like Airsonic and Navidrome) teal.fm WebScrobbler VLC Yamaha MusicCast Youtube Music Supports scrobbling to many Clients Koito Last.fm Libre.fm ListenBrainz Maloja Rocksky teal.fm Enhance/correct scrobble data with search patterns, built-in corrections, or the Musicbrainz database Monitor status of Sources and Clients using webhooks (Gotify, Ntfy, Apprise) or healthcheck endpoint Supports Now Playing for scrobble Clients Supports configuring for single or multiple users (scrobbling for your friends and family!) Web server interface for stats, basic control, and detailed logs Graceful network and client failure handling (queued scrobbles that auto-retry) Smart handling of credentials (persistent, authorization through app) Easy configuration through ENVs or JSON Install using Docker images for x86/ARM or locally with NodeJS Quick Start Guide Why should I use this over a browser extension and/or mobile app scrobbler? Platform independent -- Because multi-scrobbler communicates directly with service APIs it will scrobble everything you play regardless of where you play it. No more need for apps on every platform you use! Open-source -- Get peace of mind knowing exactly how your personal data is being handled. Track your activity regardless of where you listen -- Scrobble from many Sources to one Client with ease and without duplicating tracks. Manage scrobbling for others -- Scrobble for your friends and family without any setup on their part. Easily silo sources to specific clients to keep plays separate. Standardize your data -- Match your scrobbles with the Musicbrainz database to ensure scrobbled data is as correct and rich as possible. But I already scrobble my music to Last.fm/ListenBrainz, is multi-scrobbler for me? Yes! You can use Last.fm as a Source or Listenbrainz as a Source to forward scrobbles from your profile to any other Client! That way you can keep your current scrobble setup as-is but still get the benefit of capturing your data to a self-hosted location. Use the Last.fm tab in the Quickstart Sources to get started.","s":"Overview","u":"/multi-scrobbler/","h":"","p":447},{"i":450,"t":"You set up configurations for one or more Sources and one or more Clients. MS monitors all of your configured Sources. When new tracks are played by a Source MS grabs that information and then sends it (scrobbles it) to all Clients that Source is configured to forward to.","s":"How Does multi-scrobbler (MS) Work?","u":"/multi-scrobbler/","h":"#how-does-multi-scrobbler-ms-work","p":447},{"i":452,"t":"A Source is a data source that contains information about music you are playing or have listened to, like a desktop player, web music player, or cloud music service. Examples are Spotify, Jellyfin, Plex, Youtube Music, Navidrome, etc... Source configurations consist of: A friendly name. Any data needed to communicate or authenticate with the Source. An optional list of Client names that the Source should scrobble to. If omitted the Source also scrobbles to all configured Clients.","s":"Source","u":"/multi-scrobbler/","h":"#source","p":447},{"i":454,"t":"A Client is an application that stores the historical information about what music you have played (scrobbles). Examples are Maloja, Last.fm, Listenbrainz... Client configurations consist of: A friendly name. Any data needed to communicate or authenticate with the Client.","s":"Client","u":"/multi-scrobbler/","h":"#client","p":447},{"i":456,"t":"See the Quick Start Guide","s":"Quick Start","u":"/multi-scrobbler/","h":"#quick-start","p":447},{"i":458,"t":"See the Installation documentation","s":"Installation","u":"/multi-scrobbler/","h":"#installation","p":447},{"i":460,"t":"See the Configuration documentation","s":"Configuration","u":"/multi-scrobbler/","h":"#configuration","p":447},{"i":462,"t":"A status page with statistics, recent logs, and some runtime configuration options can be found at http://localhost:9078 Output is also provided to stdout/stderr as well as file if specified in configuration. On first startup you may need to authorize Spotify and/or Last.fm by visiting the callback URL (which can also be accessed from the status page). Visit the status page above to find the applicable link to trigger this.","s":"Usage","u":"/multi-scrobbler/","h":"#usage","p":447},{"i":464,"t":"Having issues with connections or configuration? Check the FAQ before creating an issue!","s":"Help/FAQ","u":"/multi-scrobbler/","h":"#helpfaq","p":447},{"i":466,"t":"Detailed architecture and development guides for Sources/Clients","s":"Development","u":"/multi-scrobbler/","h":"#development","p":447},{"i":468,"t":"MIT","s":"License","u":"/multi-scrobbler/","h":"#license","p":447},{"i":471,"t":"Currently, multi-scrobbler does not have any databases or dependencies that require additional interaction/consideration when updating. The majority of major/minor version releases introduce only new functionality but occasionally may also include breaking changes in behavior or configuration. These changes, and how to update configs accordingly, are detailed in Github Release Notes. It is recommended to check this page before upgrading. Alternatively, multi-scrobbler version can be pinned using git tags or docker image tags that match release versions IE foxxmd/multi-scrobbler:0.9.7","s":"Updating","u":"/multi-scrobbler/updating/","h":"#updating","p":469},{"i":473,"t":"Docker Docker Compose docker image pull foxxmd/multi-scrobbler:latest docker container stop multi-scrobbler docker container rm multi-scrobbler docker run --name multi-scrobbler ... The last command is the same as the command used to initialy run multi-scrobbler. docker compose pull docker compose up -d","s":"Docker","u":"/multi-scrobbler/updating/","h":"#docker","p":469},{"i":475,"t":"Assuming the repository was used for initial installation with git clone, update by pulling the latest commit: git pull and restart multi-scrobbler.","s":"Nodejs","u":"/multi-scrobbler/updating/","h":"#nodejs","p":469}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/2",[0,1.707,1,3.552,2,4.669,3,7.054,4,3.487,5,5.337,6,2.266,7,1.462,8,1.146,9,3.843,10,3.306,11,3.552]],["t/4",[6,2.196,9,3.725,10,3.204,11,3.442,12,1.287,13,4.398,14,1.075,15,4.814,16,4.525,17,4.525,18,4.983]],["t/7",[0,1.481,7,1.829,19,1.166,20,1.209,21,6.812,22,7.007,23,6.119,24,5.663,25,7.152,26,4.824,27,5.322,28,4.63,29,3.405,30,3.14,31,5.05,32,3.266,33,3.645,34,3.202,35,3.736,36,3.561,37,3.081,38,6.812,39,4.824,40,4.309,41,3.736,42,5.05,43,6.812,44,6.812,45,6.119]],["t/9",[0,1.958,6,2.752,7,1.345,12,1.337,13,5.329,14,1.028,19,1.054,20,1.092,37,1.93,46,4.602,47,2.34,48,1.922,49,1.681,50,5.115,51,3.661,52,2.537,53,1.307,54,2.032,55,1.895,56,3.776,57,0.626,58,3.218,59,2.283,60,5.531,61,3.022,62,1.086,63,4.267,64,4.267,65,2.699,66,3.164,67,1.567,68,2.466,69,1.766,70,1.681,71,1.066,72,0.98,73,2.466,74,3.691,75,3.661,76,2.283,77,2.685,78,3.164,79,3.164,80,2.9,81,2.089,82,3.164,83,1.511,84,4.267,85,1.861,86,1.246,87,1.777,88,1.361,89,2.466,90,3.833,91,3.547,92,1.797,93,0.521,94,1.021,95,6.157,96,1.141,97,1.797,98,2.592,99,2.046,100,2.23,101,3.334,102,4.267]],["t/11",[72,1.308,103,4.507,104,4.023,105,6.421,106,4.398]],["t/13",[0,1.574,7,1.396,8,1.183,9,2.477,12,1.045,14,1.04,19,0.33,20,0.582,26,2.324,29,1.641,30,0.888,53,1.074,54,1.423,55,0.856,57,0.65,61,1.365,62,1.288,67,0.49,68,1.114,69,0.798,71,0.805,72,1.422,76,3.038,81,1.606,83,1.518,86,1.563,87,1.638,88,1.413,93,0.523,94,1.211,96,1.146,101,2.564,103,1.8,107,1.932,108,2.268,109,3.851,110,2.241,111,2.626,112,2.64,113,2.322,114,3.44,115,1.447,116,1.506,117,0.692,118,1.336,119,1.731,120,1.927,121,1.31,122,1.927,123,2.201,124,1.007,125,1.114,126,0.542,127,1.181,128,1.602,129,1.429,130,1.994,131,1.219,132,2.351,133,3.028,134,1.836,135,2.324,136,4.287,137,4.287,138,1.114,139,1.084,140,0.672,141,1.146,142,1.219,143,1.031,144,1.731,145,1.731,146,1.927,147,3.039,148,1.219,149,1.429,150,0.872,151,2.807,152,3.92,153,1.485,154,3.851,155,2.149,156,1.927,157,1.145,158,1.756,159,2.324,160,2.848,161,1.994,162,3.161,163,3.282,164,2.247,165,3.282,166,1.689,167,3.282,168,3.282,169,1.611,170,1.179,171,1.162,172,1.506,173,2.549,174,1.146,175,1.181,176,1.181,177,2.231,178,1.731,179,2.011,180,1.606,181,2.948,182,1.293,183,3.584,184,3.282,185,1.382,186,0.856,187,1.365,188,1.262,189,1.927,190,1.602,191,1.927,192,1.731,193,1.602,194,2.324,195,2.324,196,2.324,197,2.433,198,1.716,199,2.948,200,1.506,201,1.731,202,1.927,203,1.731,204,1.927,205,1.181,206,1.731,207,1.927,208,0.713,209,0.703,210,1.731,211,1.219,212,1.057,213,0.703,214,1.731,215,2.53,216,1.731,217,1.602,218,1.506,219,1.602,220,2.712,221,1.927,222,1.731,223,1.084,224,1.927,225,1.602,226,1.731,227,1.731,228,3.035,229,2.948,230,2.948,231,2.948,232,1.731,233,2.729,234,1.927,235,1.118,236,1.506,237,1.031,238,1.506,239,1.262,240,1.731,241,1.602,242,1.927,243,0.84,244,1.927,245,1.756,246,1.731,247,1.8,248,1.602,249,1.602,250,1.731,251,1.927,252,1.731,253,1.927,254,1.007,255,0.906,256,1.602,257,1.429]],["t/15",[0,2.02,7,1.602,57,0.611,71,1.134,72,1.579,94,1.686,115,1.66,157,2.458,161,2.776,173,4.189,186,3.128,258,3.964,259,2.494,260,5.272,261,5.272,262,6.329,263,2.916,264,4.989]],["t/17",[0,1.234,8,0.829,10,2.389,12,1.544,14,1.008,19,1.438,20,1.49,28,2.595,36,1.996,57,0.791,62,1.908,67,0.971,71,0.466,72,0.903,79,4.208,86,1.622,87,1.102,88,0.719,91,4.718,92,2.389,93,0.827,107,3.06,108,2.889,111,4.595,117,2.039,133,1.665,138,2.207,143,2.043,147,1.76,158,2.043,162,1.831,166,1.504,175,2.339,185,1.607,195,2.704,197,2.831,198,2.967,220,4.285,237,3.037,247,2.094,265,6.774,266,2.207,267,3.818,268,3.818,269,2.5,270,3.174,271,2.831,272,2.27,273,2.704,274,3.857,275,3.28,276,3.477,277,2.148,278,5.675,279,1.869,280,2.434,281,2.5,282,3.716,283,3.818,284,3.541,285,3.818,286,4.019,287,2.148,288,3.818,289,3.818,290,2.148,291,3.818,292,3.818,293,1.831,294,2.339,295,3.174,296,1.76,297,2.616,298,2.983,299,2.415,300,1.869,301,3.477,302,2.831,303,1.909,304,3.43,305,1.795,306,2.704,307,1.727,308,2.5,309,3.818,310,3.818,311,3.818,312,3.818,313,3.818,314,1.795,315,1.909,316,3.818]],["t/19",[19,1.388,56,4.239,65,5.131,94,1.941,110,4.239,173,4.822,317,5.743]],["t/21",[8,0.815,14,0.578,53,1.574,57,0.769,59,2.986,62,1.42,67,1.887,72,1.325,97,2.349,112,2.234,113,1.866,118,2.271,123,2.164,133,2.433,153,3.767,161,2.198,166,2.198,171,1.975,198,2.916,205,3.418,235,2.478,305,2.622,318,5.845,319,2.349,320,5.898,321,5.012,322,4.638,323,7.482,324,4.359,325,5.794,326,4.691,327,2.731,328,3.293,329,3.951,330,3.418,331,2.731,332,5.579,333,5.012,334,5.579,335,5.579,336,5.579,337,5.579,338,5.579,339,5.579,340,5.579,341,5.579,342,5.579,343,5.579,344,5.579,345,5.579,346,5.579]],["t/23",[2,3.687,7,1.32,8,1.035,12,0.381,14,1.049,19,1.145,20,1.187,32,2.301,34,1.758,39,5.456,41,3.065,53,1.731,57,0.76,62,1.703,67,0.952,69,2.77,71,0.275,72,1.352,77,1.631,85,0.981,86,1.687,87,1.931,88,1.57,93,0.757,94,0.539,97,0.948,103,2.051,107,2.367,108,2.133,113,0.753,115,1.291,126,1.744,130,0.887,133,2.437,134,2.055,138,2.773,139,1.266,140,1.305,141,1.338,152,3.323,154,2.022,155,1.474,175,1.379,182,2.443,276,1.379,280,1.724,297,1.724,315,1.87,319,0.948,328,0.999,331,1.102,347,8.673,348,1.301,349,1.871,350,3.74,351,1.459,352,4.819,353,1.125,354,1.758,355,2.022,356,1.018,357,3.74,358,6.37,359,2.449,360,1.497,361,2.022,362,1.53,363,2.251,364,3.74,365,4.646,366,2.224,367,2.449,368,7.488,369,3.557,370,2.611,371,3.74,372,3.74,373,3.169,374,4.153,375,2.251,376,2.251,377,1.234,378,2.251,379,2.251,380,2.853,381,1.53,382,0.873,383,1.758,384,1.594,385,2.251,386,1.474,387,3.74,388,3.74,389,2.251,390,1.871,391,2.251,392,1.338,393,2.251,394,2.251,395,2.773,396,1.871,397,1.594,398,2.251,399,2.542,400,2.251,401,2.251,402,2.251,403,2.251,404,1.125,405,1.669,406,2.251,407,1.793,408,2.251,409,3.74]],["t/25",[14,0.993,46,3.198,54,2.248,57,0.693,62,1.593,67,2.24,71,0.764,72,0.996,87,1.806,94,1.913,96,1.674,106,3.349,128,5.203,185,2.635,214,5.622,305,4.138,330,3.835,373,4.084,410,5.432,411,6.275,412,6.305,413,5.233,414,6.259,415,5.925,416,5.203,417,6.259,418,6.259,419,5.622,420,2.779,421,4.89]],["t/27",[37,3.098,57,0.733,60,8.243,62,1.743,71,1.032,83,2.425,85,2.987,86,1.386,96,1.832,112,2.743,143,3.666,170,2.461,171,2.425,216,6.153,220,4.333,300,3.353,306,4.85,351,2.082,422,3.854,423,6.008,424,5.694,425,6.85,426,4.073,427,3.666,428,3.098,429,6.85,430,4.197,431,6.85,432,4.485]],["t/29",[0,1.707,19,1.344,20,1.393,49,3.094,55,3.487,71,0.958,100,4.105,239,5.141,247,4.306,433,4.538,434,7.054,435,3.487]],["t/31",[0,1.19,7,1.019,8,1.069,12,1.395,14,1.072,19,1.126,20,1.168,25,2.842,26,3.876,33,1.947,39,3.876,50,3.876,55,2.922,67,1.393,71,0.894,72,1.047,81,1.781,85,1.586,86,0.736,87,1.05,88,1.24,94,1.753,101,5.721,115,1.651,150,1.645,161,1.433,170,1.307,205,2.229,209,2.4,220,4.632,235,1.91,239,5.402,240,3.268,241,6.087,243,2.387,245,3.918,246,3.268,247,4.306,248,3.024,249,5.471,250,3.268,252,3.268,254,1.902,255,1.71,256,3.024,257,2.697,260,4.032,293,1.744,306,2.576,373,4.012,427,1.947,432,2.382,435,2.922,436,3.268,437,5.142,438,3.024,439,4.309,440,3.024,441,2.229,442,5.474,443,3.638,444,3.638,445,3.638,446,3.638,447,4.551,448,4.917,449,3.638,450,3.638,451,3.638,452,3.638,453,3.638,454,4.917,455,3.638,456,5.474,457,4.551,458,4.058,459,3.638,460,3.638,461,3.638,462,3.638,463,3.638]],["t/33",[12,0.998,49,2.324,57,0.511,71,0.72,75,4.574,76,3.157,106,3.157,109,6.911,111,3.615,115,1.138,126,1.659,166,2.324,170,2.12,183,4.178,187,4.178,235,1.539,247,3.235,261,3.615,264,4.178,296,2.72,319,3.239,353,2.949,362,4.01,397,4.178,435,2.62,439,5.037,447,4.905,464,7.542,465,5.9,466,4.975,467,4.61,468,4.905,469,9.409,470,3.732,471,4.01,472,4.905,473,7.693,474,7.693,475,4.61,476,5.9,477,4.01,478,5.9,479,5.9,480,4.905,481,4.905,482,5.3,483,2.484,484,2.773]],["t/35",[7,1.152,8,1.059,14,0.641,16,5.862,19,1.358,20,1.408,36,2.246,37,3.589,49,1.693,57,0.782,58,2.246,67,1.845,69,2.561,71,0.524,72,0.684,77,1.874,83,2.977,88,0.809,99,2.06,103,2.356,113,1.437,126,1.208,130,1.693,157,1.499,158,2.299,164,1.908,170,2.223,179,3.791,235,2.549,254,2.246,259,2.567,263,1.778,264,3.043,293,4.032,315,2.148,331,3.029,351,2.205,366,2.555,377,2.356,404,2.148,485,2.148,486,2.555,487,3.572,488,3.572,489,5.144,490,1.666,491,2.813,492,3.86,493,3.86,494,2.813,495,1.72,496,3.86,497,3.107,498,3.186,499,6.57,500,5.559,501,4.206,502,4.297,503,4.297,504,4.297,505,3.186,506,6.188,507,6.188,508,4.297,509,4.297,510,6.188,511,4.297,512,2.718,513,3.86,514,2.813]],["t/37",[0,1.959,8,1.03,12,1.193,14,1.059,16,5.527,53,1.1,62,1.795,83,1.834,86,1.428,87,2.036,88,1.511,92,2.97,93,0.861,107,1.978,108,1.782,115,1.662,126,1.457,164,2.3,170,1.861,208,2.612,209,2.573,213,1.889,235,2.092,243,3.076,254,4.193,293,2.484,351,1.575,370,2.181,407,3.383,496,4.654,499,5.512,500,4.654,515,5.181,516,4.654,517,5.512,518,5.512,519,5.512,520,5.512,521,5.512,522,5.23,523,2.612,524,2.652]],["t/39",[1,2.788,7,1.473,10,4.017,19,1.055,20,1.094,49,2.429,57,0.8,67,1.569,70,2.429,71,0.752,77,2.688,164,4.335,171,2.183,186,2.737,212,3.381,235,2.064,259,3.095,266,3.563,280,2.215,284,3.222,293,2.956,351,2.804,405,4.571,435,2.737,485,3.082,494,4.036,495,2.469,525,2.091,526,5.125,527,3.222,528,4.036,529,5.125,530,3.563,531,3.381,532,5.538,533,5.125]],["t/41",[8,0.937,19,1.525,20,1.581,37,3.674,57,0.812,59,3.437,61,4.547,62,1.634,67,1.634,69,2.658,70,2.53,72,1.022,83,2.876,88,1.21,111,3.934,153,2.905,198,3.357,235,2.519,318,5.637,319,2.704,428,2.905,486,4.83,526,5.339,530,3.712,534,4.695,535,3.818,536,4.205,537,5.017,538,5.769,539,4.761]],["t/43",[0,1.721,8,1.013,12,1.173,14,1.055,53,1.073,54,1.951,57,0.438,62,1.765,86,1.403,87,2.001,88,1.492,91,5.766,92,2.92,93,0.846,96,1.855,107,1.929,108,1.738,115,1.644,118,2.057,126,1.421,164,3.08,182,1.991,195,4.912,197,5.142,198,3.625,208,2.568,209,2.529,213,1.843,235,1.318,237,3.712,263,2.092,284,4.139,286,5.608,293,2.423,319,2.92,320,3.579,351,2.408,370,2.128,407,3.326,523,2.568,524,2.607,538,4.54,540,5.054,541,5.054,542,3.435,543,5.054,544,3.747,545,5.054,546,3.747,547,2.921,548,3.579,549,4.54]],["t/45",[7,1.214,15,6.139,49,2.57,57,0.816,71,1.001,72,1.038,77,2.845,99,3.128,123,2.53,164,4.182,171,2.905,259,2.31,280,2.344,284,3.41,293,3.128,303,3.261,318,4.127,319,2.747,351,2.863,366,3.879,404,4.102,485,3.261,497,2.795,525,2.212,550,3.77,551,6.524,552,4.836,553,6.524]],["t/47",[8,0.937,15,4.062,19,1.525,20,1.581,37,3.674,57,0.812,59,3.437,61,4.547,62,1.634,67,1.634,69,2.658,70,2.53,72,1.022,83,2.876,88,1.21,111,3.934,153,2.905,198,3.357,235,2.519,318,5.637,319,2.704,428,2.905,486,4.83,530,3.712,534,4.695,535,3.818,536,4.205,537,5.017,554,5.769,555,6.422]],["t/49",[15,4.727,57,0.773,62,1.901,68,4.319,85,3.258,88,1.407,89,4.319,93,0.912,153,3.38,186,3.318,280,2.685,331,3.657,404,4.457,550,4.319,556,6.712,557,7.472,558,7.472,559,7.472]],["t/51",[0,1.661,8,0.966,12,1.119,14,1.051,15,4.187,53,1.003,54,2.149,57,0.662,62,1.684,67,1.202,69,1.956,86,1.339,87,1.91,88,1.439,89,2.731,92,2.787,93,0.808,94,1.584,96,2.043,107,1.804,108,2.277,115,1.597,118,1.923,126,1.329,182,1.861,198,3.46,208,2.451,209,2.414,213,1.723,235,1.232,237,3.542,263,1.956,284,3.994,293,2.265,319,2.787,331,2.312,351,1.436,370,1.989,404,2.362,427,2.528,471,6.141,501,3.211,523,2.451,524,2.488,542,3.211,544,3.503,546,3.503,547,2.731,548,3.346,554,4.244,556,4.244,560,4.725,561,4.725,562,4.725,563,6.864,564,4.725,565,4.725,566,3.928,567,4.725,568,4.244,569,6.62,570,4.244]],["t/53",[8,0.87,9,4.209,14,0.617,32,2.856,57,0.671,67,1.516,69,2.466,72,0.948,115,1.149,118,2.425,130,3.05,133,3.376,134,2.552,138,3.443,139,4.356,143,3.188,150,2.694,170,2.781,179,3.649,235,1.554,255,2.8,259,2.109,280,2.14,293,4.366,315,2.978,351,2.354,366,3.542,420,3.437,486,3.542,490,2.31,491,3.9,522,5.739,571,5.351,572,5.351,573,5.351,574,4.952,575,4.048,576,4.654,577,4.952,578,5.351,579,5.351,580,4.416,581,5.351,582,5.351,583,5.351,584,5.351,585,5.957,586,3.267,587,4.218]],["t/55",[0,1.999,8,1.073,9,2.694,12,1.243,14,1.068,53,1.168,54,2.067,62,1.87,83,1.949,86,1.487,87,2.121,88,1.558,92,3.094,93,0.897,96,1.965,107,2.101,108,1.893,115,1.703,126,1.548,147,2.537,208,2.721,209,2.68,213,2.007,235,2.158,236,5.742,237,3.933,238,5.742,293,2.639,351,1.674,370,2.318,407,3.524,523,2.721,524,2.762,588,5.505,589,4.945,590,4.945,591,6.602]],["t/57",[1,3.098,7,1.574,11,4.453,19,1.172,20,1.215,49,2.699,57,0.594,71,0.836,72,1.09,77,2.987,123,2.656,164,3.755,170,3.039,171,2.425,243,2.987,259,2.994,404,3.424,435,3.041,485,3.424,525,2.868,527,3.58,528,4.485,550,3.959,592,5.078,593,4.485,594,3.424]],["t/59",[0,1.733,8,1.021,11,2.314,12,1.183,14,1.057,53,1.086,54,1.967,62,1.78,83,1.812,86,1.415,87,2.018,88,1.501,92,2.945,93,0.854,96,1.87,107,1.953,108,1.76,115,1.653,126,1.439,170,1.838,208,2.59,209,2.551,213,1.866,235,2.079,243,3.475,254,4.166,370,2.154,407,3.354,517,5.465,518,5.465,519,5.465,520,5.465,521,5.465,523,2.59,524,2.629,525,1.735,592,3.793,595,5.117,596,7.16,597,5.117,598,5.117,599,7.16,600,4.596,601,6.995,602,4.754]],["t/61",[0,0.873,1,3.477,2,3.503,4,1.784,6,1.159,7,1.828,10,1.691,11,1.817,17,4.867,19,0.687,20,0.713,22,3.339,32,1.926,34,1.888,39,4.173,48,1.84,49,1.583,53,0.853,57,0.511,71,0.719,77,1.752,79,2.978,93,1.177,97,1.691,98,1.691,99,1.926,111,3.61,115,1.137,117,2.117,125,2.322,127,3.61,151,2.63,161,1.583,164,1.784,170,1.443,171,1.422,188,3.858,259,2.086,263,1.663,296,1.852,300,1.966,307,1.817,325,4.604,366,2.388,380,2.388,422,2.26,483,1.691,485,2.008,497,1.721,535,2.388,542,2.73,603,4.173,604,3.727,605,2.322,606,4.414,607,2.15,608,2.884,609,3.609,610,3.339,611,4.709,612,3.858,613,3.609,614,2.541,615,3.609,616,4.604,617,4.899,618,2.26,619,3.139,620,3.139,621,3.609,622,3.339,623,6.978,624,2.978,625,4.017,626,2.73,627,2.73,628,2.978,629,2.322,630,4.005,631,5.452,632,3.139,633,2.845,634,3.339,635,5.293,636,2.63,637,3.609,638,4.017,639,4.017,640,3.609,641,2.845,642,3.609,643,3.139,644,2.978,645,3.609,646,2.978,647,4.017,648,4.017,649,4.017,650,2.541,651,4.017,652,3.139,653,2.15]],["t/63",[17,5.594,37,3.28,57,0.759,158,3.881,164,3.889,171,2.568,293,3.477,351,2.205,486,5.207,495,2.904,606,5.54,654,4.443,655,7.252,656,7.252,657,7.252,658,6.515,659,7.252,660,4.08,661,6.029]],["t/66",[0,1.661,8,0.966,12,1.119,14,1.045,17,3.936,19,1.133,20,1.175,34,2.221,37,2.137,53,1.003,57,0.574,62,1.684,86,1.339,87,1.91,88,1.439,92,2.787,93,0.808,107,1.804,108,1.625,115,1.597,126,1.329,164,3.676,208,2.451,209,2.414,213,1.723,263,2.74,280,1.697,293,3.664,315,2.362,351,1.436,370,1.989,407,3.174,523,2.451,524,2.488,525,1.602,606,5.238,626,3.211,629,2.731,660,2.658,661,3.928,662,6.57,663,4.499,664,5.172,665,5.947,666,3.093,667,5.97,668,3.346,669,3.093,670,4.244,671,3.093,672,4.244,673,4.244,674,4.725,675,4.244,676,4.725,677,4.244,678,6.62,679,6.62]],["t/68",[1,3.537,2,2.477,6,1.202,7,1.664,10,1.754,11,1.884,18,5.854,19,1.036,20,1.074,31,3.089,34,1.958,35,3.319,49,1.641,53,0.884,57,0.72,71,0.508,77,1.817,93,1.186,97,1.754,98,1.754,99,1.998,111,3.707,115,1.167,118,1.696,125,2.408,127,4.366,129,3.089,140,1.454,151,2.728,161,1.641,164,1.85,170,2.174,188,3.962,235,1.087,259,2.142,263,1.724,296,1.92,300,2.039,307,1.884,325,3.255,366,2.477,428,1.884,485,2.083,497,1.785,542,2.832,575,4.843,592,3.089,603,2.95,606,3.828,607,2.23,608,2.962,609,3.743,610,5.031,611,5.089,612,4.666,613,3.743,614,2.635,615,3.743,616,4.728,617,5.031,618,2.344,619,3.255,620,3.255,621,3.743,622,3.464,624,3.089,626,2.832,627,2.832,628,3.089,629,2.408,630,4.113,631,6.111,632,3.255,633,2.95,634,3.464,660,3.405,664,4.728,668,2.95,680,3.743,681,3.743,682,6.051,683,4.166,684,4.166,685,3.464,686,4.166,687,4.166,688,4.166,689,4.166,690,3.743,691,3.089,692,3.089]],["t/70",[14,0.907,66,5.377,67,1.845,112,2.904,164,3.22,255,4.422,259,3.101,307,3.961,315,3.626,424,6.029,486,4.312,490,2.812,544,5.377,606,5.54,634,6.029,693,7.252,694,5.136,695,3.55,696,6.029]],["t/73",[0,1.614,8,0.931,12,1.079,14,1.036,19,1.092,20,1.132,34,2.108,53,0.952,57,0.644,62,1.623,86,1.291,87,1.841,88,1.399,92,2.686,93,0.779,107,1.712,108,1.542,115,1.561,126,1.261,150,2.028,164,3.592,208,2.362,209,2.327,211,2.837,213,1.635,255,2.108,263,2.641,272,2.666,280,1.611,307,2.028,315,2.242,370,1.888,407,3.059,523,2.362,524,2.398,525,1.521,606,5.118,612,2.936,618,2.523,626,3.048,629,2.592,662,6.053,663,4.336,664,5.802,665,5.731,666,2.936,667,5.802,669,4.177,670,4.028,671,2.936,672,4.028,673,4.028,675,4.028,697,5.297,698,4.484,699,4.484,700,4.484,701,4.484,702,4.484,703,4.028,704,6.38,705,5.731,706,5.731,707,5.731,708,5.731,709,5.731,710,3.504]],["t/75",[1,2.446,6,2.717,7,1.843,9,2.647,10,2.277,11,2.446,57,0.469,89,3.126,127,4.45,132,4.497,161,2.861,162,3.932,164,3.641,166,2.861,170,3.456,182,2.131,243,2.358,269,3.541,287,3.043,307,2.446,352,3.676,397,5.143,483,3.058,484,2.542,497,2.317,542,3.676,641,3.83,711,4.226,712,4.858,713,9.144,714,7.366,715,4.226,716,4.01,717,4.496,718,5.408,719,4.226,720,5.408,721,5.408,722,4.496,723,5.369,724,4.226,725,5.408,726,5.408,727,2.647,728,5.408]],["t/77",[0,1.898,1,1.747,6,0.675,7,0.918,9,2.414,12,1.476,14,1.099,19,0.401,20,0.415,25,6.109,30,2.639,34,1.1,35,1.283,41,1.283,51,3.767,53,1.448,57,0.203,71,0.699,85,2.763,88,1.193,93,1.066,94,1.633,104,1.145,112,0.937,115,1.684,132,2.705,153,1.059,166,2.255,171,1.368,194,2.735,196,2.735,198,1.223,200,3.018,213,0.853,217,1.946,227,2.102,228,2.735,229,4.431,230,3.47,231,3.47,232,2.102,235,1.967,237,3.39,243,2.496,247,2.705,255,1.1,284,1.223,286,1.657,315,1.17,320,1.657,326,2.444,330,1.434,351,0.712,353,3.41,377,2.118,404,1.17,439,1.532,484,1.1,525,2.148,602,1.591,641,1.657,654,1.434,712,2.102,714,2.102,722,3.211,727,1.145,729,2.34,730,5.691,731,3.863,732,3.863,733,5.725,734,2.625,735,2.864,736,3.018,737,2.102,738,5.691,739,3.47,740,3.47,741,1.946,742,2.34,743,2.34,744,2.102,745,4.431,746,2.102,747,4.431,748,2.102,749,2.102,750,2.102,751,2.102,752,2.102,753,2.34,754,2.34,755,2.102,756,4.431,757,4.431,758,3.493,759,3.47,760,2.102,761,2.102,762,3.018,763,2.102,764,2.735,765,2.625,766,2.102,767,1.946,768,1.946,769,2.34,770,2.34,771,2.34,772,1.829,773,2.102,774,1.591,775,1.829,776,2.102,777,2.102,778,2.102,779,2.102,780,1.946,781,2.102,782,2.102,783,2.102,784,2.102,785,2.102,786,3.47,787,2.102,788,2.102]],["t/79",[0,1.846,12,1.608,14,1.11,85,1.55,86,0.719,88,0.669,90,3.193,93,1.16,115,0.686,166,1.4,192,3.193,194,3.809,196,3.809,198,1.858,200,2.777,235,2.215,237,4.16,243,3.155,284,1.858,286,2.517,307,1.608,525,1.205,602,2.415,629,2.054,641,2.517,722,2.955,737,3.193,738,6.5,739,4.832,740,4.832,744,3.193,745,5.829,746,3.193,747,5.829,748,3.193,749,3.193,750,3.193,751,3.193,752,3.193,755,3.193,756,5.829,757,5.829,758,4.595,759,4.832,760,3.193,761,3.193,762,4.202,763,3.193,764,2.517,766,3.193,767,2.955,768,2.955,773,3.193,774,2.415,775,2.777,776,3.193,777,3.193,779,3.193,780,2.955,781,3.193,782,3.193,783,3.193,784,3.193,785,3.193,786,4.832,787,3.193,788,3.193,789,3.554,790,3.193,791,3.554,792,3.554,793,3.554]],["t/81",[4,3.358,6,2.183,8,1.104,48,2.362,71,1.096,74,3.865,93,0.923,132,4.148,134,3.24,166,2.98,300,3.702,483,3.781,604,4.785,715,5.91,716,5.608,727,3.702]],["t/83",[7,1.206,9,1.735,10,2.26,11,2.427,12,0.599,14,1.122,15,2.242,16,2.107,17,2.107,18,2.32,19,0.606,74,1.811,77,4.558,132,1.943,166,1.396,351,1.077,423,4.241,430,2.171,435,2.383,483,2.26,484,1.666,618,1.994,716,2.627,727,1.735,794,3.544,795,3.183,796,3.544,797,2.509,798,2.769,799,2.509,800,5.152,801,2.409,802,2.509,803,2.769,804,2.769,805,2.627,806,2.627,807,2.509,808,2.627,809,2.627,810,2.627,811,3.183,812,2.409,813,3.183,814,2.769]],["t/86",[5,3.07,6,2.152,7,1.705,10,1.902,11,2.043,16,2.686,19,1.467,20,1.521,29,3.206,33,2.417,47,2.477,48,2.676,49,2.527,57,0.392,58,2.361,71,1.178,74,3.277,77,3.539,93,1.087,98,1.902,113,2.714,115,0.871,118,1.839,124,2.361,126,1.27,140,2.602,157,1.576,175,2.767,223,2.541,262,4.058,266,2.611,328,2.006,353,2.258,377,2.477,392,2.686,423,2.957,466,2.477,480,3.755,490,1.752,497,1.935,525,1.532,618,2.541,636,2.957,644,3.349,736,3.529,797,3.199,800,4.089,815,2.767,816,4.517,817,4.058,818,2.957,819,4.517,820,2.611,821,6.413,822,3.815,823,3.199,824,3.199,825,4.058,826,4.058,827,5.761,828,3.755,829,5.011,830,4.541,831,4.058,832,3.529,833,4.517,834,4.517,835,4.517,836,4.517,837,3.755,838,2.767,839,4.517]],["t/88",[6,2.592,46,3.865,48,2.804,49,2.98,71,1.096,72,1.204,77,3.298,110,3.954,422,4.256,525,3.046,840,5.681,841,4.371,842,5.356]],["t/90",[0,2.206,7,1.586,8,0.853,12,1.586,14,1.016,19,1,20,1.037,37,2.643,53,1.24,57,0.739,62,1.487,68,4.419,71,0.933,72,1.356,73,3.377,85,3.716,88,1.101,93,0.713,104,2.86,115,1.127,118,2.379,153,2.643,281,3.826,441,3.58,495,3.061,594,2.921,614,3.697,764,4.138,765,3.972,843,3.972,844,4.858,845,4.566,846,5.844,847,5.844,848,4.332,849,5.844]],["t/92",[5,3.775,7,1.034,14,1.058,27,4.34,29,2.777,48,2.308,49,2.188,53,1.179,57,0.641,58,2.903,61,3.933,62,1.413,71,0.902,72,0.884,73,3.21,77,2.422,83,2.618,86,1.124,87,1.603,88,1.046,89,3.21,93,0.678,94,1.77,112,2.224,169,3.33,190,4.618,222,4.99,223,4.16,225,6.146,226,4.99,257,4.118,280,2.656,735,4.118,818,3.637,822,4.064,826,7.465,850,5.554,851,4.618,852,5.554,853,4.99,854,7.393,855,7.393,856,5.554,857,3.933,858,5.554,859,5.554]],["t/94",[7,1.755,14,1.037,19,1.247,20,1.292,34,3.863,37,2.457,42,4.027,47,2.979,53,1.153,55,2.412,56,2.839,58,2.839,59,2.907,67,2.091,71,1.072,72,0.864,73,4.75,75,3.23,86,1.099,87,1.567,88,1.023,93,0.663,94,1.744,96,1.948,104,2.659,113,1.816,126,1.528,157,1.895,161,2.87,185,2.287,215,2.716,261,3.328,280,1.952,354,4.244,356,2.457,395,3.14,428,2.457,495,2.175,525,2.47,653,2.907,822,2.327,860,5.432,861,3.328,862,4.516,863,4.516,864,3.436,865,3.692,866,3.557,867,3.847,868,3.557,869,2.839,870,4.88,871,4.516]],["t/96",[6,1.116,7,1.781,8,0.564,13,2.234,14,1.019,19,0.98,20,1.016,34,3.787,37,1.749,42,2.866,46,1.975,48,1.207,53,1.601,54,1.087,55,1.717,56,3.944,57,0.698,59,3.652,67,2.222,71,0.472,72,1.086,73,3.311,75,3.406,83,2.416,86,0.782,87,1.116,88,1.079,89,2.234,93,0.472,94,1.371,96,1.532,113,2.523,126,1.087,159,4.832,161,1.523,170,1.389,171,1.369,182,2.257,185,1.628,215,1.933,223,2.175,235,2.101,280,1.389,294,2.369,308,2.531,349,3.214,354,3.02,356,1.749,374,2.021,395,2.234,420,1.717,428,1.749,497,1.656,501,5.128,523,1.431,797,4.056,798,5.332,822,2.454,823,2.738,824,2.738,832,3.02,848,2.866,857,2.738,863,3.214,864,2.446,865,2.627,866,2.531,867,2.738,868,2.531,869,2.021,870,3.473,871,3.214,872,3.214,873,3.02,874,2.738,875,3.473,876,2.866,877,2.627,878,3.473,879,4.762,880,3.866,881,3.473,882,3.866,883,3.866,884,3.866,885,5.728,886,3.214,887,4.056,888,3.473,889,3.473,890,3.866,891,3.473,892,3.473,893,2.627,894,3.473,895,2.866]],["t/98",[7,1.298,8,1.018,12,1.564,14,1.057,53,1.081,54,1.962,62,1.297,71,0.622,75,3.03,86,1.031,87,1.47,93,0.851,96,2.473,107,1.945,108,1.753,115,1.346,126,1.433,208,2.582,209,2.544,213,1.858,228,4.939,235,2.074,370,2.145,407,3.814,523,2.582,524,2.622,593,3.336,631,3.981,695,2.494,798,6.214,822,2.988,881,6.266,888,4.577,889,6.266,891,4.577,892,6.266,896,5.095,897,2.604,898,8.663,899,5.095,900,5.095,901,5.095,902,5.095,903,4.236,904,5.095,905,6.975]],["t/100",[29,3.584,52,4.262,57,0.754,71,1.142,93,0.875,124,4.546,164,3.183,220,4.534,245,3.836,296,3.304,497,3.071,799,6.629,906,5.959,907,7.168,908,6.439,909,7.168,910,3.931,911,4.143,912,5.959,913,5.959,914,7.168]],["t/102",[1,2.353,2,3.093,4,2.31,12,1.196,14,0.733,19,0.89,20,0.923,57,0.697,69,2.154,112,2.083,124,2.72,169,1.956,179,4.335,274,3.536,280,3.242,305,2.445,351,1.582,353,2.601,377,2.853,392,4.207,441,3.188,457,4.325,489,4.325,491,3.407,534,3.007,594,2.601,614,3.291,660,3.981,695,2.547,774,6.133,799,5.01,800,2.853,822,2.229,842,3.684,864,5.086,908,4.674,915,7.502,916,3.684,917,3.407,918,5.882,919,5.203,920,4.065,921,8.628,922,7.075,923,5.203,924,5.528,925,4.065,926,5.245,927,5.464,928,5.203,929,4.325,930,3.684,931,5.203,932,4.674,933,5.203,934,5.203,935,4.674,936,3.291,937,4.674,938,5.203,939,5.203]],["t/104",[0,1.683,8,1.13,12,1.309,14,1.087,53,1.264,54,2.177,62,1.516,71,0.727,86,1.205,87,1.719,93,0.945,96,2.07,107,2.274,108,2.049,115,1.149,126,1.675,208,2.866,209,2.823,213,2.172,280,2.14,370,2.508,407,2.856,523,2.866,524,2.91,534,3.443,774,4.048,799,4.218,915,7.15,918,4.952,940,5.957,941,5.957,942,7.741,943,7.741]],["t/106",[4,2.546,7,1.067,8,0.837,12,0.97,14,1.026,29,3.775,46,2.931,48,2.636,70,2.26,71,0.7,83,2.03,86,1.16,88,1.08,93,0.7,94,2.021,106,3.069,113,1.918,157,2.001,160,3.227,169,2.156,263,2.374,276,3.514,296,2.644,384,4.061,505,4.252,641,4.061,799,5.979,800,3.145,822,2.457,841,3.315,915,4.768,925,4.481,944,5.735,945,4.061,946,5.735,947,4.061,948,4.481,949,2.998,950,7.552,951,6.597,952,7.552,953,5.735,954,5.735,955,4.252,956,5.735,957,5.735,958,6.784,959,4.768,960,4.252,961,5.735,962,5.735]],["t/108",[1,3.465,4,1.771,6,1.151,7,0.943,8,0.856,12,1.175,14,1.003,19,0.682,20,0.899,29,1.216,34,1.143,36,1.272,46,3.75,47,1.334,48,2.17,49,0.958,53,1.075,54,1.122,55,1.08,56,1.272,57,0.636,59,1.302,67,1.015,69,1.007,71,0.789,72,1.168,74,1.243,77,1.061,83,1.794,85,1.061,86,1.025,88,0.458,93,0.789,94,0.582,96,1.066,98,1.679,99,3.102,100,1.272,106,3.462,110,2.084,113,1.96,114,1.653,115,1.646,118,0.99,123,2.508,126,1.122,133,2.21,134,2.171,142,1.539,157,0.849,159,1.723,160,1.369,174,1.446,182,0.958,212,1.334,218,1.901,247,2.187,263,2.097,305,2.382,307,1.804,328,1.08,356,2.651,374,1.272,380,1.446,392,1.446,410,1.653,411,2.611,412,1.653,413,2.611,415,1.804,427,2.134,433,1.406,481,2.022,483,2.133,495,1.597,580,1.804,603,1.723,605,1.406,629,1.406,643,1.901,653,2.134,663,1.653,691,1.804,801,3.444,802,5.616,803,3.959,809,2.956,840,4.396,843,1.653,887,1.723,925,1.901,945,1.723,948,3.116,963,6.046,964,2.185,965,2.433,966,2.433,967,2.433,968,3.757,969,1.901,970,1.539,971,2.433,972,2.956,973,3.116,974,2.022,975,1.539,976,1.901,977,2.022,978,1.539,979,5.067,980,2.371,981,2.433,982,2.433,983,2.433,984,1.369,985,2.611,986,5.861,987,2.433,988,2.185,989,2.433,990,1.49,991,2.433,992,2.433,993,1.723,994,2.433,995,2.022,996,1.901,997,2.022,998,2.433,999,2.185,1000,3.315,1001,2.433,1002,2.433,1003,2.433,1004,2.433,1005,2.433,1006,2.371,1007,2.185,1008,2.185,1009,1.804,1010,2.433,1011,2.433,1012,4.58,1013,2.433,1014,3.988,1015,5.067,1016,4.552,1017,3.116,1018,3.988,1019,2.443,1020,2.956,1021,2.523,1022,1.901,1023,1.539,1024,3.988,1025,2.185,1026,2.022,1027,2.433,1028,4.213,1029,2.433,1030,2.433]],["t/110",[7,1.536,8,1.205,12,1.113,14,1.078,49,1.847,53,0.995,54,1.319,62,1.675,67,1.193,71,0.572,72,0.746,83,1.66,86,1.332,87,1.353,88,0.883,93,0.804,96,1.254,97,1.974,98,3.474,107,1.79,108,1.613,115,0.905,126,1.319,166,1.847,171,1.66,175,2.873,208,2.437,209,2.401,213,1.71,261,2.873,307,2.978,331,3.223,370,1.974,374,2.451,495,1.877,523,2.437,524,2.475,802,6.383,803,3.663,840,4.814,887,3.32,897,2.396,1016,5.915,1031,4.689,1032,4.689,1033,5.056,1034,4.907,1035,4.689,1036,3.663,1037,4.212,1038,4.212,1039,4.689,1040,4.689,1041,3.898,1042,4.689,1043,4.689,1044,6.584,1045,6.584,1046,6.584,1047,6.584]],["t/112",[4,2.337,6,0.997,7,1.778,8,0.504,12,0.584,14,1.006,19,1.22,20,1.265,34,3.953,37,1.562,42,2.561,46,1.765,48,1.991,53,1.117,54,0.972,55,2.337,56,3.333,57,0.729,58,2.751,59,1.849,67,1.953,70,2.074,71,1.058,72,0.838,73,3.042,75,2.054,83,2.525,86,0.699,87,0.997,88,0.992,93,0.778,94,1.526,96,1.705,114,4.847,121,2.348,161,1.361,185,2.685,187,2.446,215,1.727,223,1.944,225,2.872,235,2.002,263,2.64,280,1.241,297,1.592,303,1.727,327,1.691,354,2.699,356,1.562,373,1.765,380,4.809,395,1.997,428,1.562,435,1.534,495,1.383,531,1.895,587,2.446,607,1.849,653,1.849,666,2.262,685,5.302,695,1.691,797,3.727,804,6.773,822,2.255,857,2.446,863,2.872,864,2.185,865,2.348,866,2.262,867,2.446,868,2.262,869,1.806,871,2.872,886,2.872,887,3.727,895,2.561,898,4.729,977,2.872,993,2.446,1048,7.131,1049,4.113,1050,2.116,1051,3.454,1052,2.699,1053,3.454,1054,3.454,1055,3.103,1056,2.872,1057,3.454,1058,3.103,1059,3.103,1060,2.699,1061,1.944,1062,3.103,1063,3.103,1064,5.264,1065,5.264,1066,3.454]],["t/114",[8,1.342,12,1.33,14,1.082,53,1.295,54,2.212,62,1.553,71,0.745,86,1.235,87,1.761,93,0.96,96,2.103,107,2.33,108,2.1,115,1.178,126,1.717,208,2.911,209,2.868,213,2.226,235,2.269,370,2.57,407,2.927,523,2.911,524,2.956,804,6.145,1062,7.065,1063,7.065,1067,6.104,1068,6.104]],["t/116",[14,0.885,19,1.192,20,1.236,54,1.959,57,0.604,69,2.883,72,1.108,94,1.667,100,3.641,104,4.183,170,2.503,171,2.466,182,2.744,254,3.641,255,3.274,319,2.933,428,3.151,542,4.734,618,4.808,723,4.561,805,6.336,820,4.026,924,5.442,963,5.595,1069,3.919,1070,6.257,1071,6.257]],["t/118",[8,1.063,14,0.754,19,1.247,20,1.292,28,3.692,53,1.546,57,0.794,59,2.907,67,2.091,70,2.14,86,1.474,88,1.372,94,1.3,97,2.287,117,1.952,125,3.14,147,2.504,172,4.244,185,2.287,186,2.412,235,2.612,277,4.098,280,1.952,281,3.557,301,3.328,303,2.716,308,3.557,327,2.659,328,2.412,353,2.716,360,2.917,374,4.59,405,4.027,586,2.979,607,2.907,618,3.056,805,6.093,877,3.692,963,3.557,980,3.23,1023,3.436,1072,4.516,1073,4.516,1074,6.543,1075,3.436,1076,4.516,1077,5.432,1078,5.432,1079,4.516,1080,5.432,1081,7.284]],["t/120",[8,1.057,12,1.224,14,1.065,53,1.143,54,2.461,62,1.843,67,1.843,71,0.657,86,1.465,87,2.09,88,1.541,93,0.884,96,1.936,107,2.056,108,1.852,115,1.688,126,1.514,170,1.935,208,2.681,209,2.641,213,1.964,235,2.134,254,4.277,255,3.846,319,3.049,370,2.267,407,2.582,523,2.681,524,2.722,805,5.369,1074,4.837,1076,6.02,1082,5.385,1083,5.385,1084,5.385,1085,5.385,1086,7.241,1087,7.241,1088,7.241]],["t/122",[0,0.946,7,1.607,8,0.636,12,0.923,14,1.063,19,1.25,20,1.296,37,1.226,53,1.158,54,1.224,57,0.633,62,0.69,68,1.567,69,1.802,71,0.331,72,0.868,76,1.451,80,1.842,86,0.548,87,0.782,93,0.531,94,1.306,96,1.829,98,3.076,99,2.616,107,1.035,108,0.932,115,0.84,116,2.118,126,0.762,162,1.3,169,1.019,170,0.974,179,1.661,182,1.715,185,1.141,208,1.612,209,1.588,213,0.988,215,2.176,218,3.401,219,3.619,235,1.423,237,3.343,254,3.265,255,2.936,259,1.932,280,0.974,293,3.503,307,1.226,319,2.88,330,1.661,348,1.567,351,2.334,370,1.141,397,1.919,404,1.355,407,2.087,411,2.85,428,1.226,483,1.141,486,1.612,490,1.051,505,3.228,522,2.01,523,1.612,524,1.636,525,2.603,602,3.708,653,1.451,723,3.572,727,4.137,758,3.863,762,4.263,767,4.536,768,3.619,790,2.435,801,2.959,840,2.754,845,3.401,864,1.715,875,2.435,920,3.401,963,3.572,964,2.435,975,1.715,1012,1.919,1020,2.01,1033,4.476,1036,3.401,1059,2.435,1089,2.711,1090,2.711,1091,2.118,1092,2.711,1093,4.354,1094,2.01,1095,2.435,1096,4.354,1097,5.456,1098,2.711,1099,2.711,1100,5.456,1101,2.435,1102,2.435,1103,2.435,1104,2.711,1105,4.965,1106,2.711,1107,4.536,1108,2.711,1109,2.711,1110,2.711,1111,2.711,1112,3.911,1113,3.911,1114,3.911,1115,3.911,1116,3.911,1117,3.911,1118,3.911,1119,4.354,1120,2.435]],["t/124",[14,0.888,19,1.199,20,1.243,50,4.961,54,1.97,67,2.182,69,2.9,72,1.115,99,3.359,100,3.662,104,3.429,140,2.444,171,2.48,182,2.76,254,3.662,255,3.293,326,4.431,366,4.165,426,5.099,428,3.169,512,4.431,806,6.358,820,4.049,1069,3.941,1070,6.293,1071,6.293,1121,5.824]],["t/126",[8,1.063,14,0.754,19,1.247,20,1.292,28,3.692,53,1.546,57,0.794,59,2.907,67,2.091,70,2.14,86,1.474,88,1.372,97,2.287,117,1.952,125,3.14,147,2.504,185,2.287,186,2.412,235,2.612,258,3.056,277,4.098,280,1.952,281,3.557,301,3.328,303,2.716,308,3.557,327,2.659,328,3.234,353,2.716,360,2.917,374,4.59,405,4.027,426,3.23,586,2.979,607,2.907,806,6.093,877,3.692,980,3.23,1023,3.436,1072,4.516,1073,4.516,1075,3.436,1076,4.516,1079,4.516,1122,6.543,1123,5.432,1124,5.432,1125,5.432,1126,5.432,1127,5.432,1128,5.432]],["t/128",[8,1.07,12,1.239,14,1.067,53,1.163,54,2.061,62,1.864,67,1.864,71,0.669,86,1.483,87,2.114,88,1.555,93,0.894,96,1.959,107,2.092,108,1.885,115,1.7,126,1.541,170,1.969,208,2.713,209,2.672,213,1.998,235,2.153,254,4.315,255,3.88,370,2.307,407,2.628,523,2.713,524,2.754,806,5.432,1122,7.415,1129,5.48,1130,5.48,1131,5.48,1132,5.48,1133,7.327,1134,6.092,1135,7.327]],["t/130",[0,1.848,7,1.371,8,0.922,12,1.068,14,1.034,16,5.714,19,0.756,20,0.784,48,1.38,49,1.741,57,0.697,62,2.163,68,2.555,71,1.156,72,1.353,86,1.491,87,2.126,88,1.714,92,3.102,93,0.771,108,1.52,115,1.551,118,1.799,130,2.903,157,1.542,170,1.588,208,2.338,209,2.303,213,1.612,235,1.647,243,2.754,254,3.301,259,1.565,263,1.829,356,1.999,485,2.21,495,1.77,499,4.934,516,3.971,517,4.934,518,4.934,519,4.934,520,4.934,521,4.934,522,4.682,523,2.338,524,2.374,608,2.163,695,2.163,800,2.424,978,2.796,1136,3.971,1137,2.365]],["t/132",[0,1.576,1,3.28,7,1.751,10,4.212,19,1.241,20,1.287,49,2.857,54,2.04,57,0.629,71,1.069,77,3.162,164,3.22,170,2.606,259,3.101,485,3.626,527,3.791,528,4.748]],["t/134",[7,1.607,10,3.922,19,1.213,20,1.257,57,0.807,71,0.865,72,1.128,81,3.468,130,2.792,170,2.546,171,2.509,182,2.792,235,1.848,243,3.09,435,3.146,501,4.816,527,3.704,607,3.792,608,3.468,1138,6.596,1139,7.086,1140,7.086]],["t/136",[7,1.025,8,1.073,12,1.243,14,1.068,53,1.168,54,2.067,57,0.637,62,2.105,71,0.897,72,0.876,86,1.487,87,2.121,88,1.558,93,0.897,94,1.318,96,1.965,107,2.101,108,1.893,115,1.703,126,2.067,182,2.169,208,2.721,209,2.68,213,2.007,235,1.436,370,2.318,435,2.444,523,2.721,524,2.762,527,2.877,897,2.813,1138,5.204,1141,5.505,1142,7.349,1143,4.945,1144,5.505,1145,4.945,1146,5.505,1147,6.11,1148,7.349,1149,5.505]],["t/138",[0,1.942,1,2.92,7,1.746,10,4.073,19,1.105,20,1.145,49,2.543,57,0.707,68,3.731,69,2.672,70,2.543,71,1.09,72,1.493,77,2.815,92,2.718,93,0.788,97,2.718,259,2.886,435,2.866,485,3.227,490,2.503,526,5.367,527,3.374,528,4.227,608,3.16,695,3.16,800,3.54,841,3.731,984,3.632,1150,5.799]],["t/140",[0,1.542,8,1.036,10,3.392,12,1.2,14,1.06,19,0.894,20,0.927,54,1.996,57,0.698,62,2.199,71,1.055,72,0.831,86,1.63,87,2.325,88,1.702,92,2.987,93,0.866,96,1.897,108,1.797,115,1.667,130,2.059,195,5.025,197,5.261,198,3.709,208,2.627,209,2.588,213,1.905,237,3.797,284,3.709,286,5.025,320,3.7,356,2.363,495,2.092,523,2.627,524,2.667,549,4.694,695,2.557,1137,2.796,1151,5.544]],["t/142",[0,1.99,7,1.704,15,6.05,49,2.684,57,0.731,68,3.937,69,2.819,70,2.684,71,1.117,72,1.522,77,2.97,92,2.868,93,0.831,97,2.868,259,2.412,485,3.405,490,2.641,608,3.334,695,3.334,800,3.736,841,3.937,984,3.833,1150,6.119]],["t/144",[0,1.542,8,1.036,12,1.2,14,1.06,15,5.097,19,0.894,20,0.927,54,1.996,57,0.698,62,2.199,71,1.055,72,0.831,86,1.63,87,2.325,88,1.702,92,2.987,93,0.866,96,1.897,108,1.797,115,1.667,130,2.059,198,3.709,208,2.627,209,2.588,213,1.905,237,3.797,284,3.709,356,2.363,471,5.874,495,2.092,523,2.627,524,2.667,563,6.374,568,4.694,570,4.694,695,2.557,1137,2.796,1152,7.096]],["t/146",[0,1.576,1,3.28,7,1.751,11,4.525,19,1.241,20,1.287,49,2.857,54,2.04,57,0.629,71,1.069,77,3.162,164,3.22,170,2.606,259,3.101,485,3.626,527,3.791,528,4.748]],["t/148",[1,3.314,7,1.536,11,4.154,19,1.508,20,1.564,52,3.258,55,2.433,57,0.796,62,1.394,67,1.394,71,0.669,72,1.166,81,2.682,83,1.94,89,3.167,118,2.231,126,1.541,130,3.252,170,1.969,171,1.94,177,3.725,182,2.159,235,2.153,243,2.39,269,3.588,276,3.358,294,3.358,307,2.479,326,3.467,422,3.083,435,2.433,495,2.194,501,4.98,527,2.865,607,2.933,608,2.682,669,3.588,822,2.348,823,3.881,824,3.881,829,4.282,977,4.556,1138,5.845,1153,5.48,1154,6.582,1155,4.923,1156,3.588,1157,4.923,1158,4.923,1159,5.48,1160,5.48,1161,4.923,1162,4.556,1163,5.48]],["t/150",[0,1.605,11,3.339,19,1.263,20,1.31,57,0.64,70,2.909,72,1.175,126,2.076,130,2.909,162,3.54,182,2.909,243,4.134,280,3.18,319,3.108,353,3.691,435,3.278,471,5.018,1023,4.67,1164,5.228]],["t/152",[1,2.414,7,1.34,8,1.051,12,1.217,14,1.064,53,1.133,54,2.025,57,0.624,62,2.073,71,0.879,72,0.849,86,1.457,87,2.077,88,1.534,93,0.879,94,1.278,96,1.925,107,2.038,108,1.836,115,1.682,126,2.025,182,2.836,208,2.665,209,2.625,213,1.947,235,1.392,243,3.552,319,2.247,370,2.247,435,2.37,523,2.665,524,2.706,527,2.79,596,7.318,778,4.795,780,5.985,897,2.728,1143,4.795,1145,4.795,1165,5.338,1166,4.795,1167,5.338,1168,5.338,1169,7.199]],["t/154",[0,1.783,1,2.951,7,1.753,11,4.481,19,1.116,20,1.157,48,2.037,49,2.57,57,0.711,71,0.796,72,1.306,123,2.53,164,2.897,170,3.225,171,2.31,243,2.845,259,2.905,404,3.261,435,2.897,485,3.261,525,2.212,527,3.41,528,4.271,550,3.77,592,4.836,593,4.271,594,3.261,800,3.578,978,4.127,1136,5.86]],["t/156",[0,1.508,8,1.013,11,3.855,12,1.173,14,1.055,19,0.865,20,0.897,54,1.951,57,0.687,62,2.169,71,1.04,72,0.804,86,1.602,87,2.285,88,1.683,92,2.92,93,0.846,96,1.855,108,1.738,115,1.644,130,1.991,208,2.568,209,2.529,213,1.843,235,1.809,243,3.024,254,3.625,356,2.286,495,2.024,517,5.419,518,5.419,519,5.419,520,5.419,521,5.419,523,2.568,524,2.607,599,6.231,600,4.54,602,4.714,695,2.474,1137,2.704,1170,6.936]],["t/158",[0,1.911,7,1.358,9,4.617,57,0.632,62,1.856,68,4.216,71,1.073,72,1.399,88,1.656,92,3.071,118,2.97,130,3.463,157,2.546,170,2.621,259,2.583,263,3.02,608,3.571]],["t/160",[0,1.551,8,1.042,9,4.245,12,1.207,14,1.062,19,0.902,20,0.935,54,2.007,57,0.702,62,2.207,71,1.14,72,0.839,86,1.637,87,2.335,88,1.707,92,3.005,93,0.871,96,1.908,108,1.813,115,1.673,130,2.076,208,2.642,209,2.602,213,1.922,235,1.861,236,5.576,237,3.819,238,5.576,356,2.383,495,2.11,523,2.642,524,2.683,590,4.734,591,6.411,695,2.579,1137,2.82]],["t/162",[6,1.915,7,0.883,8,0.969,14,0.859,19,1.31,20,1.359,28,3.223,48,1.481,53,1.409,54,1.334,55,2.106,57,0.719,59,2.538,67,1.689,71,0.81,72,1.056,86,1.549,88,1.25,97,1.997,117,1.704,125,2.741,131,3,160,2.669,170,2.385,185,1.997,235,2.572,277,3.735,280,1.704,281,3.105,296,2.186,301,2.906,308,3.105,326,4.199,328,2.947,353,2.371,360,2.658,374,4.002,405,3.516,483,2.794,495,1.899,586,2.601,607,4.098,671,3.105,807,6.577,822,2.032,877,3.223,945,3.359,1021,3,1023,3,1041,3.943,1072,3.943,1073,3.943,1075,3,1079,3.943,1171,4.743,1172,4.743,1173,4.743,1174,4.261,1175,3.359,1176,6.637,1177,6.637,1178,4.743,1179,4.743,1180,4.743,1181,4.743,1182,4.743,1183,4.743,1184,4.743]],["t/164",[6,1.873,7,1.522,8,0.947,14,0.847,19,1.4,20,1.451,48,2.553,57,0.709,71,0.792,88,1.222,98,2.732,99,3.112,104,3.176,117,2.332,150,3.699,153,2.935,157,2.264,175,3.976,294,3.976,295,5.395,297,3.769,386,4.249,807,5.791,960,4.811,976,5.07,1107,5.395,1185,7.346,1186,5.829,1187,5.558,1188,5.395,1189,5.07,1190,5.829,1191,6.489,1192,5.829]],["t/166",[7,1.604,8,0.874,12,1.313,14,0.804,19,1.475,20,1.529,35,3.283,48,3.079,57,0.673,71,0.73,93,0.948,98,2.52,245,3.203,294,3.667,295,4.976,297,2.759,303,3.882,395,3.459,807,4.239,837,4.976,897,3.059,960,4.438,1190,8.194,1193,3.98,1194,6.456,1195,5.986,1196,5.377,1197,5.986,1198,5.132,1199,3.093]],["t/168",[8,1.106,12,1.281,14,1.095,54,2.13,55,2.558,62,2.153,71,0.703,86,1.533,87,2.186,88,1.594,93,0.924,96,2.025,115,1.734,208,2.804,209,2.762,213,2.101,235,1.976,523,2.804,524,2.847,807,4.08,1075,4.792,1185,6.805,1186,6.805,1196,6.805,1200,5.762,1201,7.575]],["t/170",[6,1.159,7,0.748,19,1.464,20,1.452,48,1.254,57,0.348,62,1.499,70,2.322,72,0.639,74,3.011,123,2.981,124,2.1,126,1.963,130,2.749,133,3.352,134,3.293,138,2.322,143,2.15,147,1.852,155,4.569,157,1.402,176,2.461,186,1.784,220,2.541,261,2.461,280,2.117,287,2.26,317,2.845,328,3.098,353,2.946,365,3.339,369,2.978,396,3.339,399,2.73,420,1.784,424,3.339,427,3.734,437,3.139,477,2.73,483,1.691,497,3.293,525,1.998,546,2.978,607,2.15,618,3.315,653,2.15,719,3.139,809,2.978,820,4.443,822,2.989,827,3.609,869,2.1,876,4.368,927,2.73,949,2.1,963,3.858,985,3.858,999,7.685,1023,2.541,1061,2.26,1069,3.315,1121,5.801,1202,7.112,1203,4.368,1204,4.017,1205,5.892,1206,8.185,1207,3.339,1208,4.017,1209,8.185,1210,2.73,1211,3.609,1212,3.609,1213,3.609,1214,3.139,1215,4.017,1216,4.017,1217,4.017,1218,3.609,1219,2.63,1220,2.541,1221,5.892,1222,4.017,1223,4.017,1224,5.293,1225,3.609,1226,4.017,1227,4.017,1228,4.017,1229,4.017,1230,4.017]],["t/172",[7,1.295,8,1.015,12,1.444,14,1.087,53,1.077,54,1.956,57,0.603,62,1.77,66,3.762,71,0.849,74,3.554,86,1.407,87,2.007,88,1.495,93,0.849,94,1.215,96,1.86,98,2.928,107,1.937,108,1.745,115,1.647,126,1.427,166,2.74,171,1.797,208,2.575,209,2.536,213,1.85,330,3.109,370,2.136,523,2.575,524,2.614,808,5.157,812,4.727,976,6.201,1033,4.261,1034,4.135,1188,5.782,1202,5.782,1231,5.074,1232,5.074,1233,5.074,1234,5.074,1235,6.248]],["t/174",[0,1.634,14,0.779,57,0.652,67,1.913,88,1.416,110,3.929,113,2.514,328,3.338,374,3.929,808,6.634,820,4.345,869,3.929,1224,6.753,1236,7.518,1237,7.518,1238,7.518,1239,5.874,1240,7.518]],["t/176",[8,1.079,12,1.25,14,1.085,53,1.179,54,2.079,62,1.881,71,0.678,86,1.496,87,2.133,88,1.565,93,0.902,94,1.77,96,1.977,107,2.12,108,1.91,115,1.709,126,1.562,208,2.737,209,2.696,213,2.025,215,3.696,235,1.928,255,3.475,370,2.338,523,2.737,524,2.779,808,4.118,1241,5.554,1242,5.554,1243,5.554,1244,5.554,1245,7.393,1246,7.393,1247,6.642,1248,7.393]],["t/178",[14,0.833,53,1.342,54,2.262,57,0.767,67,2.047,70,2.491,72,1.006,100,3.305,113,2.958,130,3.486,170,3.454,182,3.169,185,2.662,235,2.098,255,2.972,258,3.558,327,3.095,328,3.572,374,3.305,380,4.783,441,3.874,527,3.305,695,3.095,810,5.964,877,4.297,878,5.68,879,5.257,1249,4.297,1250,6.323,1251,6.323,1252,6.323,1253,5.68]],["t/180",[8,1.086,12,1.258,14,1.071,53,1.19,54,2.092,57,0.486,62,1.893,67,1.426,71,0.684,86,1.505,87,2.146,88,1.572,93,0.908,96,1.989,107,2.14,108,1.928,115,1.785,126,1.576,170,2.014,208,2.753,209,2.712,213,2.044,235,1.94,255,3.496,328,2.489,370,2.36,380,3.332,407,2.687,523,2.753,524,2.796,810,6.592,1247,6.682,1253,7.499,1254,5.605,1255,5.605,1256,5.605]],["t/182",[0,2.005,7,1.791,17,5.978,48,2.659,49,2.729,57,0.6,71,0.845,72,1.102,158,3.707,169,2.604,259,2.452,296,3.193,325,5.412,483,2.916,485,3.463,603,4.905,604,4.382,605,4.003,606,4.382,612,4.535,978,4.382,1257,5.758]],["t/184",[0,1.707,7,1.462,17,4.669,93,0.958,130,3.094,158,4.202,497,3.364,606,4.967,611,4.811,612,5.141,869,4.105,984,4.418]],["t/186",[0,1.718,8,1.01,12,1.17,14,1.055,17,5.303,19,0.861,20,0.893,57,0.685,62,2.269,68,2.909,71,1.125,72,1.258,86,1.599,87,2.28,88,1.778,92,3.327,93,0.844,108,1.731,115,1.641,118,2.049,130,3.113,157,1.756,208,2.56,209,2.522,213,1.835,263,2.083,293,3.316,356,2.277,495,2.015,523,2.56,524,2.6,608,2.463,662,4.898,667,5.404,677,4.521,695,2.463,1137,2.693,1258,6.917,1259,6.917]],["t/188",[0,0.919,7,1.672,8,0.777,12,0.715,14,1.068,19,0.723,20,0.75,34,1.228,53,1.671,54,1.189,57,0.461,59,1.398,62,1.354,67,0.665,69,1.082,71,0.319,72,0.673,76,1.398,80,1.776,86,0.855,87,1.22,88,1.003,93,0.516,94,1.012,96,1.635,97,1.1,98,3.184,99,2.932,107,0.997,108,0.899,110,2.209,113,0.874,115,1.18,126,0.735,132,5.094,155,4.952,158,1.398,162,1.253,170,0.939,171,0.925,185,1.1,208,1.565,209,1.541,213,0.953,215,2.113,218,3.302,219,3.514,235,1.595,243,3.433,254,2.209,319,3.025,328,1.16,330,2.59,351,0.794,353,1.306,370,1.1,374,1.366,404,1.306,407,2.027,411,2.767,483,1.1,495,1.046,497,1.119,514,1.711,523,1.565,524,1.589,525,3.203,594,1.306,602,4.564,697,1.711,723,4.004,758,5.088,762,4.159,801,2.873,840,2.674,916,1.85,920,3.302,963,1.711,1033,4.402,1036,3.302,1095,2.347,1105,4.883,1107,4.425,1112,3.797,1113,3.797,1114,3.797,1115,3.797,1116,3.797,1117,3.797,1118,3.797,1120,3.797,1137,1.398,1192,3.797,1207,2.172,1260,4.227,1261,2.613,1262,6.715,1263,6.715,1264,2.613,1265,4.227,1266,2.613,1267,2.613,1268,2.613,1269,2.613,1270,2.613,1271,2.613,1272,2.613,1273,2.613,1274,4.227,1275,4.227,1276,4.227]],["t/190",[0,1.227,4,1.016,6,1.401,7,0.426,8,0.334,19,1.544,20,1.582,24,1.902,29,1.895,36,1.196,37,1.715,46,1.937,48,1.184,54,1.066,57,0.711,58,1.982,62,1.437,65,2.398,67,1.437,69,0.947,70,1.913,71,0.279,72,0.773,74,1.169,82,1.696,93,0.279,99,1.097,100,1.196,112,0.916,113,1.623,116,1.788,123,2.77,124,1.982,127,1.402,129,1.696,133,1.653,134,2.681,140,0.798,141,1.36,150,2.831,151,1.498,153,1.035,155,2.482,164,1.016,166,3.776,170,0.822,174,1.36,176,1.402,179,2.323,186,1.016,211,2.398,223,1.287,235,1.949,243,0.998,257,1.696,259,1.999,279,1.12,284,1.196,287,1.287,296,1.055,303,1.144,307,2.831,315,1.144,317,1.62,318,5.3,319,2.84,326,4.268,351,0.696,356,1.035,359,1.498,377,2.079,404,1.895,416,1.902,420,1.016,426,2.886,427,1.225,428,1.715,470,1.448,486,2.886,490,0.887,497,2.08,514,1.498,527,1.196,528,1.498,530,1.323,534,3.263,535,3.357,536,1.498,547,1.323,552,2.811,586,1.255,593,2.482,602,1.555,614,1.448,627,1.555,633,1.62,650,1.448,660,2.731,669,4.098,692,1.696,694,1.62,711,1.788,719,1.788,741,1.902,800,1.255,823,1.62,824,1.62,857,1.62,864,1.448,867,1.62,869,1.196,887,1.62,897,1.169,910,1.255,913,3.152,916,1.62,917,1.498,926,1.696,930,1.62,949,1.196,968,1.696,980,2.886,984,2.731,1006,2.254,1058,2.056,1075,1.448,1094,1.696,1161,2.056,1162,3.152,1187,5.572,1218,2.056,1220,1.448,1239,1.788,1277,3.792,1278,2.288,1279,1.696,1280,1.448,1281,1.62,1282,1.902,1283,2.056,1284,4.361,1285,2.288,1286,3.299,1287,1.225,1288,3.152,1289,3.406,1290,2.288,1291,6.746,1292,2.288,1293,2.288,1294,2.288,1295,2.288,1296,2.288,1297,5.072,1298,2.288,1299,1.696,1300,1.555,1301,2.288,1302,1.788,1303,2.288,1304,1.788,1305,4.855,1306,4.855,1307,1.788,1308,2.288,1309,2.056,1310,1.788,1311,2.288,1312,2.288,1313,2.288,1314,2.288,1315,2.288,1316,2.288,1317,1.696,1318,2.288,1319,3.792,1320,1.788,1321,1.696,1322,2.288,1323,3.152,1324,3.152,1325,2.288,1326,2.288,1327,2.288,1328,2.288,1329,2.288,1330,2.056,1331,2.288,1332,1.788]],["t/192",[0,1.569,8,1.054,12,1.221,14,1.074,53,1.138,54,2.031,62,1.837,71,0.654,86,1.461,87,2.083,88,1.538,93,0.881,96,1.931,107,2.047,108,1.844,115,1.685,126,1.508,166,2.112,193,6.002,194,5.113,195,5.113,196,5.113,197,5.353,198,3.774,199,7.334,200,5.641,201,6.486,208,2.673,209,2.633,213,1.955,370,2.257,407,3.462,523,2.673,524,2.714,530,3.099,650,3.391,1187,3.644,1297,4.816,1333,5.361,1334,5.361,1335,5.361]],["t/194",[1,2.582,4,2.535,7,1.568,11,3.405,46,2.917,55,3.343,57,0.807,71,1.028,72,0.908,81,3.685,85,2.489,86,1.155,87,1.647,94,1.366,97,2.403,98,2.403,106,3.055,110,2.984,112,3.015,131,4.763,140,1.992,169,2.83,172,4.46,182,2.249,255,2.683,280,2.051,303,2.854,351,2.289,367,3.738,435,3.343,441,3.497,477,3.88,484,3.539,525,1.936,624,4.232,715,5.882,758,4.042,815,4.613,975,3.611,1105,3.88,1156,4.929,1199,2.553,1279,4.232,1299,4.232,1300,3.88,1336,5.709,1337,5.709,1338,5.709,1339,5.709,1340,4.042]],["t/196",[8,1.048,12,1.214,14,1.08,53,1.128,54,2.019,62,1.826,71,0.649,83,1.882,86,1.452,87,2.071,88,1.531,93,0.876,96,1.919,107,2.029,108,1.828,115,1.679,126,1.495,170,1.91,208,2.657,209,2.618,213,1.938,235,2.12,255,3.374,351,1.616,370,2.238,407,3.897,484,3.374,523,2.657,524,2.698,525,2.434,758,5.083,1341,5.315,1342,5.315,1343,5.315,1344,5.315,1345,4.149,1346,7.178,1347,8.704,1348,7.178]],["t/198",[0,1.965,7,1.815,18,6.384,48,2.07,49,2.612,57,0.575,71,0.809,72,1.055,93,0.809,127,4.061,140,2.313,158,3.547,169,2.492,170,2.382,259,2.347,296,3.056,428,2.998,485,3.314,575,4.505,603,4.694,610,5.511,611,4.061,612,5.92,664,6.475,680,5.955,681,5.955,978,4.193,1257,5.511]],["t/200",[0,1.707,7,1.462,18,5.141,93,0.958,130,3.094,158,4.202,497,3.364,606,4.967,611,4.811,612,5.141,869,4.105,984,4.418]],["t/202",[0,1.644,18,4.952,62,1.925,68,4.371,71,1.096,72,1.429,88,1.692,92,3.184,118,3.079,130,3.538,157,2.639,263,3.131,608,3.702,1349,6.288]],["t/204",[0,1.073,6,1.747,7,1.376,8,0.884,10,2.549,12,1.323,14,1.078,18,4.469,19,0.544,20,0.564,29,1.589,57,0.732,62,1.737,71,0.996,72,0.786,83,1.125,85,1.386,86,1.225,87,1.747,88,1.392,92,3.112,93,0.955,98,2.079,99,2.367,104,2.417,108,1.093,112,1.273,115,1.317,117,1.142,130,1.252,140,2.579,161,1.252,171,1.125,208,1.828,209,1.8,213,1.159,280,1.142,356,1.438,483,2.079,495,1.273,523,1.828,524,1.856,575,2.16,612,2.081,667,5.775,669,2.081,690,2.855,691,2.357,695,1.556,697,4.839,703,2.855,705,6.639,706,6.639,707,6.639,708,6.639,709,6.639,710,2.483,841,1.837,842,3.496,1012,4.287,1137,1.701,1189,2.483,1280,2.011,1321,2.357,1350,7.823,1351,7.391,1352,2.357,1353,2.011,1354,3.179,1355,3.179,1356,2.642,1357,3.179,1358,2.642,1359,3.179,1360,3.179,1361,3.179,1362,3.179,1363,3.179,1364,3.179,1365,2.357,1366,4.937,1367,6.054,1368,7.391,1369,6.825,1370,2.642,1371,2.357]],["t/206",[4,3.374,6,0.855,8,0.683,12,1.209,13,1.713,14,1.052,19,0.8,20,1.166,30,1.367,39,2.099,41,1.626,46,3.654,48,0.926,54,1.848,57,0.689,67,1.672,70,1.168,72,0.744,79,3.466,81,1.451,83,1.05,86,1.171,88,0.558,93,0.706,94,1.386,96,1.757,106,1.587,110,1.55,112,1.187,113,2.197,114,3.178,115,0.572,117,1.68,129,2.198,150,1.341,159,2.099,180,1.451,186,1.316,255,2.721,263,1.227,272,1.763,275,3.798,280,1.065,293,1.422,294,1.816,305,3.088,326,5.365,327,1.451,328,2.57,369,2.198,380,2.78,392,1.763,410,3.178,411,1.941,413,1.941,422,1.668,427,2.502,428,2.115,433,1.713,486,1.763,487,3.887,488,2.465,497,2.003,527,1.55,534,1.713,594,1.482,652,2.316,654,1.816,666,1.941,691,2.198,694,2.099,695,1.451,734,2.015,812,6.287,820,1.713,841,1.713,864,1.875,874,2.099,910,2.564,924,2.316,925,2.316,936,2.958,949,1.55,968,2.198,990,1.816,1022,2.316,1069,4.983,1193,1.968,1198,1.668,1199,2.228,1349,3.887,1372,4.675,1373,2.965,1374,1.941,1375,2.965,1376,2.965,1377,4.675,1378,2.663,1379,2.965,1380,2.965,1381,3.466,1382,4.2,1383,2.965,1384,2.965,1385,2.316,1386,7.151,1387,2.663,1388,2.965,1389,4.381,1390,2.618,1391,3.934,1392,4.675,1393,2.465,1394,4.2,1395,3.887,1396,2.965,1397,2.965,1398,2.965,1399,2.965,1400,2.965,1401,2.465,1402,2.965]],["t/208",[8,1.109,12,1.285,14,1.075,53,1.229,54,2.137,62,1.933,71,0.706,86,1.537,87,2.192,88,1.598,93,0.927,96,2.032,107,2.21,108,1.991,115,1.737,126,1.628,208,2.813,209,2.771,213,2.111,235,1.982,255,3.571,370,2.437,407,2.776,523,2.813,524,2.856,812,3.934,1394,5.2,1395,6.317,1403,5.789,1404,8.482,1405,5.789,1406,7.598]],["t/210",[1,2.558,12,0.956,19,0.968,20,1.004,35,3.102,55,3.323,57,0.49,83,2.003,113,1.891,115,1.091,126,1.591,147,2.607,155,3.703,162,2.712,164,2.511,175,4.585,235,2.328,239,4.899,296,2.607,319,2.381,326,3.578,331,2.768,351,2.549,392,3.363,395,3.269,420,2.511,430,5.138,441,3.465,497,3.206,498,4.193,528,3.703,534,4.325,618,3.182,620,4.419,631,4.419,637,5.081,654,3.465,669,3.703,823,4.005,824,4.005,828,4.702,920,5.847,975,3.578,990,3.465,1075,3.578,1175,5.299,1289,5.081,1407,5.656,1408,5.656,1409,4.702,1410,5.081,1411,5.656,1412,5.656,1413,5.656,1414,5.656,1415,5.656,1416,5.656,1417,5.656,1418,5.656]],["t/212",[0,1.662,8,0.853,12,1.293,14,1.076,57,0.813,67,1.945,71,1.103,81,2.86,83,2.069,86,1.182,88,1.101,93,0.933,97,2.46,103,3.205,117,2.747,126,1.644,180,2.86,235,2.222,351,2.591,430,3.58,650,3.697,1138,6.4,1409,4.858,1419,5.844,1420,7.645,1421,5.844,1422,5.844,1423,7.645,1424,5.844,1425,5.844,1426,5.844,1427,5.844]],["t/214",[7,1.624,12,1.219,55,3.201,56,4.562,57,0.625,65,5.521,72,1.389,113,2.411,118,2.935,276,4.417,430,4.417,495,2.887,668,6.18,927,4.9,1175,6.18,1281,5.106,1428,6.477,1429,8.431]],["t/216",[7,1.336,8,1.048,12,1.214,14,1.08,53,1.128,54,1.495,62,2.068,67,1.352,71,0.649,86,1.452,87,2.071,88,1.531,93,0.876,96,1.421,97,2.238,98,3.022,107,2.029,108,1.828,115,1.679,126,1.495,171,1.882,208,2.657,209,2.618,213,1.938,370,2.238,430,4.98,523,2.657,524,2.698,897,2.716,976,5.608,1033,4.398,1034,4.268,1138,5.083,1188,5.968,1428,4.775,1429,6.448,1430,5.315,1431,5.315,1432,5.315,1433,5.315,1434,7.178,1435,7.178]],["t/218",[6,1.761,7,1.62,19,1.346,20,1.395,34,2.869,46,3.119,48,1.906,49,2.405,53,1.295,57,0.682,59,3.267,83,2.161,89,3.528,151,3.996,159,5.569,182,3.099,223,3.434,235,2.397,294,3.74,331,2.988,349,5.075,351,1.856,360,2.444,483,2.57,501,5.345,626,4.149,797,5.569,814,7.18,822,2.615,823,4.322,824,4.322,840,3.861,857,4.322,1162,5.075,1436,6.104,1437,6.104,1438,6.104,1439,6.104,1440,6.104,1441,6.104,1442,7.865]],["t/220",[8,1.12,12,1.297,14,1.077,53,1.246,54,2.157,62,1.951,71,0.717,86,1.552,87,2.213,88,1.609,93,0.936,96,2.051,107,2.241,108,2.02,115,1.747,126,1.651,208,2.839,209,2.797,213,2.141,235,2.228,333,6.889,370,2.472,407,2.815,523,2.839,524,2.883,814,5.992,840,3.714,1443,5.872,1444,5.872,1445,7.669]],["t/222",[0,1.704,1,1.444,7,0.594,12,0.838,13,1.845,14,0.943,19,0.319,20,0.331,27,1.458,29,1.596,30,0.86,31,1.383,32,0.895,33,0.999,34,0.877,36,0.975,37,2.746,41,1.751,46,1.632,48,0.583,49,1.258,54,1.177,55,0.829,57,0.662,62,1.065,65,1.18,67,1.065,70,1.952,71,0.39,72,0.508,76,0.999,83,1.13,88,0.601,89,2.864,93,0.605,94,1.002,96,1.91,100,0.975,105,1.458,106,0.999,112,1.278,113,2.553,115,0.956,118,0.76,124,1.669,125,1.078,130,0.735,140,1.114,150,2.519,157,1.114,162,0.895,164,0.829,169,0.701,171,1.754,176,1.143,177,1.268,179,1.143,180,2.048,182,1.258,186,1.418,194,2.261,196,2.261,198,0.975,212,1.023,220,2.647,235,1.452,247,1.751,259,1.972,261,1.956,263,0.772,266,1.078,269,1.222,277,1.05,280,0.67,284,1.669,296,2.567,297,0.86,301,1.143,304,2.868,305,1.967,318,4.328,319,3.118,322,1.551,327,0.913,331,0.913,351,1.272,353,1.596,359,2.09,415,1.383,420,2.2,428,0.844,439,1.222,441,1.143,475,1.458,477,1.268,482,4.451,483,2.086,485,0.933,486,1.109,490,1.623,494,1.222,497,1.368,498,1.383,505,1.383,525,1.083,534,2.419,535,1.109,536,1.222,546,3.103,547,2.419,548,2.963,552,2.367,587,1.321,605,1.078,627,2.17,650,1.18,658,1.676,660,1.05,661,1.551,669,2.09,694,2.963,696,1.551,711,1.458,717,1.551,723,1.222,724,1.458,736,1.458,765,2.17,772,4.351,774,4.65,775,1.458,800,1.023,801,4.41,820,1.078,822,0.799,841,1.845,843,1.268,864,2.02,865,2.17,867,2.261,869,1.669,906,2.654,910,1.751,916,1.321,917,4.248,926,1.383,932,1.676,936,2.647,945,1.321,947,1.321,948,1.458,970,2.02,975,1.18,984,2.355,990,1.956,996,1.458,1023,2.02,1038,1.676,1094,1.383,1164,1.321,1187,4.65,1214,2.495,1281,2.261,1288,1.551,1300,3.785,1302,1.458,1304,1.458,1307,1.458,1332,1.458,1353,1.18,1385,1.458,1446,1.866,1447,1.676,1448,3.871,1449,1.551,1450,1.866,1451,1.551,1452,5.688,1453,2.868,1454,1.866,1455,1.866,1456,1.866,1457,1.676,1458,1.866,1459,1.676,1460,1.676,1461,2.868,1462,1.458,1463,1.551,1464,3.759,1465,3.759,1466,1.676,1467,1.676,1468,4.185,1469,3.479,1470,1.676,1471,1.866,1472,1.866,1473,1.866,1474,1.866,1475,1.676,1476,1.551,1477,1.866,1478,2.868,1479,3.193,1480,1.866,1481,3.193,1482,1.866,1483,1.866,1484,1.383,1485,1.866,1486,1.551,1487,1.676,1488,3.193,1489,3.759,1490,3.27,1491,1.676,1492,1.866,1493,1.676,1494,3.193,1495,3.193,1496,3.193,1497,1.383,1498,1.321,1499,1.866,1500,2.367,1501,1.676,1502,1.866,1503,1.866,1504,1.866,1505,1.866,1506,1.866,1507,1.676,1508,1.866,1509,1.551,1510,1.321,1511,1.866,1512,1.866,1513,1.866,1514,1.866,1515,1.866,1516,1.866,1517,1.866,1518,1.866,1519,1.866,1520,1.866,1521,1.866,1522,1.676,1523,1.551,1524,1.866]],["t/224",[0,1.806,8,0.972,12,1.125,14,1.08,53,1.01,54,1.872,62,1.693,71,0.581,86,1.347,87,1.92,88,1.445,89,2.752,93,0.812,94,1.593,96,2.222,107,1.817,108,1.638,115,1.603,126,1.339,194,4.713,196,4.713,208,2.464,209,2.427,213,1.736,215,2.38,280,1.711,284,2.489,305,2.238,318,3.012,319,2.005,370,2.005,523,2.464,524,2.502,547,2.752,772,3.72,774,5.215,775,5.2,800,2.611,910,2.611,1187,3.236,1448,3.72,1452,6.379,1466,5.979,1467,5.979,1469,5.533,1525,4.761,1526,4.761,1527,7.673,1528,4.761,1529,4.761,1530,4.761,1531,4.761,1532,6.655,1533,6.655,1534,6.655]],["t/226",[0,1.565,7,1.623,19,1.394,20,1.277,28,3.628,29,2.669,30,3.319,32,2.56,40,3.377,55,2.37,71,0.879,73,3.085,76,3.853,88,1.006,93,1.111,117,1.918,140,1.863,160,3.003,171,1.89,185,2.247,273,3.78,275,3.085,279,2.613,287,3.003,297,2.461,317,3.78,381,3.628,384,5.098,420,2.37,458,3.957,483,2.247,608,3.524,636,3.495,822,2.287,838,3.27,947,3.78,958,6.467,960,3.957,972,5.337,990,3.27,1022,4.171,1193,3.031,1199,2.957,1282,4.438,1321,3.957,1387,4.795,1390,4.118,1535,4.795,1536,5.338,1537,4.171,1538,4.795,1539,4.171,1540,5.338,1541,5.338,1542,5.338,1543,4.795,1544,5.338,1545,4.171,1546,4.438,1547,4.438]],["t/228",[0,2.015,5,3.827,6,2.969,7,1.808,19,0.964,20,0.999,71,1.162,140,1.965,180,2.756,211,3.562,315,4.453,420,3.312,490,2.893,594,2.815,822,3.196,978,4.719,1019,3.45,1055,5.058,1340,5.283,1500,4.174,1537,4.399,1547,4.681,1548,5.63,1549,5.63,1550,5.63,1551,5.63,1552,5.058,1553,3.987,1554,5.63,1555,6.604,1556,5.829,1557,7.46,1558,7.46]],["t/230",[0,1.657,7,1.083,12,0.983,14,1.098,30,2.681,54,1.636,57,0.504,71,1.037,72,0.926,92,2.449,93,1.101,94,1.392,96,1.555,169,2.186,188,3.808,258,3.272,272,3.458,273,4.119,276,3.563,282,3.808,633,4.119,949,3.04,1164,4.119,1249,3.953,1286,3.953,1340,6.389,1470,5.225,1537,4.544,1559,5.816,1560,5.816,1561,4.821,1562,5.225,1563,5.225,1564,4.835,1565,2.681,1566,2.681,1567,5.225]],["t/232",[0,1.257,6,2.652,7,1.578,8,0.572,12,0.662,14,1.057,19,0.67,20,0.695,29,1.957,30,2.665,36,3.022,48,1.805,57,0.658,65,2.477,70,1.542,71,0.706,73,2.263,93,1.141,94,0.937,97,1.648,112,1.568,140,1.366,157,2.018,171,1.386,266,2.263,282,2.563,299,2.477,303,1.957,315,3.437,360,1.568,395,2.263,490,2.242,531,2.147,608,1.916,614,2.477,636,2.563,646,2.902,841,4.388,949,5.186,955,2.902,978,2.477,1019,4.212,1210,2.661,1286,3.93,1340,6.62,1537,4.518,1547,4.807,1555,2.902,1561,5.124,1562,3.517,1564,3.255,1565,1.805,1566,3.733,1567,6.176,1568,4.518,1569,5.782,1570,3.915,1571,3.517,1572,3.915,1573,2.902,1574,5.194,1575,2.902,1576,3.915,1577,3.915,1578,3.915,1579,5.782,1580,3.059,1581,3.255,1582,3.915]],["t/234",[6,2.382,8,0.8,14,0.855,32,2.628,57,0.475,93,1.153,94,1.312,97,2.307,99,2.628,110,3.83,112,2.194,115,1.414,117,1.969,134,2.348,161,3.252,169,2.06,210,4.923,212,3.006,276,3.358,279,2.682,297,2.526,314,2.576,327,2.682,381,3.725,382,2.841,525,2.485,531,3.006,605,3.167,607,2.933,633,3.881,697,3.588,949,2.865,1019,3.358,1050,3.358,1061,3.083,1199,2.485,1281,3.881,1320,4.282,1389,3.358,1556,4.282,1561,5.222,1580,4.282,1583,4.147,1584,6.582,1585,3.444,1586,4.923,1587,3.358,1588,4.556,1589,4.923]],["t/236",[8,0.895,12,1.539,14,1.113,53,1.881,56,1.372,57,0.706,61,1.858,67,1.079,70,1.034,72,1.146,81,1.284,85,1.144,86,1.362,87,1.769,88,1.486,93,0.879,94,1.467,97,2.247,99,1.258,115,1.65,126,0.738,134,1.124,161,1.034,180,1.284,185,1.786,206,2.357,235,0.684,254,1.372,255,1.233,276,1.608,297,1.21,299,2.683,300,1.284,306,1.858,330,2.598,351,0.798,360,2.695,373,3.132,432,1.718,484,2.509,531,1.439,654,1.608,730,2.357,812,1.783,895,1.945,1034,4.505,1199,2.282,1345,3.085,1389,1.608,1390,2.414,1395,2.182,1476,2.182,1556,2.05,1561,4.793,1565,2.826,1566,2.826,1583,3.608,1585,3.829,1590,2.624,1591,2.182,1592,5.096,1593,5.595,1594,3.085,1595,4.241,1596,4.241,1597,2.624]],["t/238",[6,2.688,14,1.057,36,2.319,48,1.385,57,0.64,58,2.319,70,1.748,72,0.706,85,3.219,93,0.901,96,2.153,104,2.171,115,0.856,118,1.806,153,3.641,157,1.548,158,2.374,161,3.354,162,2.127,166,1.748,215,2.218,223,3.562,277,2.496,279,2.171,280,2.652,290,3.562,299,4.005,300,2.171,308,2.904,356,3.641,360,2.956,422,2.496,495,1.776,608,3.099,614,2.806,620,3.466,654,2.718,857,3.141,865,3.015,893,3.015,910,4.855,1137,2.374,1193,3.389,1199,2.73,1280,2.806,1390,3.339,1583,3.603,1585,2.085,1598,3.985,1599,6.452,1600,3.688,1601,3.466,1602,4.303,1603,2.904,1604,3.015,1605,3.659]],["t/240",[6,1.144,8,0.852,12,1.292,14,1.076,33,3.706,45,3.562,47,3.201,53,1.728,56,2.073,70,1.562,72,0.631,76,2.122,83,1.404,85,1.729,89,2.292,93,0.712,94,1.658,96,1.06,97,1.669,103,2.175,110,2.073,115,1.474,117,1.425,123,3.414,153,1.794,247,2.175,258,2.231,287,2.231,290,2.231,306,2.808,360,1.588,362,5.192,382,2.962,395,2.292,426,4.542,548,5.409,594,1.982,627,5.192,650,2.508,724,3.098,848,2.94,866,3.821,893,2.695,990,2.429,1026,3.297,1094,2.94,1210,2.695,1286,4.707,1304,3.098,1523,4.852,1565,2.69,1566,2.69,1583,4.02,1585,4.003,1594,3.373,1605,2.292,1606,3.965,1607,3.965,1608,3.965,1609,3.297,1610,5.243,1611,5.758,1612,3.965,1613,3.562,1614,2.808,1615,3.965,1616,3.562,1617,3.965,1618,3.373,1619,5.837]],["t/242",[6,2.542,8,0.799,14,1.099,51,3.255,55,1.615,57,0.475,85,2.387,93,0.668,96,0.973,115,1.056,117,3.165,123,2.552,161,2.157,169,1.367,187,2.576,223,2.047,276,3.354,277,3.703,280,1.967,290,2.047,297,1.677,299,4.967,356,1.645,360,1.457,390,3.024,666,3.584,893,4.976,997,5.471,1193,3.604,1199,3.24,1286,2.472,1390,2.977,1391,3.72,1510,4.66,1561,2.301,1565,2.523,1566,2.523,1583,3.484,1585,3.69,1601,2.842,1602,2.472,1605,3.804,1613,3.268,1614,2.576,1620,3.638,1621,5.474,1622,3.638,1623,7.913,1624,7.913,1625,7.322,1626,3.638,1627,4.277,1628,3.638]],["t/244",[6,2.211,8,0.583,12,0.675,14,1.074,40,2.525,47,2.189,48,1.246,54,1.122,57,0.508,71,0.487,78,2.959,88,0.752,93,0.487,94,0.955,96,1.568,113,1.334,116,3.118,133,1.74,161,1.572,173,2.373,187,4.153,277,2.245,299,2.525,305,4.012,307,1.805,308,2.613,320,2.826,360,3.269,369,2.959,382,1.548,411,2.613,413,5.345,421,3.118,586,3.216,825,3.585,838,3.593,877,2.712,1147,3.318,1193,3.226,1199,2.358,1353,5.581,1371,2.959,1390,1.805,1565,2.703,1566,2.703,1583,3.323,1588,3.318,1602,2.712,1618,2.307,1629,6.884,1630,3.991,1631,3.318,1632,3.585,1633,7.663,1634,3.991,1635,3.991,1636,3.991,1637,3.991,1638,3.991,1639,3.991,1640,3.991,1641,3.991,1642,3.991,1643,5.864,1644,5.864,1645,5.864,1646,7.663,1647,3.991,1648,3.991,1649,3.991,1650,3.991,1651,3.991,1652,3.991,1653,3.991,1654,3.991,1655,3.991,1656,3.991,1657,3.991,1658,3.991,1659,3.991,1660,3.991,1661,3.991,1662,3.991,1663,3.991,1664,3.991,1665,3.991,1666,3.991,1667,3.991]],["t/246",[8,1.139,110,4.079,157,2.723,158,4.176,186,3.465,382,3.026,525,2.646,935,7.009,1583,4.075,1585,3.667]],["t/248",[5,4.56,6,2.228,7,0.897,8,0.703,12,1.135,14,0.942,46,3.429,57,0.724,71,0.588,93,0.942,98,2.028,112,1.929,121,4.56,131,3.047,176,4.111,297,3.093,300,2.358,327,2.358,331,3.284,360,1.929,433,3.878,484,3.154,605,2.784,643,3.764,671,3.154,843,3.274,929,4.005,1017,5.242,1034,4.591,1050,2.951,1198,3.775,1199,3.353,1389,4.111,1390,3.492,1583,3.143,1585,3.154,1586,6.027,1668,4.817,1669,8.35,1670,4.327,1671,4.327,1672,4.817,1673,3.764,1674,6.027,1675,4.327,1676,5.724,1677,4.327,1678,4.817,1679,4.005,1680,5.578,1681,5.578,1682,5.578,1683,5.578,1684,5.578,1685,5.578,1686,5.578]],["t/250",[7,0.758,8,0.594,14,1.002,19,0.697,31,3.017,48,1.858,53,1.642,56,2.127,57,0.61,71,0.497,72,0.648,85,2.594,88,0.767,93,0.726,94,0.974,96,1.591,98,3.832,112,2.382,113,1.361,117,1.462,121,5.257,125,2.352,169,1.53,182,2.344,185,1.714,261,2.494,279,1.992,280,1.462,297,4.195,298,3.18,300,1.992,317,2.882,327,3.786,360,1.63,367,3.895,390,3.384,422,2.29,653,3.184,666,2.665,734,2.766,929,5.846,949,2.127,1034,4.599,1060,3.18,1198,2.29,1199,3.438,1249,4.043,1389,5.266,1390,4.015,1391,2.766,1583,1.657,1585,1.913,1593,7.38,1670,6.316,1675,5.344,1676,3.017,1677,3.656,1687,4.07,1688,5.344,1689,3.656,1690,4.07,1691,3.656,1692,4.07,1693,4.07,1694,4.07,1695,3.656,1696,7.031]],["t/252",[6,2.547,14,1.09,19,1.077,20,1.116,53,1.335,57,0.545,93,0.768,96,2.144,115,1.214,121,4.275,153,2.845,161,2.478,215,3.145,275,3.636,298,4.915,356,2.845,360,2.519,893,4.275,910,4.84,1193,3.376,1199,2.719,1390,3.627,1585,2.957,1599,6.25,1600,5.23,1605,4.634]],["t/254",[8,0.9,12,1.478,14,1.094,19,1.055,20,1.094,34,2.898,53,1.68,57,0.758,72,1.26,86,1.247,88,1.161,93,0.752,94,1.476,97,2.596,112,2.469,115,1.189,263,2.552,484,2.898,692,4.571,695,3.017,764,4.366,1210,4.19,1345,3.563,1565,2.842,1566,2.842,1583,3.559,1585,4.109,1594,3.563,1697,3.665]],["t/256",[7,0.956,8,1.166,9,3.433,14,0.889,19,1.201,20,1.417,33,2.75,41,2.818,51,4.171,53,1.09,54,1.445,57,0.779,62,2.286,71,0.856,72,1.271,88,0.968,133,2.24,140,1.793,141,3.055,142,3.25,143,2.75,161,2.764,173,4.171,183,3.638,186,2.281,258,2.891,260,3.148,272,3.055,293,2.464,300,2.515,328,2.281,381,3.492,386,3.364,399,3.492,484,2.415,566,4.271,594,2.569,663,3.492,695,2.515,727,3.909,1019,3.148,1220,3.25,1561,3.25,1583,3.251,1585,2.415,1599,6.078,1605,2.97,1698,5.138,1699,6.302,1700,4.615,1701,4.615,1702,4.615,1703,5.138,1704,4.615,1705,4.271,1706,3.809,1707,4.271,1708,4.271,1709,3.809,1710,5.138,1711,4.271,1712,4.271,1713,3.809,1714,3.809]],["t/259",[8,0.845,12,1.434,14,1.112,53,1.8,57,0.659,86,1.171,87,1.67,88,1.431,93,0.706,94,1.386,115,1.466,360,2.318,373,2.958,484,2.721,1034,5.043,1199,1.963,1345,3.346,1561,4.807,1565,2.668,1566,2.668,1583,3.093,1585,3.571,1592,6.317,1593,4.813,1594,3.346]],["t/261",[8,0.874,12,1.458,14,1.113,35,3.283,53,1.27,86,1.211,87,1.727,88,1.463,93,0.73,94,1.433,115,1.498,360,2.397,373,3.059,484,2.813,1345,3.459,1565,2.759,1566,2.759,1585,3.65,1592,6.456,1594,3.459,1689,5.377,1715,5.986,1716,5.986,1717,5.986,1718,5.986,1719,5.986]],["t/263",[8,0.9,12,1.042,14,1.094,48,2.471,53,1.308,57,0.534,72,0.981,86,1.247,88,1.161,93,0.752,94,1.476,115,1.189,126,1.734,162,3.795,215,3.082,266,3.563,287,3.469,484,2.898,653,3.299,949,3.222,1198,3.469,1199,2.091,1345,3.563,1389,3.777,1390,4.172,1565,2.842,1566,2.842,1583,3.222,1585,2.898,1594,3.563,1674,5.538,1676,4.571,1720,6.165]],["t/265",[4,1.766,6,2.002,7,0.74,19,1.001,20,1.038,26,2.817,32,1.907,36,2.079,48,1.242,51,3.478,57,0.602,62,1.489,67,1.012,71,0.714,72,0.633,88,0.749,93,1.076,96,1.064,103,3.209,117,2.493,130,1.567,134,1.704,140,2.041,160,2.238,161,1.567,162,1.907,166,1.567,169,3.205,188,2.605,290,2.238,296,1.834,301,2.437,315,1.989,327,1.947,347,5.256,351,1.209,352,2.704,355,3.574,367,2.605,368,3.574,380,2.365,382,3.418,395,3.381,467,3.108,470,2.516,477,2.704,483,2.922,491,2.605,525,1.349,531,2.182,594,1.989,607,2.129,619,3.108,632,3.108,851,3.307,872,3.307,955,2.949,990,2.437,1021,2.516,1061,3.292,1193,1.675,1199,2.891,1219,2.605,1286,2.704,1287,2.129,1353,2.516,1374,2.605,1385,3.108,1401,3.307,1484,2.949,1553,2.817,1583,2.825,1587,4.251,1603,2.605,1614,2.817,1673,3.108,1721,2.704,1722,3.574,1723,3.978,1724,3.574,1725,3.978,1726,3.108,1727,5.256,1728,3.574,1729,6.234,1730,3.574,1731,3.574,1732,3.574,1733,3.574,1734,3.307,1735,3.574,1736,3.574,1737,5.769,1738,3.574,1739,3.574,1740,3.574,1741,3.574,1742,3.574,1743,2.949,1744,4.571,1745,3.307,1746,3.574,1747,3.574,1748,5.256,1749,3.307,1750,3.574,1751,3.574,1752,3.574,1753,3.574,1754,3.574,1755,3.574,1756,3.574,1757,3.108,1758,3.307]],["t/267",[26,4.455,48,1.964,93,0.768,134,2.695,140,2.195,160,3.539,161,2.478,169,3.014,382,2.439,467,4.915,470,3.979,477,4.275,483,3.376,525,2.133,594,3.145,632,4.915,990,3.854,1193,2.649,1199,2.719,1219,4.119,1385,4.915,1401,5.23,1587,4.912,1727,5.651,1728,5.651,1729,7.928,1730,5.651,1731,5.651,1732,5.651,1733,5.651,1734,5.23,1735,5.651,1736,5.651,1737,6.666,1738,5.651,1739,5.651,1740,5.651,1741,5.651,1742,5.651,1743,4.664,1744,4.915,1745,5.23,1746,5.651,1747,5.651]],["t/269",[51,5.029,93,1.032,96,1.832,140,2.39,166,2.699,169,3.449,188,4.485,290,3.854,296,3.157,327,3.353,382,2.656,491,4.485,531,3.756,851,5.694,1061,3.854,1199,3.112,1353,4.333,1673,5.352,1737,5.694,1744,5.352,1748,6.153,1749,5.694,1750,6.153,1751,6.153,1752,6.153,1753,6.153,1754,6.153,1755,6.153,1756,6.153]],["t/272",[8,0.667,12,1.093,14,1.096,19,1.106,20,1.147,53,0.969,57,0.707,67,1.162,72,1.029,81,2.235,83,1.617,87,1.318,88,0.86,93,0.916,97,3.158,112,1.829,115,1.247,126,1.285,134,1.957,169,1.717,170,3.301,235,2.245,351,2.617,352,3.104,360,2.588,373,3.303,382,3.64,383,3.568,395,2.64,525,2.192,574,3.797,653,4.015,697,2.99,843,3.104,1137,2.444,1583,1.859,1618,3.736,1759,4.567,1760,4.567,1761,4.567,1762,3.797,1763,4.46,1764,5.099,1765,4.567,1766,4.567,1767,4.567,1768,4.567,1769,3.797,1770,6.464,1771,4.567]],["t/274",[8,0.968,12,1.121,14,1.099,53,1.759,72,1.319,85,2.89,93,0.809,96,1.773,115,1.279,117,2.382,185,2.791,186,2.943,351,2.015,360,2.654,373,3.387,382,3.214,550,3.831,1583,2.698,1618,3.831,1763,3.941,1764,4.505,1772,4.694,1773,5.955]],["t/276",[0,0.865,6,2.002,7,0.74,8,0.854,12,1.442,14,1.114,53,1.473,57,0.345,67,1.012,71,0.485,72,0.633,85,2.551,93,0.995,94,1.661,96,1.564,115,1.339,153,2.646,161,2.305,215,1.989,275,2.299,298,3.108,330,3.584,356,1.799,360,1.593,382,2.967,420,3.081,490,1.543,893,2.704,910,3.806,1193,2.463,1199,1.984,1345,4.011,1390,2.646,1561,3.701,1565,3.199,1566,3.199,1583,2.825,1594,4.011,1599,4.914,1600,3.307,1602,2.704,1603,2.605,1604,2.704,1605,2.299,1618,4.011,1772,2.817,1774,5.256,1775,2.817,1776,3.978,1777,3.307,1778,2.605,1779,2.704,1780,3.108]],["t/278",[1,1.612,7,1.003,8,0.949,9,2.638,14,0.961,19,0.923,20,1.153,33,1.907,41,1.955,51,3.205,53,1.538,54,1.002,57,0.737,62,2.083,65,2.255,69,1.475,70,1.404,71,0.658,72,1.303,88,0.671,98,1.501,112,2.158,117,1.937,118,1.451,124,1.863,133,1.554,140,1.244,141,2.119,142,2.255,143,1.907,161,2.124,169,1.34,173,3.205,174,3.205,183,2.524,186,1.583,258,2.005,260,2.184,263,1.475,272,2.119,274,3.663,275,3.115,293,1.709,294,2.184,300,1.745,314,3.055,328,1.583,356,1.612,381,2.422,382,1.382,386,3.529,399,2.422,412,3.663,420,3.218,484,1.675,547,3.115,566,2.963,586,1.955,587,2.524,594,1.782,663,2.422,695,1.745,697,2.334,727,3.182,936,2.255,951,2.785,1019,2.184,1033,2.184,1034,2.119,1199,2.204,1220,2.255,1317,2.642,1353,2.255,1389,2.184,1561,2.255,1583,2.95,1585,3.055,1599,6.02,1604,2.422,1605,2.06,1699,4.842,1700,3.202,1701,3.202,1702,3.202,1704,3.202,1705,2.963,1706,2.642,1707,2.963,1708,2.963,1709,2.642,1711,2.963,1712,2.963,1713,2.642,1714,2.642,1721,2.422,1743,2.642,1778,3.529,1779,5.564,1780,2.785,1781,6.47,1782,3.564,1783,5.39,1784,3.564,1785,3.564,1786,3.817,1787,2.963,1788,2.963,1789,3.202,1790,5.404,1791,3.564,1792,3.202,1793,4.603,1794,3.564,1795,3.564,1796,3.564,1797,2.963]],["t/280",[6,1.944,7,1.254,53,1.43,57,0.584,72,1.072,85,2.938,93,0.822,94,1.613,117,3.272,162,3.231,185,2.837,186,3.717,260,4.128,277,3.791,290,4.71,314,3.167,382,3.246,475,5.264,495,2.698,818,4.411,936,4.262,1006,4.977,1052,5.264,1105,4.579,1249,4.579,1679,5.601,1722,6.052,1793,4.771,1798,6.737,1799,6.737,1800,6.737,1801,6.737]],["t/282",[6,0.402,7,1.162,8,1.079,12,0.235,14,1.049,19,0.95,20,0.985,30,1.14,36,0.728,48,1.042,53,1.604,54,0.392,57,0.778,67,0.629,70,0.548,71,0.17,72,1.147,73,0.805,81,1.21,83,0.493,93,0.941,94,0.799,96,0.372,97,1.405,98,1.041,100,2.419,103,0.763,104,0.681,110,0.728,112,1.853,113,0.827,115,0.644,117,2.126,118,0.567,121,1.681,123,1.294,124,3.863,125,0.805,126,1.137,131,0.881,134,2.378,153,0.63,157,0.486,160,1.391,166,0.548,171,0.493,174,1.983,176,2.836,180,1.21,185,1.405,205,1.515,212,0.763,215,0.696,220,0.881,223,1.391,258,1.391,261,1.515,266,0.805,272,0.828,273,0.986,274,4.023,275,2.962,276,0.853,277,0.783,280,0.5,290,2.274,297,2.877,301,2.044,303,1.236,314,4.41,315,1.668,327,1.21,351,0.423,352,0.946,353,1.236,356,0.63,362,0.946,382,2.628,412,3.483,426,1.47,433,2.336,466,1.83,471,0.946,472,1.157,475,1.088,483,1.041,491,0.911,495,0.557,547,0.805,548,0.986,577,1.157,587,0.986,594,1.236,619,1.932,629,0.805,653,0.745,724,1.088,734,0.946,822,1.059,853,1.251,866,0.911,872,1.157,873,1.088,897,0.711,910,0.763,911,0.805,951,1.088,975,0.881,1006,0.828,1020,1.032,1021,0.881,1025,1.251,1034,1.983,1060,1.088,1193,3.409,1198,2.274,1199,3.128,1279,1.032,1280,0.881,1299,1.032,1352,1.032,1365,2.996,1389,4.29,1390,3.711,1447,1.251,1500,1.032,1539,1.088,1553,0.986,1575,1.032,1581,1.157,1583,3.195,1584,1.251,1585,3.067,1587,0.853,1591,1.157,1603,4.086,1611,1.157,1614,0.986,1673,2.607,1676,3.432,1680,3.848,1681,4.92,1682,4.614,1683,4.614,1684,3.36,1685,3.36,1686,3.36,1721,0.946,1777,1.157,1778,3.031,1779,5.022,1780,1.932,1786,3.93,1787,2.773,1788,2.056,1789,3.631,1802,1.392,1803,1.157,1804,1.392,1805,2.473,1806,1.392,1807,1.392,1808,1.392,1809,1.392,1810,1.392,1811,1.392,1812,1.088,1813,1.392,1814,1.392,1815,1.392,1816,3.336,1817,1.392,1818,2.473,1819,1.392,1820,1.392,1821,1.392,1822,1.392,1823,1.392,1824,3.432,1825,3.336,1826,5.55,1827,1.392,1828,1.392,1829,1.392,1830,1.392,1831,1.392,1832,1.251,1833,1.392,1834,2.221,1835,1.392,1836,1.392,1837,1.088,1838,1.032,1839,1.392,1840,1.392]],["t/285",[14,1.023,53,1.47,67,2.167,72,1.102,117,3.313,134,2.967,161,2.729,314,3.256,367,4.535,382,2.686,466,3.799,894,6.222,1721,6.712,1838,5.135,1841,6.927,1842,5.758,1843,6.927,1844,6.222,1845,9.222,1846,5.412]],["t/287",[4,1.675,6,1.088,12,0.638,14,0.943,42,2.796,48,1.178,51,2.242,53,0.8,57,0.725,59,3.01,66,2.796,67,0.96,72,0.6,75,3.344,85,1.644,88,0.71,93,0.46,96,1.504,99,3.823,110,1.971,113,1.261,115,1.085,117,3.004,161,2.216,162,2.697,258,2.122,263,2.328,300,3.649,331,2.753,356,1.706,358,3.388,382,1.462,426,2.242,550,4.308,552,2.796,586,2.068,633,2.671,646,2.796,765,2.563,842,5.279,911,2.18,936,2.386,993,2.671,1050,3.445,1061,2.122,1164,2.671,1193,3.521,1280,2.386,1287,2.018,1356,4.675,1358,3.135,1365,5.911,1370,3.135,1374,3.682,1393,4.675,1476,3.135,1500,2.796,1553,2.671,1580,2.947,1616,3.388,1745,3.135,1758,3.135,1769,3.135,1773,5.052,1778,6.599,1842,3.135,1847,7.163,1848,3.771,1849,5.624,1850,4.394,1851,5.624,1852,3.771,1853,3.771,1854,7.454,1855,7.454,1856,3.771,1857,3.771,1858,3.771,1859,3.771,1860,3.771,1861,3.771,1862,3.388,1863,3.771,1864,3.771,1865,3.771,1866,3.771,1867,3.771,1868,2.947,1869,3.388,1870,3.771,1871,5.624,1872,3.771,1873,3.771,1874,3.771,1875,3.771,1876,3.388]],["t/289",[7,1.178,8,0.405,12,1.17,14,0.943,26,1.963,31,2.055,32,2.125,35,1.52,48,1.384,53,0.588,54,1.779,57,0.719,65,1.753,67,0.705,70,1.092,72,0.705,81,2.169,83,1.961,85,2.759,100,1.449,101,2.165,112,2.217,117,3.229,161,1.746,162,2.125,166,1.092,169,2.081,176,1.698,180,1.357,185,1.167,228,3.138,266,1.602,269,1.815,274,3.763,275,3.2,280,0.996,281,1.815,287,1.559,290,1.559,296,1.278,303,1.386,331,2.169,356,1.254,382,2.147,395,1.602,397,3.138,420,1.968,432,2.902,441,1.698,512,3.503,550,2.561,586,3.47,587,1.963,614,3.503,650,1.753,653,1.483,671,1.815,841,1.602,842,5.225,868,2.902,897,1.416,911,1.602,959,2.304,1050,2.715,1052,2.165,1060,2.165,1193,3.659,1199,2.502,1219,2.902,1287,2.372,1299,2.055,1317,4.69,1353,4.376,1365,4.105,1374,2.902,1378,2.49,1390,2.505,1583,1.128,1604,3.012,1721,6.108,1743,2.055,1772,3.138,1777,2.304,1778,6.034,1790,6.44,1838,2.055,1846,2.165,1847,5.683,1862,3.981,1877,2.772,1878,2.772,1879,2.772,1880,3.684,1881,5.537,1882,2.772,1883,2.772,1884,6.918,1885,2.772,1886,2.165,1887,2.772,1888,2.304,1889,4.432,1890,5.537,1891,2.772,1892,2.772,1893,2.49,1894,2.772,1895,4.432,1896,2.304,1897,2.772,1898,2.772,1899,2.772,1900,2.772,1901,2.772,1902,2.772,1903,4.432,1904,4.974,1905,2.772,1906,3.981,1907,2.772,1908,5.537,1909,5.537,1910,4.974,1911,2.49,1912,2.304,1913,2.772,1914,2.772,1915,2.772]],["t/292",[6,1.363,12,0.799,14,1.021,35,2.591,55,2.098,57,0.718,71,0.577,72,0.752,81,2.312,93,0.808,94,1.131,117,2.745,118,1.923,140,1.649,157,1.649,169,1.776,174,2.809,205,2.895,290,2.658,306,3.346,314,3.111,367,3.093,382,1.832,395,2.731,412,3.211,432,3.093,458,3.503,471,4.499,483,2.787,550,4.786,734,3.211,897,2.414,970,2.989,1050,5.073,1193,3.486,1199,3.064,1219,4.334,1287,2.528,1321,3.503,1371,3.503,1374,5.421,1389,4.056,1390,2.137,1484,3.503,1553,3.346,1583,1.923,1585,3.111,1721,3.211,1724,4.244,1749,3.928,1772,4.688,1778,5.421,1779,3.211,1786,3.346,1824,3.503,1837,3.691,1850,6.469,1868,5.172,1869,5.947,1880,5.503,1886,5.172,1916,4.725,1917,3.928,1918,4.244,1919,5.503]],["t/294",[0,0.782,7,1.704,8,0.525,10,3.458,11,1.626,14,0.809,30,1.657,55,1.596,57,0.677,66,2.666,71,0.953,81,1.76,83,2.577,93,1.071,112,1.44,117,2.951,118,1.464,124,4.457,125,2.078,131,2.274,132,1.972,134,2.324,159,2.546,166,1.417,169,2.736,176,4.004,275,4.747,290,2.023,297,1.657,303,1.797,314,3.421,327,1.76,382,2.534,383,2.809,416,2.989,420,1.596,433,2.078,466,3.584,484,1.69,527,1.879,531,2.976,535,2.138,547,3.136,594,1.797,614,3.432,629,2.078,636,2.354,671,2.354,697,2.354,727,1.76,734,2.444,818,2.354,837,2.989,913,2.989,951,2.809,955,2.666,974,2.989,993,2.546,1017,2.809,1021,2.274,1056,2.989,1061,2.023,1105,2.444,1193,1.514,1194,2.989,1199,2.976,1220,2.274,1279,4.845,1307,2.809,1352,2.666,1365,2.666,1374,2.354,1390,3.533,1449,2.989,1462,4.239,1556,2.809,1587,2.203,1603,3.552,1604,2.444,1676,2.666,1680,4.511,1681,4.511,1682,4.511,1683,4.511,1684,4.511,1685,4.511,1686,4.511,1743,2.666,1769,2.989,1786,2.546,1787,4.511,1788,4.511,1920,3.595,1921,3.595,1922,3.595,1923,3.595,1924,3.595,1925,3.595,1926,3.23,1927,3.595,1928,3.595,1929,3.595,1930,3.595,1931,3.23,1932,3.595,1933,3.595]],["t/296",[6,1.834,57,0.551,93,1.082,99,3.87,115,1.226,117,3.46,118,2.587,119,5.709,263,2.631,269,4.161,367,4.161,382,2.464,535,3.779,643,4.966,828,5.284,842,6.606,897,3.248,955,4.712,959,6.709,1049,4.966,1219,5.284,1287,3.401,1370,5.284,1374,5.284,1493,5.709,1575,4.712,1721,4.32,1778,5.284,1790,6.709,1846,4.966,1934,6.356,1935,6.356,1936,6.356,1937,6.356]],["t/298",[0,1.627,8,0.826,11,2.558,12,1.265,14,1.08,16,3.363,17,3.363,35,4.104,55,2.511,57,0.649,93,1.089,94,1.354,96,1.512,115,1.091,117,2.689,162,2.712,205,3.465,215,4.461,300,2.768,382,3.252,483,2.381,629,3.269,710,4.419,910,3.102,936,3.578,1193,2.381,1199,1.918,1321,4.193,1323,4.702,1345,3.269,1390,2.558,1565,2.607,1566,2.607,1594,3.269,1599,5.299,1601,4.419,1602,5.086,1603,3.703,1605,3.269,1618,3.269,1726,4.419,1834,5.081,1938,5.656]],["t/300",[6,1.567,7,1.356,8,0.793,12,1.232,14,1.075,19,0.93,20,0.964,30,2.504,40,3.436,51,3.23,54,2.311,57,0.471,81,2.659,86,1.099,88,1.023,93,0.663,94,1.3,106,4.398,115,1.048,117,2.617,157,1.895,161,2.14,171,2.579,259,1.923,263,2.248,290,3.056,305,4.304,351,1.651,381,4.951,382,3.187,410,3.692,411,4.769,412,3.692,466,2.979,484,2.553,968,4.027,972,4.027,1028,4.516,1210,4.951,1345,3.14,1565,2.504,1566,2.504,1583,3.345,1594,3.14,1618,3.14,1629,4.88,1837,4.244,1931,4.88]],["t/303",[8,0.891,12,1.471,14,1.115,86,1.235,87,1.761,88,1.481,93,0.96,94,1.461,115,1.517,351,1.856,360,2.444,373,3.119,382,3.05,484,2.869,1345,3.528,1565,2.814,1566,2.814,1594,3.528,1618,4.545,1763,3.629,1764,4.149]],["t/305",[8,0.786,12,1.383,14,1.108,53,1.537,57,0.467,62,1.37,68,3.112,86,1.09,87,1.554,88,1.72,93,0.884,94,1.289,115,1.397,174,3.201,303,2.692,351,1.637,360,2.156,373,2.751,382,2.808,484,2.531,550,3.112,695,2.635,1050,3.299,1193,2.267,1199,1.826,1345,3.112,1565,2.482,1566,2.482,1585,2.531,1594,3.112,1618,4.185,1763,3.201,1764,3.66,1772,3.813,1779,3.66,1786,3.813,1793,3.813,1824,3.992,1850,4.207,1868,4.207,1886,4.207,1919,4.476]],["t/307",[0,1.076,7,1.573,8,0.723,12,1.325,14,1.105,16,2.944,17,2.944,35,2.716,53,1.452,57,0.429,86,1.002,87,1.429,88,1.288,93,0.956,94,1.185,96,1.324,115,1.32,117,2.457,153,2.24,162,3.28,215,4.225,351,1.506,360,1.983,373,2.531,380,2.944,382,3.038,710,3.869,727,2.424,844,4.117,845,3.869,874,4.843,949,2.589,1193,2.085,1199,1.679,1356,4.117,1390,2.24,1498,3.507,1565,2.283,1566,2.283,1601,3.869,1602,4.649,1603,3.242,1605,2.862,1618,3.953,1726,3.869,1763,2.944,1764,3.366,1793,3.507,1939,4.952,1940,4.952,1941,4.449]],["t/309",[8,0.698,12,1.3,14,1.105,33,2.558,53,1.632,57,0.414,72,0.761,86,0.967,87,1.379,88,1.257,93,0.814,94,1.144,115,1.483,117,2.398,123,2.981,314,2.246,351,1.453,360,1.914,362,3.248,373,2.442,382,3.517,426,2.842,548,3.385,550,2.762,594,2.389,627,3.248,727,2.339,844,3.973,845,3.734,1050,2.928,1193,2.012,1199,2.263,1389,2.928,1523,3.973,1565,2.203,1566,2.203,1583,2.716,1585,4.262,1610,4.294,1611,5.548,1618,3.857,1763,2.842,1764,3.248,1772,3.385,1779,3.248,1793,3.385,1824,3.543,1850,3.734,1868,3.734,1886,3.734,1919,3.973,1942,4.294,1943,4.78]],["t/311",[7,0.738,8,0.579,10,2.457,12,1.377,14,1.107,53,1.239,56,2.073,57,0.706,71,0.712,72,0.929,92,1.669,93,0.932,94,1.397,115,1.336,117,2.097,153,1.794,161,1.562,162,2.799,166,2.3,169,1.49,174,3.47,180,1.941,182,1.562,190,3.297,193,3.297,274,3.967,281,2.596,282,2.596,314,4.003,330,2.429,351,1.206,360,1.588,373,2.026,382,2.686,494,2.596,498,2.94,531,2.175,547,3.373,608,1.941,973,3.098,1049,3.098,1147,3.297,1199,1.345,1287,2.122,1317,2.94,1353,3.692,1565,2.69,1566,2.69,1583,2.376,1585,1.864,1603,2.596,1618,4.003,1763,2.358,1764,2.695,1774,3.562,1775,2.808,1779,3.967,1780,3.098,1786,4.905,1792,3.562,1793,4.133,1824,2.94,1838,2.94,1904,3.562,1906,3.562,1910,6.222,1911,3.562,1926,3.562,1941,3.562,1942,3.562,1944,3.965,1945,3.965]],["t/313",[6,1.903,8,0.963,12,1.115,51,4.911,57,0.716,93,1.154,115,1.272,182,2.598,273,4.669,277,3.71,279,3.227,287,3.71,314,3.099,404,3.296,525,3.059,624,4.888,838,4.04,911,4.774,1193,2.776,1194,5.481,1199,3.059,1287,4.42,1390,2.982,1391,4.481,1543,5.923,1583,3.671,1627,5.152,1946,6.593,1947,6.593]],["t/315",[8,0.985,12,1.417,14,1.103,19,0.831,20,0.861,34,2.282,35,2.662,48,1.516,51,2.886,53,1.869,57,0.726,72,1.234,86,0.982,88,0.914,93,0.592,94,1.162,97,2.044,112,1.944,115,1.301,263,2.009,279,2.376,314,2.282,360,1.944,366,4.011,373,2.481,484,2.282,525,2.841,692,3.599,764,3.438,765,3.3,838,2.974,911,2.806,1193,2.044,1199,2.288,1210,3.3,1345,2.806,1390,3.507,1391,3.3,1462,3.793,1565,2.238,1566,2.238,1583,3.71,1594,2.806,1605,3.899,1627,3.793,1697,2.886,1948,4.036,1949,5.609]],["t/317",[14,1.047,52,3.093,57,0.697,85,2.269,117,3.344,150,2.353,153,2.353,279,4.743,297,4.716,299,3.291,314,3.779,331,2.547,404,2.601,472,5.882,666,4.632,911,4.089,1198,5.452,1358,4.325,1391,6.133,1688,4.674,1949,5.882,1950,5.203,1951,5.203,1952,5.203,1953,8.04,1954,8.04,1955,5.203,1956,5.203,1957,8.04,1958,5.203,1959,5.203]],["t/319",[12,0.998,14,1.101,71,0.72,92,2.484,93,0.72,94,1.412,115,1.138,161,2.324,187,4.178,275,4.446,279,4.19,280,2.12,282,3.863,297,2.72,314,3.616,360,2.362,495,2.362,525,2.001,765,4.01,911,4.948,1193,2.484,1199,2.001,1390,4.103,1391,4.01,1564,4.905,1565,2.72,1566,2.72,1605,3.41,1949,6.395,1960,7.693,1961,7.693]],["t/322",[8,0.933,14,1.095,57,0.554,117,2.295,123,3.14,279,4.351,314,4.178,893,4.342,911,3.692,1199,2.746,1210,4.342,1390,4.021,1605,3.692,1614,4.524,1623,7.274,1624,7.274,1962,7.274,1963,6.389,1964,7.274,1965,6.389,1966,6.389]],["t/324",[6,2.237,8,1.132,14,1.035,838,5.584,911,4.481,1017,6.058,1193,3.837,1390,4.122]],["t/326",[8,1.091,14,1.101,36,3.906,1340,5.291,1390,4.033,1581,6.212,1964,8.01]],["t/328",[8,1.132,14,1.069,279,3.795,314,3.644,1199,2.629,1967,9.114,1968,7.754,1969,7.754]],["t/330",[8,1.139,14,1.081,279,3.819,314,3.667,1193,3.285,1199,2.646,1627,6.097]],["t/332",[8,0.766,14,1.04,19,0.898,40,3.319,57,0.455,69,2.172,76,4.321,112,3.467,169,1.972,180,2.568,185,2.209,228,3.716,279,4.238,287,2.952,294,3.215,297,3.722,303,2.623,314,3.345,331,2.568,433,3.033,628,5.986,652,4.1,818,5.287,930,3.716,970,3.319,1033,3.215,1034,4.801,1199,3.474,1280,3.319,1393,4.362,1671,7.778,1962,4.714,1970,6.392,1971,5.56,1972,8.075,1973,8.075,1974,5.247,1975,5.247,1976,5.247,1977,5.247,1978,5.247]],["t/334",[]],["t/337",[19,1.166,20,1.209,37,3.081,50,4.824,57,0.591,71,0.831,100,3.561,170,2.447,173,4.05,307,3.081,351,2.071,359,4.46,365,5.663,423,4.46,428,3.081,435,3.025,530,3.937,531,3.736,617,5.663,662,4.824,820,3.937,822,2.918,1174,8.222,1803,5.663,1979,6.812,1980,6.119,1981,9.153,1982,6.812,1983,6.812,1984,5.05,1985,6.812,1986,6.812]],["t/339",[14,0.841,19,1.099,20,1.139,57,0.704,67,1.634,94,1.537,103,3.522,123,3.455,126,1.806,147,4.317,149,6.023,150,2.905,152,3.818,155,4.205,271,4.761,296,2.96,544,4.761,611,3.934,660,3.613,838,4.977,876,4.761,897,3.281,1287,3.437,1846,5.017,1987,6.962,1988,6.422,1989,7.298,1990,7.298,1991,5.017,1992,6.753,1993,5.769,1994,5.769,1995,5.769]],["t/341",[1,3.047,57,0.79,67,1.714,72,1.072,121,4.579,123,3.246,129,4.995,134,3.586,147,3.859,149,4.995,259,2.385,263,2.789,315,3.368,392,4.006,437,5.264,490,2.613,611,5.129,660,4.71,1009,4.995,1175,4.771,1510,5.928,1989,8.182,1996,6.737,1997,8.372,1998,6.737,1999,6.737,2000,6.737]],["t/343",[0,1.433,30,3.039,40,4.171,71,0.805,72,1.049,138,3.811,173,4.911,188,4.317,245,3.528,260,5.06,264,4.669,277,4.647,433,4.774,542,5.614,605,3.811,818,4.317,861,4.04,1069,3.71,1203,6.123,1249,5.614,1497,4.888,1563,5.923,1775,6.695,1912,5.481,1980,5.923,2001,5.923,2002,5.225,2003,5.152,2004,5.923,2005,6.593,2006,6.593]],["t/345",[12,1.069,14,0.833,56,3.305,57,0.548,65,4,67,1.609,72,1.006,93,1.08,94,2.118,126,2.262,131,4,134,2.709,233,5.257,235,1.649,293,3.032,297,2.915,299,5.089,300,3.095,305,2.972,331,3.095,351,1.922,356,2.86,435,2.808,530,3.654,653,3.384,654,3.874,886,5.257,1069,4.526,1203,4.688,1300,4.297,1330,5.68,1775,6.265,1844,5.68,1912,5.257,2007,5.68,2008,5.68,2009,6.323,2010,6.323,2011,6.323,2012,6.323]],["t/347",[2,3.197,8,0.785,29,1.326,32,1.272,33,1.419,41,2.346,52,1.577,53,0.908,57,0.371,58,1.386,67,1.368,69,1.771,71,0.324,72,0.422,76,2.289,78,1.966,83,1.904,85,2.69,86,1.088,88,1.275,93,0.883,96,1.649,97,1.117,98,1.117,99,1.272,100,2.236,104,2.094,113,2.263,114,2.908,118,1.08,126,2.14,134,1.833,140,1.876,150,1.2,157,0.926,161,1.045,170,0.953,171,1.515,174,1.577,176,1.625,180,1.298,205,2.621,211,4.28,215,3.084,235,1.402,239,1.737,243,1.865,245,2.877,247,2.346,255,1.247,264,1.878,280,0.953,281,2.801,290,1.492,297,1.223,302,4.573,305,1.247,319,2.849,327,1.298,353,2.139,359,5.184,362,2.908,374,2.236,377,3.383,386,1.737,392,1.577,413,1.737,423,1.737,435,1.9,438,2.205,440,5.128,466,4.173,485,1.326,497,1.136,512,2.706,525,2.453,530,1.533,535,1.577,536,1.737,586,1.455,605,2.473,608,1.298,618,3.025,624,1.966,626,1.803,627,1.803,630,3.654,645,2.383,653,1.419,663,1.803,734,2.908,815,3.294,818,1.737,820,2.473,879,2.205,895,3.172,897,1.355,917,1.737,990,1.625,1009,1.966,1061,1.492,1094,1.966,1164,1.878,1203,1.966,1300,2.908,1497,1.966,1510,1.878,1539,2.072,1575,3.986,1580,2.072,1583,3.954,1697,1.577,1775,6.192,1832,3.843,2002,5.009,2003,2.072,2004,2.383,2007,2.383,2013,2.383,2014,2.652,2015,2.652,2016,6.766,2017,2.652,2018,2.383,2019,5.377,2020,2.652,2021,1.966,2022,2.652,2023,2.383,2024,5.377,2025,2.652,2026,2.652,2027,2.652,2028,2.652,2029,2.652,2030,2.652,2031,2.652,2032,4.47,2033,2.383,2034,2.383,2035,2.652,2036,2.652,2037,2.652,2038,2.072,2039,2.652,2040,2.652,2041,2.652,2042,2.072,2043,2.652,2044,2.383,2045,2.652,2046,4.278,2047,2.652,2048,3.843,2049,2.072,2050,2.383]],["t/349",[0,1.213,2,4.409,4,2.477,6,2.561,7,1.039,30,2.572,48,3.074,57,0.722,71,0.681,93,1.128,94,1.335,110,4.354,113,1.866,126,1.569,131,3.529,140,1.947,169,2.097,173,3.317,177,3.792,188,3.653,223,3.139,235,1.455,245,2.986,260,3.418,300,3.629,360,2.234,380,3.317,428,2.524,531,3.06,547,4.286,604,3.529,607,3.968,795,5.012,822,3.177,861,3.418,1019,3.418,1049,4.359,1069,3.139,1193,2.349,1199,1.892,1249,3.792,1352,4.136,1775,3.951,1896,4.638,2032,4.638,2051,6.285,2052,5.012,2053,5.012,2054,4.638,2055,5.579]],["t/351",[0,1.775,71,0.996,660,5.284,2056,9.391]],["t/355",[118,3.196,126,2.209,147,4.232,1987,6.135,2057,7.214,2058,7.054,2059,7.853,2060,7.853,2061,7.853]],["t/357",[57,0.694,67,2.037,71,0.977,113,2.677,186,3.555,270,6.655,458,5.935,2062,8.005,2063,7.191]],["t/360",[14,0.916,36,3.305,57,0.767,67,1.609,71,0.982,97,2.662,118,3.274,123,2.452,124,3.305,151,4.14,152,4.783,177,4.297,182,2.491,307,2.86,501,4.297,692,4.688,877,4.297,897,3.231,975,4,1486,5.257,1535,5.68,1697,3.759,2057,6.559,2064,6.323,2065,6.323,2066,5.68,2067,6.323,2068,5.257,2069,7.226,2070,8.044,2071,6.323,2072,6.323,2073,6.323,2074,6.323,2075,5.68,2076,6.323,2077,5.68,2078,6.323,2079,6.323]],["t/362",[2,3.005,20,1.512,57,0.687,69,2.871,71,0.966,113,1.69,118,4.022,147,3.197,149,5.142,152,4.124,177,4.714,178,6.231,180,2.474,245,2.704,258,2.843,279,2.474,307,3.137,353,2.526,525,1.714,626,3.435,765,3.435,830,3.579,869,2.642,887,3.579,984,2.843,995,4.201,1020,3.747,1023,3.197,1249,3.435,1381,5.142,1486,4.201,1538,4.54,1568,3.949,1697,4.124,1987,6.187,2057,7.135,2058,4.54,2063,4.54,2068,4.201,2075,4.54,2080,5.054,2081,6.936,2082,5.054,2083,6.936,2084,6.936,2085,6.231,2086,6.936,2087,7.919,2088,5.054,2089,5.054,2090,5.054,2091,6.936,2092,5.054,2093,5.054,2094,5.054,2095,5.054,2096,5.054]],["t/364",[13,4.453,53,1.635,57,0.787,113,2.576,123,3.521,147,3.552,525,2.613,605,4.453,1381,5.713,2057,5.713,2068,6.406,2097,6.922,2098,7.705]],["t/366",[8,1.161,40,5.031,62,2.024,72,1.266,86,1.609,103,4.362,115,1.534,157,2.775,608,3.893,861,4.873]],["t/368",[0,0.508,2,1.389,8,0.835,9,1.888,12,0.395,14,1.01,19,1.234,20,1.496,33,1.25,37,2.863,41,1.281,47,1.281,50,1.654,53,0.819,57,0.744,59,2.064,67,1.734,70,1.52,71,0.471,72,0.91,76,1.25,80,1.588,83,1.365,86,0.78,94,1.369,96,0.625,97,0.983,100,1.221,107,1.472,108,1.327,112,0.935,113,2.116,123,3.03,124,1.221,126,1.085,130,1.941,133,4.316,134,3.088,135,1.654,138,4.356,139,3.834,140,2.208,141,3.4,142,4.004,143,2.064,147,1.077,152,2.293,153,2.228,157,1.346,173,1.389,180,1.143,185,1.624,212,1.281,235,1.285,245,1.25,261,1.431,318,2.44,328,3.026,329,1.654,331,1.143,351,0.71,374,1.221,383,1.825,399,2.621,420,1.037,427,4.033,430,1.431,435,1.037,448,2.098,457,1.942,470,1.478,497,1.001,514,2.525,525,1.308,534,1.35,547,2.229,575,3.886,576,1.825,589,2.098,593,2.525,604,1.478,605,1.35,608,1.143,611,2.363,618,3.834,630,2.621,654,1.431,848,1.732,874,1.654,876,1.732,949,1.221,969,1.825,975,1.478,980,2.929,984,2.17,985,3.744,988,2.098,995,1.942,1000,3.206,1006,1.389,1101,2.098,1102,2.098,1103,2.098,1187,2.621,1212,2.098,1213,2.098,1214,3.013,1220,1.478,1225,3.465,1300,1.588,1310,1.825,1349,3.206,1381,1.732,1509,1.942,1575,1.732,1587,1.431,1706,1.732,1713,2.859,1714,3.652,1948,1.942,1984,1.732,2042,1.825,2097,2.098,2099,2.336,2100,2.336,2101,2.336,2102,2.336,2103,2.336,2104,2.336,2105,2.336,2106,2.336,2107,3.465,2108,2.336,2109,2.336,2110,2.336,2111,1.942,2112,3.206,2113,3.206,2114,1.942,2115,2.336,2116,2.098,2117,3.857,2118,2.098,2119,2.336,2120,2.336,2121,2.336,2122,4.926,2123,2.336,2124,2.336,2125,2.336,2126,2.098,2127,2.336,2128,2.336,2129,2.336,2130,2.336,2131,2.336,2132,2.336,2133,3.857,2134,2.336,2135,3.857,2136,2.336,2137,2.336,2138,3.857,2139,2.336,2140,2.336,2141,2.336]],["t/370",[0,0.961,8,0.922,9,2.163,12,1.246,14,0.458,19,1.376,20,1.615,33,2.365,41,2.424,57,0.383,62,1.125,71,0.539,83,1.565,86,0.894,94,1.058,103,2.424,123,2.449,133,4.131,134,1.893,135,6.887,138,3.65,139,4.145,140,1.542,141,2.628,142,4.661,143,2.365,144,3.971,145,5.673,150,1.999,151,2.894,152,3.754,153,1.999,157,2.203,169,1.661,185,1.861,212,2.424,235,1.153,258,2.487,287,2.487,307,1.999,328,2.804,329,3.13,399,3.004,427,2.365,514,2.894,608,2.163,628,3.277,727,2.163,866,2.894,980,2.628,985,2.894,1000,5.25,1220,2.796,1310,4.934,1587,2.708,1706,3.277,1709,4.682,1713,3.277,1714,5.462,1757,3.453,1984,3.277,2111,3.675,2112,3.675,2113,3.675,2114,3.675,2116,6.618,2118,6.618,2126,3.971,2142,4.472,2143,3.675,2144,4.42,2145,4.42,2146,4.42,2147,5.673,2148,5.673,2149,6.315,2150,4.42,2151,4.42,2152,4.42,2153,3.971,2154,3.971]],["t/372",[19,1.37,20,1.42,34,3.763,72,1.274,123,3.104,147,3.69,157,2.793,2155,8.005,2156,8.005]],["t/374",[0,1.332,8,0.619,9,2.074,12,1.036,14,1.07,19,0.725,20,0.752,47,2.324,55,1.882,57,0.624,62,1.078,67,1.078,71,0.517,80,2.88,86,0.857,93,0.748,94,1.014,103,2.324,106,2.268,107,1.618,108,1.458,115,1.182,123,3.057,147,2.824,149,6.2,150,2.771,152,2.52,157,1.479,166,1.67,169,1.593,195,3.001,203,5.504,233,5.093,235,1.598,236,3.311,237,3.279,238,3.311,247,3.36,271,3.142,279,2.074,296,1.953,328,2.72,329,3.001,330,3.753,351,1.863,428,2.771,525,1.437,544,3.142,604,2.681,611,2.596,654,2.596,727,2.074,838,2.596,949,3.202,970,2.681,1026,3.523,1134,3.523,1164,3.001,1287,2.268,1585,1.992,1604,2.88,1697,4.687,1709,3.142,1984,3.142,1987,6.159,1990,3.807,1992,5.093,1993,3.807,1994,3.807,1995,3.807,2147,3.807,2148,3.807,2157,4.238,2158,7.883,2159,6.126,2160,3.807,2161,4.238,2162,4.238,2163,4.238,2164,4.787,2165,4.238,2166,4.238,2167,4.238,2168,4.238,2169,4.238,2170,4.238,2171,4.238]],["t/376",[4,3.4,35,4.2,55,3.4,71,0.935,113,2.56,147,3.53,157,2.672,169,2.878,307,3.464,1007,6.879,1288,6.366,1697,4.553,2057,6.707,2172,7.658,2173,7.658]],["t/378",[30,3.343,57,0.759,71,1.069,83,2.568,113,2.425,140,2.531,171,2.568,182,2.857,259,2.568,264,5.136,433,4.192,490,2.812,660,4.08,815,4.443,861,5.366,1006,5.207,1609,6.029,2001,6.515,2142,5.136,2174,7.252,2175,6.515]],["t/380",[4,3.088,6,2.007,7,0.945,47,2.783,48,2.478,53,1.077,57,0.44,71,0.849,74,4.923,77,2.213,83,1.797,93,0.619,98,2.136,113,2.654,118,2.066,123,1.968,126,1.427,127,3.109,140,2.427,160,2.855,239,3.322,243,2.213,300,2.484,319,2.136,328,2.253,351,2.596,352,3.449,377,2.783,404,2.537,423,3.322,427,3.722,428,2.295,435,3.791,439,3.322,464,4.219,466,3.815,467,3.965,490,1.968,497,2.98,525,1.721,630,3.449,636,4.554,660,2.855,830,3.593,832,3.965,917,3.322,963,3.322,1069,2.855,1198,5.033,1320,3.965,1451,4.219,1457,4.559,1691,4.559,1888,4.219,2033,4.559,2176,5.074,2177,5.074,2178,5.074,2179,5.074,2180,5.074,2181,5.074,2182,5.074,2183,5.074,2184,3.965,2185,3.762,2186,5.074,2187,4.559,2188,4.559,2189,5.074]],["t/383",[6,0.967,8,0.751,13,2.973,14,1.096,47,1.838,48,1.606,52,1.993,57,0.543,67,0.853,71,0.857,74,3.869,85,1.461,86,0.678,88,1.426,93,0.857,98,2.165,112,1.342,113,1.121,115,1.461,118,1.364,124,1.752,126,1.76,148,5.264,158,1.793,166,2.026,211,3.959,212,1.838,243,2.729,259,2.485,297,2.371,324,2.618,328,1.488,348,4.057,359,3.367,360,1.342,373,1.712,420,2.284,422,1.886,427,2.752,433,2.973,490,2.722,525,2.122,527,1.752,586,1.838,660,1.886,697,4.098,815,3.834,830,2.373,926,2.485,1069,4.682,1198,3.95,1507,3.011,1510,2.373,1583,2.093,1697,1.993,2003,2.618,2008,4.62,2013,3.011,2051,2.373,2153,3.011,2188,3.011,2190,2.373,2191,3.351,2192,5.143,2193,3.351,2194,5.143,2195,3.351,2196,5.143,2197,4.254,2198,3.351,2199,3.351,2200,3.351,2201,3.351,2202,3.351,2203,5.836,2204,6.258,2205,5.203,2206,3.351,2207,3.351,2208,3.351,2209,3.351,2210,3.351,2211,3.351,2212,3.351,2213,3.351,2214,3.351,2215,3.351,2216,5.622,2217,2.278,2218,3.351]],["t/385",[12,0.862,14,1.067,49,2.008,53,1.081,56,2.663,57,0.442,71,0.971,74,2.604,77,2.222,83,2.47,88,1.687,96,1.865,113,1.704,115,1.346,126,1.962,130,2.008,148,3.223,153,2.305,175,3.122,180,2.494,215,2.547,259,1.804,272,3.03,296,2.349,319,2.145,321,4.577,348,4.597,351,1.549,352,3.463,359,4.567,439,3.336,470,4.412,490,1.976,525,1.728,527,2.663,629,2.945,1198,2.867,2002,5.031,2032,4.236,2038,3.981,2054,4.236,2190,3.608,2197,3.463,2203,6.612,2219,4.741,2220,5.095,2221,5.095,2222,5.632,2223,5.095,2224,6.975,2225,3.981,2226,5.095,2227,5.095,2228,6.975,2229,5.095,2230,5.095,2231,5.095,2232,5.095,2233,5.095]],["t/387",[12,0.673,14,1.107,53,1.624,58,2.079,62,1.489,71,0.847,83,1.408,88,1.441,92,1.675,93,0.485,94,0.952,113,1.33,115,1.476,126,1.119,148,2.516,150,1.799,171,1.408,185,2.463,212,2.182,217,3.307,243,1.735,259,1.408,294,4.995,324,3.108,348,2.299,412,2.704,420,2.598,470,2.516,490,2.269,605,2.299,630,2.704,810,4.337,903,3.307,912,7.088,949,2.079,1050,2.437,1697,3.478,1812,3.108,2002,2.516,2021,4.337,2190,2.817,2203,3.307,2205,6.778,2216,6.234,2217,3.976,2219,5.541,2234,3.978,2235,3.978,2236,5.85,2237,3.978,2238,3.978,2239,3.978,2240,3.978,2241,5.85,2242,3.978,2243,5.256,2244,5.85,2245,3.978,2246,3.978,2247,3.978,2248,3.978,2249,3.978,2250,3.978,2251,3.978,2252,3.978,2253,5.85,2254,3.574,2255,3.108,2256,3.978,2257,3.978,2258,3.978]],["t/389",[0,1.064,13,2.828,14,1.092,48,2.431,52,2.909,53,1.039,57,0.588,71,0.597,93,0.95,94,1.171,148,3.095,223,3.817,259,1.732,348,4.5,351,2.062,466,4.27,494,3.204,607,2.619,735,3.628,829,3.823,848,3.628,1069,3.817,1137,3.63,1193,2.06,1198,3.817,1199,1.659,1602,3.326,1697,2.909,1842,4.068,2002,3.095,2051,5.513,2054,4.068,2185,3.628,2197,3.326,2205,5.639,2217,3.326,2219,3.326,2222,3.465,2225,3.823,2259,6.094,2260,6.783,2261,3.628,2262,6.783,2263,6.783,2264,4.396,2265,6.783,2266,4.396,2267,4.893,2268,4.893,2269,6.783,2270,6.783,2271,6.783,2272,6.783,2273,4.893,2274,4.893,2275,4.893]],["t/391",[14,1.108,53,1.319,74,2.209,85,1.172,93,0.528,96,1.662,97,1.82,104,2.655,111,1.646,114,3.686,123,1.042,126,0.756,135,5.153,148,3.431,180,1.315,182,1.059,215,1.343,235,1.898,243,3.173,245,2.313,247,2.975,297,3.354,302,5.395,303,1.343,324,6.585,327,2.655,348,3.937,351,0.817,359,2.83,374,2.26,377,2.975,420,1.193,447,2.234,464,2.234,466,4.363,480,2.234,490,2.641,525,1.466,586,1.474,630,1.826,735,1.992,815,3.808,838,3.323,866,1.759,868,1.759,947,1.903,1198,2.432,1462,3.378,1510,3.061,1583,2.53,1697,2.57,1812,4.856,2002,3.431,2018,4.872,2021,4.021,2023,2.414,2034,2.414,2044,2.414,2049,4.238,2164,3.378,2187,2.414,2197,3.686,2217,4.629,2219,4.224,2222,3.841,2255,3.378,2259,2.414,2261,4.021,2276,2.687,2277,2.687,2278,2.687,2279,2.687,2280,2.687,2281,2.687,2282,5.424,2283,4.323,2284,3.594,2285,4.323,2286,2.687,2287,4.323,2288,2.687,2289,2.687,2290,2.687,2291,2.687,2292,2.687,2293,2.687,2294,2.687,2295,2.687,2296,2.687,2297,4.323,2298,4.323,2299,3.594,2300,2.687,2301,2.687,2302,2.687,2303,2.414,2304,2.234,2305,2.234,2306,2.234]],["t/393",[0,0.958,4,1.957,5,1.871,6,2.589,7,1.283,10,1.159,11,1.245,13,1.591,14,1.071,19,0.471,20,0.488,28,1.871,29,1.376,30,1.269,33,1.473,46,1.407,47,3.023,48,2.506,49,1.737,52,1.637,53,0.584,56,1.439,57,0.478,58,2.304,71,0.943,73,1.591,74,4.433,76,1.473,80,1.871,83,0.975,93,0.769,98,1.159,100,1.439,104,2.157,113,1.843,135,3.121,140,2.199,148,1.741,157,0.961,169,1.035,171,1.561,175,1.687,223,1.549,243,1.2,245,1.473,266,1.591,296,1.269,302,2.041,327,1.347,348,2.548,360,1.102,377,2.417,422,1.549,436,2.473,439,1.802,466,4.237,483,2.653,490,1.068,494,2.886,586,1.51,607,1.473,644,2.041,646,2.041,650,1.741,666,1.802,735,2.041,800,2.417,815,3.861,822,1.888,830,6.143,831,2.473,832,4.307,868,1.802,910,3.023,974,2.289,978,1.741,980,3.747,993,1.949,997,3.665,1009,2.041,1198,1.549,1203,3.268,1219,1.802,1283,2.473,1286,1.871,1451,2.289,1491,2.473,1552,4.952,1553,3.121,1555,2.041,1589,2.473,1917,2.289,1948,2.289,2002,1.741,2003,2.151,2021,2.041,2049,2.151,2051,3.121,2164,2.151,2185,2.041,2197,1.871,2217,4.686,2219,3.747,2222,4.463,2225,2.151,2255,2.151,2261,2.041,2284,2.289,2299,3.665,2304,2.289,2305,2.289,2306,2.289,2307,2.753,2308,2.753,2309,2.753,2310,2.753,2311,3.96,2312,4.408,2313,4.408,2314,4.952,2315,2.473,2316,2.753,2317,2.753,2318,4.408,2319,4.408,2320,4.408,2321,2.753,2322,2.473,2323,2.473,2324,2.753,2325,2.753,2326,2.753,2327,2.753,2328,2.753,2329,2.753,2330,2.753,2331,2.753,2332,2.753,2333,5.513,2334,2.753,2335,2.753,2336,2.753]],["t/396",[4,2.013,6,2.156,7,0.844,14,1.1,32,2.174,48,2.68,53,0.962,67,1.636,71,0.785,73,2.62,78,3.361,94,1.085,96,1.212,98,1.909,113,2.15,135,4.553,140,1.582,148,2.868,150,2.051,182,1.786,186,2.013,243,1.977,245,2.426,272,2.696,299,2.868,301,2.778,302,3.361,327,3.657,348,3.716,360,1.815,377,3.526,466,3.526,490,1.758,815,3.939,862,3.769,947,3.21,1137,2.426,1497,3.361,1546,3.769,2002,2.868,2021,3.361,2038,5.024,2049,3.542,2051,3.21,2164,3.542,2184,3.542,2185,3.361,2190,3.21,2197,3.081,2217,4.37,2219,3.081,2222,3.21,2225,3.542,2255,3.542,2261,3.361,2284,3.769,2299,5.345,2303,4.073,2304,3.769,2305,3.769,2306,5.345,2322,4.073,2323,4.073,2337,6.43,2338,6.43,2339,4.534,2340,4.073,2341,4.534,2342,4.534,2343,4.534,2344,4.534]],["t/398",[0,1.283,6,2.471,7,1.764,10,1.695,11,1.821,14,1.022,30,1.135,34,1.157,35,2.208,36,1.287,37,1.113,48,2.487,52,3.51,53,1.084,57,0.606,58,3.085,67,0.626,71,1.094,72,0.392,73,2.327,74,1.258,76,1.317,79,1.825,82,2.985,86,0.498,88,0.464,93,0.794,98,1.695,99,1.18,104,1.971,113,1.974,115,0.475,128,2.047,132,2.208,140,2.574,148,3.232,157,1.783,171,0.872,174,1.464,177,1.673,186,1.093,211,2.547,245,1.317,260,1.508,266,1.423,287,1.385,303,1.231,315,2.554,348,1.423,356,2.67,366,1.464,384,2.851,386,1.612,422,1.385,423,1.612,430,2.467,435,1.093,438,4.907,439,4.262,466,3.237,468,2.047,470,1.557,483,2.151,490,2.524,491,1.612,494,1.612,495,0.986,525,0.835,593,1.612,603,1.743,629,1.423,635,2.211,644,1.825,646,2.985,662,4.18,671,1.612,711,1.923,727,1.971,797,1.743,800,2.208,815,3.988,822,1.055,830,3.618,841,2.327,862,2.047,866,1.612,868,1.612,897,1.258,924,1.923,960,2.985,978,5.183,980,3.038,1019,3.13,1021,1.557,1211,2.211,1220,1.557,1280,1.557,1282,2.047,1323,2.047,1340,1.743,1352,1.825,1374,1.612,1475,4.59,1539,1.923,1555,4.826,1568,1.923,1598,2.211,1614,1.743,1679,2.047,1763,2.394,1880,3.348,1917,2.047,2002,3.734,2038,3.146,2051,4.18,2184,3.146,2185,1.825,2190,1.743,2197,3.472,2217,2.737,2219,2.737,2222,2.851,2254,4.59,2261,1.825,2264,2.211,2311,3.617,2314,2.211,2315,2.211,2340,2.211,2345,2.462,2346,4.027,2347,2.462,2348,2.462,2349,2.462,2350,2.462,2351,2.462,2352,2.462,2353,2.462,2354,2.462,2355,2.462,2356,2.462,2357,2.462,2358,2.462,2359,4.027,2360,2.462,2361,4.027,2362,4.027,2363,5.109,2364,2.462,2365,2.462,2366,2.462,2367,2.462,2368,2.211]],["t/402",[4,2.733,8,0.476,11,1.476,12,1.041,14,0.775,19,1.554,20,1.611,22,2.712,29,1.631,30,1.504,57,0.534,58,1.705,67,0.83,70,2.425,71,0.845,72,0.802,83,1.155,93,0.398,104,3.661,106,2.696,107,1.245,108,1.122,123,1.954,125,2.912,140,1.758,157,1.758,170,2.487,171,1.155,180,2.466,235,1.805,245,2.696,248,4.188,272,1.94,303,1.631,305,4.001,307,3.131,308,2.136,327,2.466,328,2.733,329,2.31,331,1.597,351,1.871,353,1.631,362,2.217,374,3.217,377,3.375,392,2.995,404,1.631,410,3.424,411,4.532,413,2.136,415,2.419,421,2.549,423,4.898,427,2.696,428,1.476,430,4.844,435,2.237,490,1.265,497,1.398,512,2.064,514,2.136,618,2.835,628,2.419,653,1.746,669,2.136,736,2.549,861,1.999,980,3.659,985,3.299,1006,1.94,1012,2.31,1019,3.771,1023,2.064,1069,1.836,1075,2.064,1121,2.712,1137,1.746,1138,2.31,1175,3.568,1239,3.936,1287,1.746,1409,2.712,1498,3.568,1545,2.549,1632,4.526,1763,2.995,1803,2.712,1888,2.712,1971,3.936,2143,4.188,2369,5.038,2370,3.263,2371,5.038,2372,5.038,2373,6.154,2374,5.038,2375,5.038,2376,5.038,2377,5.038,2378,5.038,2379,5.038,2380,3.263,2381,2.931,2382,2.931,2383,2.931,2384,3.263,2385,3.263,2386,3.263,2387,3.263,2388,3.263,2389,3.263,2390,3.263,2391,3.263,2392,3.263,2393,3.263,2394,3.263,2395,5.038,2396,3.263]],["t/404",[0,1.382,14,0.658,19,1.381,20,1.432,23,5.709,57,0.7,58,3.322,70,3.18,72,1.011,123,2.464,131,4.02,140,2.218,235,2.105,284,3.322,286,4.501,296,2.93,319,2.676,331,3.111,428,4.011,497,3.457,512,4.02,530,3.673,532,5.709,534,4.664,535,3.779,547,3.673,980,3.779,1069,4.99,1075,4.02,1239,6.929,1287,3.401,1501,5.709,2397,6.356,2398,6.356,2399,6.356,2400,6.356]],["t/406",[0,1.023,19,1.305,20,1.353,29,2.353,32,2.257,33,2.519,37,2.129,41,2.581,57,0.82,67,1.198,75,2.798,89,2.72,113,2.55,134,2.016,140,1.642,153,2.129,157,1.642,180,2.304,247,3.621,266,2.72,296,2.17,319,3.982,377,2.581,419,4.228,426,2.798,428,2.129,485,2.353,490,1.825,497,2.828,512,2.977,525,1.596,534,4.407,535,2.798,546,5.653,550,2.72,552,4.895,636,3.082,717,3.913,723,3.082,774,5.916,841,2.72,843,3.199,865,3.199,869,2.46,918,3.913,969,3.677,972,3.489,973,3.677,984,2.648,1012,3.333,1052,3.677,1061,2.648,1280,2.977,1281,3.333,1324,3.913,1332,3.677,1448,6.802,1452,5.488,1453,5.931,1459,4.228,1460,4.228,1461,6.85,1463,3.913,1498,3.333,1522,4.228,1546,3.913,1568,3.677,1591,3.913,1838,3.489,2042,3.677,2048,4.228,2050,4.228,2052,4.228,2401,6.602,2402,4.228,2403,4.707,2404,4.228]],["t/409",[14,0.919,36,3.322,72,1.284,86,1.633,88,1.197,111,3.894,114,5.485,125,3.673,157,2.218,179,3.894,211,4.02,220,4.02,247,5.281,269,4.161,305,2.987,307,4.22,373,3.248,594,3.177,1324,5.284,1498,4.501,1545,4.966,2382,7.966,2383,7.966,2405,8.868,2406,8.868,2407,6.356,2408,6.356,2409,6.356,2410,6.356]],["t/412",[6,2.056,7,1.327,10,3.931,19,1.483,20,1.264,48,2.225,70,2.808,112,2.854,166,2.808,180,3.488,205,4.366,275,4.119,296,3.995,297,3.285,351,2.167,550,4.119,843,4.844,945,5.047,1199,3.294,1604,4.844,2381,6.402]],["t/414",[4,2.684,19,1.034,20,1.072,40,3.823,54,1.7,57,0.524,70,2.381,71,0.738,93,0.954,106,4.182,110,3.159,113,2.021,123,3.03,166,2.381,169,2.272,263,2.502,275,5.005,300,2.958,305,4.071,413,3.957,433,4.517,466,3.315,481,5.025,604,4.944,608,2.958,671,3.957,691,4.481,801,5.311,802,6.714,815,3.703,840,4.944,897,3.089,945,4.28,973,4.722,1019,3.703,1028,5.025,1041,5.025,1509,5.025,2042,4.722,2411,6.044,2412,6.044,2413,6.044,2414,6.044,2415,6.044]],["t/416",[6,1.882,8,1.198,46,4.192,48,3.03,99,3.128,113,2.181,115,1.872,186,3.643,260,5.027,305,3.066,307,2.951,483,2.747,802,4.62,840,4.127,963,6.486,1012,5.81,1020,4.836,1022,5.097,1199,2.782,1382,5.86,1545,6.41,2190,4.62,2416,6.524,2417,6.524]],["t/418",[30,3.62,46,4.013,72,1.25,106,4.202,113,2.626,157,2.74,305,3.691,380,4.669,410,5.337,812,6.24,861,4.811]],["t/420",[0,0.546,5,5.056,6,0.725,7,1.444,12,1.01,14,0.971,19,1.022,20,1.06,24,2.088,27,1.963,29,2.046,30,1.158,40,2.589,46,2.092,48,1.618,56,2.14,57,0.449,58,2.14,62,0.639,67,0.639,71,0.803,72,0.4,78,4.429,82,1.862,83,1.449,86,1.048,88,0.473,93,0.632,94,1.575,96,1.385,98,3.132,100,1.313,104,2.536,106,3.775,113,1.732,115,0.79,124,1.313,150,1.136,160,1.413,164,1.115,171,0.889,182,2.592,228,2.899,256,4.307,257,1.862,263,1.694,300,1.229,305,3.877,353,1.256,367,1.645,384,1.779,386,1.645,404,1.256,410,3.521,415,1.862,420,1.818,421,1.963,426,1.493,432,1.645,441,1.539,468,2.088,483,1.723,485,1.256,490,2.317,497,1.076,505,4.429,531,1.378,604,2.589,640,2.256,641,1.779,644,3.841,668,1.779,696,2.088,719,1.963,723,1.645,741,4.307,772,4.668,800,3.608,817,2.256,818,2.68,822,2.818,869,1.313,903,4.307,906,2.088,910,3.869,911,1.452,937,2.256,947,2.899,948,1.963,968,1.862,970,2.589,972,1.862,990,1.539,1056,2.088,1061,1.413,1091,3.198,1105,1.707,1189,1.963,1193,1.058,1199,0.852,1279,1.862,1280,1.589,1281,1.779,1287,1.344,1302,1.963,1304,1.963,1307,1.963,1317,1.862,1353,3.779,1371,1.862,1448,6.729,1449,4.967,1463,2.088,1464,2.256,1465,4.654,1469,4.307,1498,1.779,1555,1.862,1573,1.862,1744,1.963,1812,3.198,1837,1.963,1876,2.256,1893,2.256,1970,2.256,2053,2.256,2069,2.256,2077,3.677,2085,5.367,2243,2.256,2266,2.256,2368,2.256,2402,3.677,2418,2.512,2419,2.512,2420,2.512,2421,2.512,2422,2.512,2423,2.512,2424,2.512,2425,2.512,2426,2.512,2427,2.512,2428,2.512,2429,2.512,2430,2.512,2431,2.512,2432,2.512,2433,2.512,2434,2.512,2435,2.512,2436,2.512,2437,2.512,2438,2.512,2439,2.512,2440,2.512,2441,2.512,2442,2.512,2443,2.512,2444,2.512,2445,2.512,2446,2.512,2447,2.512,2448,2.512,2449,2.512,2450,2.512,2451,2.512,2452,2.512,2453,2.512,2454,2.512,2455,4.093,2456,2.512,2457,2.512,2458,2.512,2459,2.256,2460,2.512,2461,2.512,2462,2.512,2463,4.093,2464,2.512]],["t/422",[57,0.648,123,2.897,130,2.944,140,3.111,259,2.645,263,3.093,525,2.534,876,5.54,916,5.291,985,4.892,1155,6.712,1235,6.712,1991,5.838,2465,7.472,2466,7.472,2467,7.472,2468,7.472,2469,7.472,2470,7.472]],["t/424",[19,1.433,20,1.485,69,2.789,86,1.694,88,1.269,123,2.613,140,2.921,147,3.106,150,3.047,259,2.964,274,4.579,420,2.992,441,4.128,490,2.613,930,4.771,1036,5.264,1310,5.264,1734,5.601,2471,6.737,2472,6.737,2473,6.737,2474,6.737,2475,7.52,2476,6.737,2477,6.737,2478,6.737,2479,6.737,2480,6.737,2481,6.737,2482,6.737,2483,6.737,2484,6.737]],["t/426",[13,4.026,19,1.582,20,1.236,34,3.274,54,2.403,86,1.409,123,3.314,140,3.363,150,3.865,490,2.701,525,3.135,694,4.933,809,5.164,916,4.933,1410,6.257,2475,7.677,2485,9.245,2486,6.966,2487,6.966]],["t/428",[19,1.37,20,1.42,32,3.839,67,2.037,140,2.793,392,4.76,861,4.905,1991,6.255,2488,8.005]],["t/430",[7,1.098,9,2.888,10,2.484,16,3.508,19,1.553,20,1.61,32,2.829,37,3.48,49,2.324,57,0.511,69,2.442,70,3.031,76,3.157,77,2.573,86,1.194,93,0.72,123,2.288,132,3.235,133,3.733,134,2.527,138,3.41,139,3.319,152,3.508,166,2.324,279,2.888,320,4.178,323,5.3,328,2.62,329,4.178,422,4.328,427,3.157,495,2.362,514,3.863,575,4.01,650,3.732,654,4.713,694,4.178,727,2.888,822,2.527,868,3.863,911,3.41,980,4.574,1075,4.866,1156,3.863,1189,4.61,1984,4.374,2142,5.448,2143,6.395]],["t/432",[8,0.933,12,1.08,14,0.839,19,1.521,20,1.658,33,3.419,41,3.504,69,2.644,93,0.78,107,2.439,108,2.197,133,2.786,139,4.556,140,2.229,141,3.798,142,4.041,143,3.419,153,2.89,185,2.69,212,4.441,259,2.867,328,2.837,399,4.342,490,2.477,926,4.736,930,4.524,1220,4.041,1302,4.991,1587,3.914,1706,4.736,1713,4.736,1714,4.736,1896,5.311,2111,5.311,2112,5.311,2113,5.311,2114,5.311,2154,5.739,2489,4.524]],["t/434",[0,1.109,1,1.111,7,1.481,10,3.103,11,3.158,12,0.68,14,0.869,19,1.401,20,1.453,32,1.178,34,1.89,37,1.818,41,2.205,49,2.01,50,2.847,52,1.461,54,0.691,55,1.785,57,0.727,62,1.023,67,1.298,69,1.664,71,0.999,72,0.64,74,1.255,77,2.225,80,1.67,81,1.203,86,0.497,88,0.757,92,1.034,93,0.491,94,0.962,98,1.034,112,0.984,124,1.284,130,2.01,132,3.233,133,3.213,139,4.607,143,3.48,147,1.853,150,1.818,152,1.461,157,0.857,158,2.151,162,1.178,164,2.887,166,2.562,169,1.511,179,1.505,182,0.968,186,2.887,198,1.284,211,1.554,235,1.331,237,1.315,243,2.835,254,1.284,259,3.083,260,2.463,272,1.461,279,1.203,280,1.833,282,1.609,284,2.101,293,2.446,303,1.228,307,1.111,315,1.228,318,2.543,319,1.034,326,1.554,328,1.091,351,1.977,353,2.947,374,1.284,386,2.632,396,2.043,404,1.228,420,2.618,435,2.265,470,1.554,471,1.67,477,1.67,484,1.89,490,1.978,495,1.61,497,1.053,525,1.73,529,2.043,530,1.42,533,3.342,535,2.39,536,2.632,537,3.141,539,2.98,594,1.228,723,1.609,727,2.886,822,1.053,864,2.543,867,2.847,869,2.667,910,2.205,917,3.86,927,1.67,930,1.74,949,1.284,984,2.871,1006,1.461,1033,1.505,1034,1.461,1137,2.151,1151,1.92,1154,2.207,1156,4.825,1157,2.207,1158,2.207,1166,2.207,1187,2.732,1199,0.833,1284,2.207,1332,3.141,1490,1.92,1500,2.98,1573,1.821,1574,3.611,1588,2.043,1707,2.043,1708,2.043,1709,1.821,1918,2.207,2066,2.207,2489,4.175,2490,2.457,2491,2.457,2492,2.457,2493,2.457,2494,2.457,2495,2.457,2496,2.457,2497,2.457,2498,2.457,2499,2.457,2500,2.043,2501,2.457,2502,2.457,2503,2.457,2504,2.457,2505,2.457,2506,2.457,2507,2.043,2508,2.043,2509,2.043]],["t/436",[0,0.848,7,0.726,8,0.57,10,1.643,12,0.66,14,1.012,19,0.668,20,0.692,30,1.799,36,2.04,54,1.93,57,0.595,69,2.388,71,1.069,72,0.621,77,1.702,81,1.91,86,0.79,92,1.643,93,0.837,94,1.381,100,2.04,115,0.753,117,2.072,127,2.391,130,2.273,132,2.14,133,3.527,139,5.256,143,4.329,160,2.196,161,1.538,162,1.871,166,1.538,171,1.382,182,1.538,185,1.643,186,3.889,198,2.04,212,2.14,237,2.088,259,2.998,280,2.906,282,2.555,284,2.04,301,2.391,314,1.834,348,2.256,351,1.186,382,3.622,420,3.76,432,2.555,495,1.563,539,2.893,668,2.764,727,1.91,869,2.04,873,3.049,927,2.652,936,2.469,949,2.04,984,2.196,996,3.049,1006,4.08,1021,2.469,1033,2.391,1061,2.196,1151,3.049,1156,2.555,1484,2.893,1565,1.799,1566,1.799,1631,4.796,1762,3.244,1763,3.43,1781,3.244,1797,3.244,2489,5.728,2500,3.244,2507,3.244,2508,3.244,2509,3.244,2510,3.903,2511,3.506,2512,3.506,2513,3.506,2514,3.506,2515,3.506]],["t/438",[14,0.858,57,0.718,71,0.809,117,2.382,127,4.061,133,2.89,139,4.663,143,3.547,160,3.73,162,3.178,171,2.347,182,2.612,185,2.791,186,2.943,212,3.635,259,2.347,280,2.382,314,3.116,382,3.673,420,2.943,495,2.654,668,4.694,873,5.179,936,4.193,996,5.179,1006,3.941,1021,4.193,1061,3.73,1762,5.511,1763,4.927,1781,5.511,2489,4.694,2511,5.955,2512,5.955]],["t/440",[8,0.732,10,2.11,12,0.848,14,1.04,54,1.94,69,2.075,71,1.037,81,2.453,86,1.014,92,2.11,93,0.612,94,1.2,115,0.967,130,1.975,132,2.749,133,3.704,139,5.405,143,4.545,161,1.975,166,1.975,186,4.087,198,2.62,237,2.682,259,3.153,280,3.052,282,3.282,284,2.62,348,2.897,382,2.675,420,3.954,432,3.282,539,3.716,727,2.453,869,2.62,927,3.407,949,2.62,1006,2.98,1033,3.071,1151,3.916,1156,3.282,1565,2.311,1566,2.311,1631,5.734,1797,4.167,2489,6.015,2500,4.167,2507,4.167,2508,4.167,2509,4.167,2513,4.503,2514,4.503,2515,4.503]],["t/442",[0,1.137,2,2.037,4,1.521,7,0.974,8,0.764,9,3.105,10,2.202,14,0.657,16,5.141,19,1.435,20,1.488,32,1.643,36,1.791,37,3.212,57,0.75,58,1.791,67,1.614,69,2.165,71,0.418,72,1.01,77,1.494,88,0.645,99,1.643,103,1.879,118,1.394,130,2.5,133,3.335,134,1.468,138,1.98,139,4.865,140,1.195,143,3.8,150,1.549,158,1.833,164,2.322,169,1.288,170,2.279,179,3.887,186,2.817,212,1.879,235,1.995,245,1.833,254,1.791,255,1.61,258,1.927,259,2.854,279,1.677,280,2.748,293,4.146,315,2.615,331,2.56,351,2.159,366,3.11,377,1.879,404,1.713,420,3.153,486,3.11,487,2.848,488,2.848,489,4.348,490,2.028,491,3.424,492,3.077,493,3.077,494,2.243,495,1.372,497,2.718,498,2.54,499,4.087,512,2.167,513,3.077,514,2.243,522,3.878,529,2.848,530,1.98,533,2.848,539,2.54,571,3.077,572,3.077,573,3.077,574,2.848,575,2.328,576,2.677,577,2.848,578,3.077,579,3.077,580,2.54,581,3.077,582,3.077,583,3.077,584,3.077,586,1.879,663,2.328,822,1.468,869,1.791,1134,2.848,1490,2.677,1573,4.704,1711,2.848,1712,2.848,2489,4.493,2516,3.426,2517,3.426,2518,3.426,2519,3.426,2520,3.426,2521,3.426,2522,3.426,2523,3.426]],["t/444",[0,1.282,6,1.702,7,1.098,13,4.446,19,1.465,20,1.365,29,2.949,32,3.689,37,2.668,47,3.235,48,1.842,49,2.324,67,1.957,70,2.324,71,0.72,72,1.224,75,4.574,77,2.573,86,1.194,94,1.412,103,3.235,123,2.983,133,3.355,134,3.296,138,3.41,139,3.319,150,2.668,152,3.508,157,2.684,183,4.178,259,2.089,305,2.773,317,4.178,319,2.484,366,3.508,369,5.703,427,3.157,536,3.863,537,4.61,580,4.374,829,4.61,984,3.319,985,3.863,1214,4.61,1490,4.61,1573,4.374,1695,5.3,2524,5.9,2525,5.9,2526,5.3,2527,5.9]],["t/446",[0,1.34,4,2.737,7,1.473,8,1.155,19,1.055,20,1.094,32,2.956,34,2.898,48,1.925,57,0.534,67,1.569,71,0.752,72,1.391,86,1.247,94,1.476,104,3.017,105,4.817,124,3.222,130,2.429,133,2.688,147,3.649,157,2.762,158,4.236,169,2.975,172,4.817,173,3.665,181,5.538,205,3.777,239,4.036,261,3.777,269,4.036,287,3.469,301,3.777,381,4.19,382,2.391,433,3.563,437,4.817,969,4.817,1257,6.58,1287,3.299,1484,4.571,1609,5.125,2175,5.538,2528,6.165,2529,6.165,2530,6.165]],["t/448",[0,1.763,6,1.951,7,1.775,9,2.929,10,3.269,11,3.315,13,1.805,15,3.08,16,3.559,17,2.895,18,3.188,19,0.833,20,1.062,25,2.439,35,1.712,39,2.211,47,1.712,48,1.52,49,1.23,55,3.002,57,0.673,62,0.794,71,1.024,72,0.775,74,1.595,75,1.856,77,1.361,81,1.528,93,0.894,110,1.632,111,1.913,112,1.25,117,1.122,127,1.913,130,1.918,132,1.712,133,1.361,140,1.089,141,1.856,147,1.439,150,2.202,151,2.044,155,2.044,160,3.368,166,1.23,169,1.174,170,1.122,171,1.105,174,1.856,175,2.983,176,1.913,239,2.044,241,2.596,249,2.596,266,2.814,273,2.211,277,1.757,305,1.467,307,3.058,314,1.467,315,1.561,351,1.48,361,2.805,382,1.888,384,2.211,392,1.856,397,2.211,407,1.497,422,1.757,426,1.856,427,1.671,428,1.412,430,1.913,434,2.805,435,2.658,440,2.596,454,2.805,483,2.846,484,1.467,512,1.975,525,1.059,534,1.805,592,2.315,604,3.08,605,1.805,607,1.671,618,1.757,622,2.596,629,1.805,642,2.805,652,2.439,662,4.238,685,2.596,715,2.439,716,2.315,727,1.528,798,2.439,799,2.211,801,2.122,802,2.211,803,2.439,804,2.439,805,2.315,806,2.315,807,2.211,808,2.315,809,2.315,810,2.315,811,2.805,812,2.122,813,2.805,814,2.439,820,1.805,822,2.086,841,1.805,897,2.488,917,2.044,927,2.122,970,1.975,985,2.044,1008,2.805,1021,3.08,1037,4.374,1050,1.913,1061,1.757,1069,1.757,1091,2.439,1105,2.122,1156,2.044,1175,2.211,1202,2.596,1207,2.596,1219,2.044,1287,2.606,1300,2.122,1320,2.439,1487,2.805,1489,2.805,1571,2.805,1587,2.983,1705,2.596,1726,2.439,1757,2.439,1758,2.596,1971,2.439,1991,2.439,2142,2.211,2459,2.805,2531,3.122,2532,4.869,2533,3.122,2534,3.122,2535,3.122,2536,3.122,2537,3.122,2538,3.122,2539,3.122,2540,3.122,2541,3.122,2542,3.122]],["t/450",[0,1.897,4,3.201,6,2.08,7,1.342,32,3.457,48,2.251,49,2.841,67,1.835,71,1.19,72,1.494,112,3.494,113,2.918,169,3.28,490,2.796,636,4.721,1971,5.633,2543,7.21]],["t/452",[0,1.778,4,2.881,6,1.873,7,1.522,8,0.947,12,1.383,71,1.207,72,1.301,74,4.179,93,0.998,94,1.553,98,2.732,132,3.559,134,2.78,140,2.264,166,2.557,171,2.298,300,3.176,319,2.732,428,2.935,483,3.958,531,3.559,716,4.811,727,3.176,764,4.595,820,3.751,822,2.78,1091,5.07,1156,4.249,1478,5.829,2544,5.829]],["t/454",[0,2.061,1,3.339,2,4.389,3,6.632,4,3.278,6,2.13,7,1.374,8,1.078,9,3.613,10,3.108,11,3.339,12,1.248,72,1.175,93,0.901,171,2.614,319,3.108,483,3.108,531,4.049,820,4.267,2544,6.632]],["t/456",[150,3.742,157,2.887,1757,6.465,2142,5.859]],["t/458",[147,3.84,157,2.907,861,5.103]],["t/460",[72,1.326,157,2.907,861,5.103]],["t/462",[1,3.047,10,2.837,72,1.332,75,5.415,86,1.363,94,1.613,153,3.047,166,2.654,171,2.385,180,3.298,182,2.654,185,2.837,205,4.128,235,1.757,258,3.791,305,3.167,322,5.601,413,4.411,422,3.791,497,2.886,530,3.894,536,5.481,593,5.963,594,3.368,865,4.579,917,4.411,1497,4.995,2184,5.264,2404,6.052,2526,6.052,2545,6.737,2546,6.737]],["t/464",[30,3.69,72,1.274,82,5.935,104,3.918,105,6.255,106,4.969,259,2.834,374,4.184]],["t/466",[183,5.82,660,4.624,970,5.199,2142,5.82,2160,7.383]],["t/468",[2547,8.444]],["t/471",[19,1.368,20,1.418,30,2.885,47,3.432,52,3.721,56,3.272,57,0.543,72,0.996,76,3.349,88,1.179,104,3.063,117,2.249,126,1.76,133,2.729,141,3.721,142,3.959,263,2.591,271,4.64,458,5.925,490,2.427,495,2.506,576,4.89,593,4.098,653,3.349,838,5.394,874,5.659,910,4.383,912,5.203,970,3.959,975,3.959,993,4.432,1009,4.64,1299,4.64,1587,3.835,1778,5.765,2548,6.259,2549,6.259,2550,6.259,2551,6.259,2552,6.259,2553,6.259,2554,6.259,2555,6.259]],["t/473",[12,1.127,14,0.69,19,1.624,20,1.684,32,3.196,33,3.567,57,0.578,70,2.626,123,3.224,133,4.453,134,3.562,138,5.238,141,3.963,142,4.216,580,4.941,616,6.497,1309,5.987,1371,4.941,1381,6.165,2107,5.987,2556,6.665]],["t/475",[19,1.311,20,1.359,41,4.2,57,0.664,147,3.53,270,6.366,271,6.707,611,4.692,616,7.069,874,5.422,895,5.677,1137,4.098,1992,6.366,2557,7.658]]],"invertedIndex":[["",{"_index":14,"t":{"4":{"position":[[25,1],[36,1],[51,1],[59,1],[68,1],[78,1],[88,1]]},"9":{"position":[[1027,1],[1029,1],[1090,1],[1092,2],[1095,3],[1099,2],[1113,1],[1115,2],[1157,2],[1160,2],[1250,2],[1362,1],[1364,2],[1367,1]]},"13":{"position":[[624,1],[751,3],[984,1],[986,3],[990,1],[992,3],[1291,1],[1320,1],[2544,1],[2546,1],[2596,3],[2608,1],[2774,1],[2776,1],[2778,1],[2951,1],[2992,1],[4057,1],[4118,1],[4216,1],[4248,2],[4319,2],[4340,1],[4389,2],[4403,1],[4405,1],[4502,1],[4652,1],[4654,1],[4656,2],[4670,1],[4672,1],[4736,1],[4795,1],[4797,1],[4799,2],[4814,1],[4816,1],[4937,1],[4973,1],[4975,2],[4978,1],[5161,1],[5196,1],[5198,1],[5200,1],[5202,1]]},"17":{"position":[[522,1],[524,1],[585,1],[696,1],[698,1],[700,1],[958,1],[960,1],[1021,1],[1170,1],[1172,1],[1174,1],[1596,1],[1646,1]]},"21":{"position":[[146,2]]},"23":{"position":[[991,1],[1002,1],[1016,1],[1062,1],[1064,2],[1067,2],[1070,3],[1074,1],[1740,1],[1751,1],[1761,1],[1807,1],[1809,2],[1812,2],[1815,3],[1819,1],[2359,1],[2370,1],[2384,1],[2449,1],[2451,2],[2454,2],[2457,3],[2461,1],[2937,1],[2948,1],[2962,1],[3008,1],[3010,2],[3013,2],[3016,3],[3020,1],[3228,1],[3230,3],[3234,1],[3785,1],[3796,1],[3810,1],[3877,1],[3879,2],[3882,2],[3885,3],[3889,1]]},"25":{"position":[[468,1],[500,6],[507,2],[510,3],[514,1]]},"31":{"position":[[356,1],[369,1],[371,5],[377,2],[391,1],[393,5],[399,2],[414,1],[416,1],[517,2],[520,1],[570,5],[576,2],[579,1],[622,5],[628,2],[631,5],[637,1],[639,1],[821,1],[958,1],[994,1],[996,1],[1174,1],[1356,1],[1391,1],[1393,1],[1554,1],[1701,2],[1866,1]]},"35":{"position":[[248,2],[659,2]]},"37":{"position":[[247,1],[249,1],[308,1],[416,1],[418,1],[420,1],[525,1],[538,1],[540,1],[599,1],[707,2],[726,1],[728,1],[730,1]]},"43":{"position":[[446,1],[448,1],[525,1],[674,1],[676,1],[678,1],[783,1],[796,1],[798,1],[875,1],[1024,2],[1044,1],[1046,1],[1048,1]]},"51":{"position":[[563,1],[647,1],[649,1],[727,1],[829,1],[831,1],[833,1],[938,1],[951,1],[953,1],[1031,1],[1133,2],[1154,1],[1156,1],[1158,1]]},"53":{"position":[[382,1]]},"55":{"position":[[190,1],[192,1],[270,1],[329,1],[331,1],[333,1],[438,1],[451,1],[453,1],[531,1],[590,2],[610,1],[612,1],[614,1]]},"59":{"position":[[269,1],[271,1],[346,1],[458,1],[460,1],[462,1],[567,1],[580,1],[582,1],[657,1],[769,2],[795,1],[797,1],[799,1]]},"66":{"position":[[701,1],[703,1],[765,1],[845,1],[847,1],[849,1],[954,1],[967,1],[969,1],[1031,1],[1111,2],[1132,1],[1134,1],[1136,1]]},"70":{"position":[[127,1],[151,1]]},"73":{"position":[[837,1],[839,1],[892,1],[966,1],[968,1],[970,1],[1075,1],[1088,1],[1090,1],[1143,1],[1217,2],[1237,1],[1239,1],[1241,1]]},"77":{"position":[[23,1],[43,1],[66,2],[87,1],[204,2],[225,1],[368,2],[427,1],[440,1],[442,1],[532,2],[553,1],[579,2],[600,1],[743,2],[802,1],[815,1],[817,1],[907,2],[921,1],[923,1],[999,1],[1073,2],[1087,1],[1113,2],[1174,1],[1176,2],[1179,1],[1255,1],[1289,2],[1420,1],[1422,2],[1425,1],[1501,1],[1586,2],[1679,1],[1681,2],[1684,1],[1757,1],[1849,1],[1851,2],[1854,1],[1927,1],[2020,2],[2145,1],[2147,2],[2150,1],[2189,2],[2284,1],[2377,1],[2379,2],[2382,1],[2425,2],[2520,1],[2645,1],[2647,2],[2650,1],[2731,1],[2816,1],[2818,2],[2821,1],[2900,1],[3037,5],[3043,1],[3045,2],[3048,1],[3135,1],[3156,1],[3158,1],[3160,2],[3174,1],[3176,1],[3226,1],[3289,1],[3291,2],[3294,1],[3344,1],[3407,1],[3409,2],[3412,1],[3462,1],[3525,1],[3527,2],[3530,1],[3577,1],[3682,1],[3684,1],[3686,1],[3688,1]]},"79":{"position":[[24,1],[26,1],[28,2],[163,1],[236,1],[238,2],[241,1],[298,1],[371,1],[373,2],[376,1],[433,1],[517,1],[519,2],[522,1],[545,1],[547,1],[604,1],[696,1],[698,2],[701,1],[758,1],[882,1],[884,2],[887,1],[918,1],[1011,1],[1013,1],[1015,1],[1042,1],[1044,1],[1075,1],[1200,1],[1202,1],[1204,1],[1230,1],[1232,1],[1292,1],[1429,5],[1435,1],[1437,1],[1439,1],[1468,1],[1470,1],[1535,1],[1557,1],[1559,1],[1561,1],[1586,1],[1588,1],[1620,1],[1683,1],[1685,2],[1688,1],[1720,1],[1783,1],[1785,2],[1788,1],[1820,1],[1883,1],[1885,1],[1887,1],[1912,1],[1914,1],[1943,1],[2048,1],[2050,1],[2052,1]]},"83":{"position":[[121,1],[123,1],[125,1],[127,1],[151,1],[153,1],[155,1],[157,1],[200,1],[202,1],[204,1],[206,1],[232,1],[234,1],[236,1],[238,1],[265,1],[267,1],[269,1],[271,1],[296,1],[298,1],[300,1],[302,1],[325,1],[327,1],[329,1],[331,1],[354,1],[356,1],[358,1],[360,1],[385,1],[387,1],[389,1],[391,1],[417,1],[419,1],[421,1],[423,1],[460,1],[462,1],[464,1],[466,1],[496,1],[498,1],[500,1],[502,1],[544,1],[546,1],[548,1],[550,1],[574,1],[576,1],[578,1],[580,1],[605,1],[607,1],[609,1],[611,1],[655,1],[657,1],[659,1],[661,1],[689,1],[691,1],[693,1],[695,1],[718,1],[720,1],[722,1],[724,1],[749,1],[751,1],[753,1],[755,1],[781,1],[783,1],[785,1],[787,1],[830,1],[832,1],[834,1],[836,1],[861,1],[863,1],[865,1],[867,1],[898,1],[900,1],[902,1],[904,1],[926,1],[928,1],[930,1],[932,1],[967,1],[969,1],[971,1],[973,1],[1004,1],[1006,1],[1008,1],[1010,1]]},"90":{"position":[[197,1],[280,1],[282,2],[285,3],[289,2],[292,1],[331,3]]},"92":{"position":[[394,1],[404,1],[406,2],[409,3],[413,2],[427,1],[451,1],[469,2],[535,2],[602,1],[604,1],[606,1]]},"94":{"position":[[679,1],[689,1],[691,2],[694,3],[698,2],[712,1],[714,2],[762,2],[833,1],[835,1]]},"96":{"position":[[319,1],[724,2],[756,2],[834,2],[932,2],[1345,1],[1355,1],[1357,2],[1360,3],[1364,2],[1378,1],[1380,2],[1428,2],[1499,1],[1501,2]]},"98":{"position":[[376,1],[378,1],[442,1],[554,1],[556,1],[558,1],[647,1],[660,1],[662,1],[726,1],[838,1],[840,1],[842,1],[844,1]]},"102":{"position":[[402,4],[787,1]]},"104":{"position":[[153,1],[155,1],[205,3],[217,1],[350,1],[352,1],[354,1],[443,1],[456,1],[458,1],[508,3],[520,1],[652,2],[672,1],[674,1],[676,1]]},"106":{"position":[[291,1],[293,1],[323,1],[357,2],[371,1],[410,1],[412,1],[414,1]]},"108":{"position":[[1308,3],[1404,3],[2289,1],[2291,1],[2341,1],[2343,2],[2468,2],[2471,1],[2473,1],[2821,1],[2823,1],[2873,1],[2875,2],[3055,2],[3058,1],[3060,1],[3480,1],[3482,1],[3532,1],[3534,5],[3540,2],[3554,1],[3575,1],[3577,1],[3579,1]]},"110":{"position":[[664,1],[666,1],[694,1],[718,3],[744,3],[767,3],[790,2],[793,1],[795,1],[797,1],[894,1],[907,1],[909,1],[937,1],[961,3],[987,3],[1010,3],[1033,2],[1036,2],[1060,1],[1062,1],[1064,1]]},"112":{"position":[[1106,1],[1116,1],[1118,2],[1121,3],[1125,2],[1139,1],[1141,2],[1189,2],[1260,1],[1262,2],[1814,1],[1816,1],[1859,1],[1937,1],[1939,1],[1941,1]]},"114":{"position":[[126,1],[128,1],[171,1],[209,1],[211,1],[213,1],[310,1],[323,1],[325,1],[368,1],[406,2],[427,1],[429,1],[431,1]]},"116":{"position":[[142,1],[153,1]]},"118":{"position":[[135,2],[184,2]]},"120":{"position":[[328,1],[330,1],[376,1],[441,1],[443,1],[445,1],[550,1],[563,1],[565,1],[611,1],[676,2],[696,1],[698,1],[700,1]]},"122":{"position":[[121,1],[139,1],[152,1],[225,1],[380,1],[2148,1],[2150,1],[2201,3],[2213,1],[2311,2],[2616,2],[2630,1],[2680,1],[2682,1],[2684,1],[2773,1],[2786,1],[2788,1],[2839,3],[2851,1],[2963,1],[2991,2],[3008,1],[3024,2],[3043,1],[3055,2],[3074,1],[3090,2],[3111,1],[3125,2],[3146,1],[3159,2],[3195,1],[3211,2],[3236,2],[3250,1],[3300,2],[3322,1],[3324,1],[3326,1]]},"124":{"position":[[139,1],[151,1]]},"126":{"position":[[133,2],[182,2]]},"128":{"position":[[253,1],[255,1],[299,1],[388,1],[390,1],[392,1],[497,1],[510,1],[512,1],[556,1],[645,2],[663,1],[665,1],[667,1]]},"130":{"position":[[666,1],[668,1],[727,1],[835,1],[837,1],[839,1],[944,1],[957,1],[959,1],[1018,1],[1126,2],[1145,1],[1147,1],[1149,1]]},"136":{"position":[[333,1],[335,1],[378,1],[397,1],[399,1],[401,1],[506,1],[519,1],[521,1],[564,1],[583,2],[608,1],[610,1],[612,1]]},"140":{"position":[[286,1],[288,1],[365,1],[514,1],[516,1],[518,1],[623,1],[636,1],[638,1],[715,1],[864,2],[884,1],[886,1],[888,1]]},"144":{"position":[[290,1],[292,1],[370,1],[472,1],[474,1],[476,1],[581,1],[594,1],[596,1],[674,1],[776,2],[797,1],[799,1],[801,1]]},"152":{"position":[[411,1],[413,1],[455,1],[476,1],[478,1],[480,1],[585,1],[598,1],[600,1],[642,1],[663,2],[687,1],[689,1],[691,1]]},"156":{"position":[[307,1],[309,1],[384,1],[496,1],[498,1],[500,1],[605,1],[618,1],[620,1],[695,1],[807,2],[833,1],[835,1],[837,1]]},"160":{"position":[[284,1],[286,1],[364,1],[423,1],[425,1],[427,1],[532,1],[545,1],[547,1],[625,1],[684,2],[704,1],[706,1],[708,1]]},"162":{"position":[[490,2],[539,2],[883,1],[900,1]]},"164":{"position":[[350,1],[383,1]]},"166":{"position":[[353,1],[400,1]]},"168":{"position":[[80,1],[82,1],[128,1],[166,3],[186,3],[208,2],[211,1],[213,1],[215,1],[320,1],[333,1],[335,1],[381,1],[419,3],[439,3],[461,2],[464,2],[484,1],[486,1],[488,1]]},"172":{"position":[[379,1],[381,1],[425,1],[440,1],[455,2],[471,1],[483,1],[485,1],[487,1],[489,1],[594,1],[607,1],[609,1],[653,1],[668,1],[683,2],[699,1],[711,1],[713,2],[732,1],[734,1],[736,1]]},"174":{"position":[[151,1]]},"176":{"position":[[157,1],[159,1],[202,1],[259,2],[273,1],[301,1],[303,1],[305,1],[410,1],[423,1],[425,1],[468,1],[525,2],[539,1],[567,2],[584,1],[586,1],[588,1]]},"178":{"position":[[177,1],[191,1]]},"180":{"position":[[200,1],[202,1],[270,1],[328,1],[330,1],[332,1],[437,1],[450,1],[452,1],[520,1],[578,1],[580,1],[582,1],[584,1]]},"186":{"position":[[476,1],[478,1],[540,1],[620,1],[622,1],[624,1],[729,1],[742,1],[744,1],[806,1],[886,2],[907,1],[909,1],[911,1]]},"188":{"position":[[1059,1],[2270,1],[2272,1],[2322,3],[2334,1],[2404,1],[2432,2],[2449,1],[2465,2],[2484,1],[2496,2],[2515,1],[2531,2],[2552,1],[2566,2],[2587,1],[2600,1],[2602,2],[2616,1],[2694,1],[2696,1],[2698,1],[2803,1],[2816,1],[2818,1],[2868,3],[2880,1],[2950,1],[2978,2],[2995,1],[3011,2],[3030,1],[3042,2],[3061,1],[3077,2],[3098,1],[3112,2],[3133,1],[3146,1],[3148,2],[3162,1],[3240,2],[3258,1],[3260,1],[3262,1]]},"192":{"position":[[247,1],[249,1],[299,3],[311,1],[477,1],[479,1],[481,1],[586,1],[599,1],[601,1],[651,3],[663,1],[829,2],[850,1],[852,1],[854,1]]},"196":{"position":[[214,1],[216,1],[264,1],[369,1],[382,1],[384,1],[386,1],[388,1],[493,1],[506,1],[508,1],[556,1],[661,1],[674,1],[676,2],[698,1],[700,1],[702,1]]},"204":{"position":[[831,1],[833,1],[892,1],[993,1],[995,1],[997,1],[1040,1],[1042,1],[1101,1],[1201,1],[1203,1],[1205,1],[1270,1],[1272,1],[1331,1],[1443,1],[1445,1],[1447,1],[1735,1],[1737,1],[1796,1],[1887,1],[1896,2],[1914,1],[1926,1],[1928,1],[1930,1],[1932,1],[2037,1],[2050,1],[2052,1],[2111,1],[2202,1],[2211,2],[2229,1],[2241,1],[2243,2],[2263,1],[2265,1],[2267,1]]},"206":{"position":[[108,1],[221,1],[352,1],[371,1],[390,1],[402,1],[1597,1],[1599,1],[1642,1],[1644,2],[1647,3],[1651,2],[1665,1],[1687,1],[1689,2],[1749,2],[1831,2],[1834,2],[1926,1],[1928,1],[1930,1],[2392,1],[2394,1],[2437,1],[2439,2],[2442,3],[2446,2],[2460,1],[2486,1],[2488,1],[2490,1]]},"208":{"position":[[158,1],[160,1],[203,1],[253,1],[255,1],[257,1],[362,1],[375,1],[377,1],[420,1],[470,2],[487,1],[489,1],[491,1]]},"212":{"position":[[179,1],[181,1],[213,1],[231,2],[242,1],[260,1],[262,2],[265,1],[297,1],[315,2],[326,1],[344,1],[346,1],[348,1]]},"216":{"position":[[377,1],[379,1],[415,1],[456,3],[473,2],[476,1],[478,1],[480,1],[585,1],[598,1],[600,1],[636,1],[677,3],[694,2],[697,2],[723,1],[725,1],[727,1]]},"220":{"position":[[160,1],[162,1],[208,1],[233,1],[235,1],[237,1],[342,1],[355,1],[357,1],[403,1],[428,2],[451,1],[453,1],[455,1]]},"222":{"position":[[1024,1],[1086,1],[1135,7],[1143,2],[1157,1],[1205,1],[1207,1],[2161,1],[2571,1],[2633,1],[2733,2],[2747,1],[2795,1],[2797,1],[2918,3],[2937,3],[3800,1],[3862,1],[4036,2],[4050,1],[4098,1],[4100,1],[4524,1]]},"224":{"position":[[387,1],[389,1],[439,3],[451,1],[500,8],[590,2],[604,1],[622,1],[624,1],[626,1],[731,1],[744,1],[746,1],[796,3],[808,1],[857,8],[947,2],[961,1],[979,2],[1000,1],[1002,1],[1004,1]]},"230":{"position":[[379,1],[381,1],[452,1],[454,2],[457,3],[461,2],[475,1],[494,1],[510,3],[514,3],[518,4],[534,3],[538,3],[542,4],[562,3],[566,3],[570,3],[574,1],[576,1],[578,1],[580,1]]},"232":{"position":[[1350,1],[1352,1],[1374,2],[1377,3],[1392,1],[1411,1],[1424,1],[1426,1],[1441,3],[1445,3],[1449,4],[1454,2],[1506,3],[1510,3],[1514,4],[1519,2],[1598,1],[1600,2],[1603,1],[1605,1],[1607,1],[1609,1]]},"234":{"position":[[655,1],[674,2],[715,1]]},"236":{"position":[[481,1],[483,2],[486,3],[506,1],[508,1],[571,1],[573,2],[643,1],[645,3],[649,2],[652,2],[740,1],[742,1],[744,1],[746,1],[789,1],[791,1],[823,1],[825,2],[828,3],[832,4],[848,1],[867,1],[883,1],[885,1],[934,2],[1003,1],[1005,1],[1007,1],[1009,1],[1011,1],[1013,1],[1161,1],[1163,2],[1166,3],[1186,1],[1188,1],[1246,1],[1262,1],[1264,3],[1268,2],[1303,1],[1305,2],[1308,1],[1361,1],[1363,2],[1451,1],[1453,1],[1455,1],[1457,1],[1500,1],[1502,1],[1534,1],[1536,2],[1539,3],[1543,4],[1559,1],[1578,1],[1594,1],[1596,1],[1640,1],[1642,1],[1644,1],[1646,1],[1648,1],[1650,1],[1683,1],[1685,1],[1712,1],[1714,2],[1717,3],[1721,4],[1737,1],[1756,1],[1772,1],[1774,1],[1813,1],[1815,1],[1817,1],[1819,1],[1821,1],[1823,1],[1996,1],[1998,2],[2001,3],[2021,1],[2023,1],[2086,1],[2088,2],[2158,1],[2160,3],[2164,2],[2167,2],[2255,1],[2257,1],[2259,1],[2261,1],[2304,1],[2306,1],[2338,1],[2340,2],[2343,3],[2347,4],[2363,1],[2382,1],[2398,1],[2400,1],[2450,2],[2529,1],[2531,1],[2533,1],[2535,1],[2537,1],[2539,1]]},"238":{"position":[[175,1],[195,2],[198,3],[218,2],[273,1],[283,3],[287,3],[291,4],[296,2],[362,2],[365,3],[369,2],[372,2],[397,2],[463,2],[524,2],[602,2],[675,1]]},"240":{"position":[[917,2],[920,3],[935,1],[954,1],[970,1],[972,1],[974,2],[1020,2],[1102,2],[1105,1],[1144,1],[1146,1],[1148,1],[1150,1],[1198,2],[1201,3],[1216,1],[1235,1],[1251,1],[1253,1],[1255,2],[1311,2],[1462,2],[1465,1],[1504,1],[1506,1],[1508,1],[1510,1]]},"242":{"position":[[484,1],[494,1],[522,2],[598,2],[656,1],[658,1],[660,1],[670,1],[672,1],[700,2],[776,2],[834,2],[837,2],[843,1],[873,2],[950,2],[999,1],[1001,1],[1003,1],[1198,1],[1200,2],[1233,2],[1275,1],[1291,1],[1293,1],[1321,1],[1323,1],[1352,1],[1354,1],[1356,1],[1358,2],[1361,1],[1363,1],[1412,1],[1414,2],[1441,2],[1444,2],[1480,2],[1559,1],[1575,1],[1606,1],[1616,1],[1618,1],[1647,1],[1649,1],[1651,2],[1654,1],[1656,1],[1658,1]]},"244":{"position":[[138,2],[162,1],[279,2],[303,1],[357,1],[386,10],[408,1],[427,1],[443,10],[466,1],[468,1],[470,1],[666,1],[766,1],[791,1],[841,1],[883,1],[930,1],[938,1],[990,1],[992,1],[1045,1],[1047,1],[1101,1],[1103,1],[1156,1],[1158,1]]},"248":{"position":[[384,1],[733,1],[813,1],[835,1],[867,1],[965,1]]},"250":{"position":[[187,2],[190,1],[192,1],[194,1],[665,1],[688,1],[1495,2],[1557,2],[1618,2],[1670,2],[1699,2],[1702,2]]},"252":{"position":[[126,1],[146,2],[149,3],[169,2],[224,1],[234,3],[238,3],[242,4],[247,2],[313,2],[316,3],[320,2],[323,2],[340,2],[383,1]]},"254":{"position":[[279,1],[281,1],[313,1],[315,2],[318,3],[322,4],[338,1],[357,1],[373,1],[375,1],[395,2],[457,1],[459,1],[461,1],[463,1],[465,1],[467,1]]},"256":{"position":[[266,1],[572,1],[839,1],[937,1]]},"259":{"position":[[37,1],[39,2],[42,3],[62,1],[64,1],[127,1],[129,2],[199,1],[201,3],[205,2],[208,2],[296,1],[298,1],[300,1],[302,1],[345,1],[347,1],[379,1],[381,2],[384,3],[388,4],[404,1],[423,1],[439,1],[441,1],[491,1],[493,1],[495,1],[497,1],[499,1],[501,1]]},"261":{"position":[[37,1],[39,2],[42,3],[62,1],[64,1],[127,1],[146,1],[170,1],[186,1],[193,1],[195,1],[197,1],[199,1],[201,1],[244,1],[246,1],[278,1],[280,2],[283,3],[287,4],[303,1],[322,1],[338,1],[340,1],[390,1],[392,1],[394,1],[396,1],[398,1],[400,1]]},"263":{"position":[[277,1],[279,1],[311,1],[313,2],[316,3],[320,4],[336,1],[355,1],[371,1],[373,1],[408,2],[431,1],[433,1],[435,1],[437,1],[439,1],[441,1]]},"272":{"position":[[217,1],[219,2],[222,3],[242,1],[244,1],[293,1],[303,1],[305,1],[341,1],[343,1],[345,2],[348,1],[350,1],[352,1],[786,1],[788,2],[791,3],[811,1],[813,1],[862,1],[872,1],[874,1],[910,2],[969,2],[972,2],[993,1],[1071,1],[1073,1],[1075,2],[1078,1],[1080,1],[1082,1]]},"274":{"position":[[137,1],[139,2],[142,3],[162,1],[164,1],[213,1],[223,1],[225,1],[261,1],[263,2],[278,1],[345,1],[347,2],[350,1],[352,1],[354,1]]},"276":{"position":[[79,1],[81,1],[113,1],[115,2],[118,3],[122,4],[138,1],[157,1],[173,1],[175,1],[215,1],[217,1],[219,1],[221,1],[223,1],[225,1],[380,1],[382,1],[414,1],[416,2],[419,3],[423,4],[439,1],[458,1],[474,1],[476,1],[516,2],[519,3],[539,2],[594,1],[604,3],[608,3],[612,4],[617,2],[683,2],[686,3],[690,2],[693,2],[710,2],[766,2],[809,1],[811,1],[813,1],[815,1],[817,1],[819,1],[965,1],[967,1],[999,1],[1001,2],[1004,3],[1008,4],[1024,1],[1043,1],[1059,1],[1061,1],[1147,2],[1201,2],[1245,1],[1247,1],[1249,1],[1251,1],[1253,1],[1255,1]]},"278":{"position":[[628,1],[644,1],[657,1],[1157,1],[1469,1],[1639,1],[1701,1],[1708,2],[1717,2],[1880,1],[1977,1]]},"282":{"position":[[555,2],[558,3],[574,1],[576,2],[674,2],[770,1],[1537,2],[1540,3],[1556,1],[1558,2],[1691,1],[1985,2],[1988,3],[2004,1],[2006,2],[2061,1],[2231,2],[2234,3],[2250,1],[2252,2],[2326,1],[2545,2],[2548,3],[2564,1],[2566,2],[2645,1],[2903,2],[2906,3],[2922,1],[2924,2],[3008,1],[3019,1],[3179,1],[3504,2],[3507,3],[3523,1],[3525,2],[3562,1],[3600,1],[3904,2],[3907,3],[3923,1],[3925,2],[3963,1],[4041,2],[4053,1],[4486,1],[4566,1],[4602,1],[4834,1],[4948,1],[4979,2],[4982,3],[4998,1],[5000,2],[5038,1],[5123,1],[5436,1],[5535,1],[5547,1],[5555,1],[5656,1],[5738,1],[5769,2],[5772,3],[5788,1],[5790,2],[5828,1],[5911,1],[6874,2],[6877,3],[6893,1],[6895,2],[6898,3],[6902,2],[7000,1]]},"285":{"position":[[210,1],[212,2],[215,3],[231,2],[283,1]]},"287":{"position":[[1338,1],[1340,5],[1925,2],[1928,3],[1944,1],[1946,2],[1949,3],[1979,2],[2052,1]]},"289":{"position":[[839,1],[841,5],[1513,1],[1606,1],[2459,2],[2462,3],[2478,1],[2480,2],[2483,3],[2487,2],[2550,2],[2613,2],[2677,1],[3048,1]]},"292":{"position":[[377,1],[379,2],[461,2],[561,2],[622,1],[790,1],[792,2],[874,2],[974,2],[1036,2],[1167,1]]},"294":{"position":[[636,1],[716,1],[738,1],[834,1],[932,1]]},"298":{"position":[[396,1],[398,1],[430,1],[432,2],[435,3],[439,4],[455,1],[474,1],[490,1],[492,1],[619,1],[621,1],[623,1],[625,1],[627,1],[629,1]]},"300":{"position":[[579,1],[581,1],[613,1],[615,2],[618,3],[622,4],[638,1],[657,1],[687,1],[689,1],[730,1],[732,1],[734,1],[736,1],[738,1],[740,1]]},"303":{"position":[[37,1],[39,2],[42,3],[62,1],[64,1],[113,1],[123,1],[125,1],[161,1],[163,1],[165,2],[168,1],[170,1],[172,1],[215,1],[217,1],[249,1],[251,2],[254,3],[258,4],[274,1],[293,1],[309,1],[311,1],[351,1],[353,1],[355,1],[357,1],[359,1],[361,1]]},"305":{"position":[[125,1],[127,2],[130,3],[150,1],[152,1],[201,1],[211,1],[213,1],[249,1],[251,1],[253,2],[268,1],[479,1],[481,1],[483,1],[485,1],[528,1],[530,1],[562,1],[564,2],[567,3],[571,4],[587,1],[606,1],[622,1],[624,1],[664,1],[666,1],[668,1],[670,1],[672,1],[674,1]]},"307":{"position":[[314,1],[316,2],[319,3],[339,1],[341,1],[390,1],[400,1],[402,1],[438,1],[440,1],[442,2],[457,1],[459,2],[501,1],[503,1],[505,1],[507,1],[550,1],[552,1],[584,1],[586,2],[589,3],[593,4],[609,1],[628,1],[644,1],[646,1],[773,2],[817,1],[819,1],[821,1],[823,1],[825,1],[827,1]]},"309":{"position":[[222,1],[224,2],[227,3],[247,1],[249,1],[298,1],[308,1],[310,1],[346,1],[348,1],[350,2],[365,1],[576,1],[578,1],[580,1],[582,1],[625,1],[627,1],[659,1],[661,2],[664,3],[668,4],[684,1],[703,1],[719,1],[721,1],[723,2],[779,2],[930,2],[933,1],[952,1],[954,1],[956,1],[958,1],[960,1],[962,1]]},"311":{"position":[[446,1],[448,2],[451,3],[471,1],[473,1],[522,1],[532,1],[534,1],[570,1],[572,2],[587,2],[590,2],[613,2],[616,1],[618,1],[620,1],[634,1],[636,1],[687,1],[689,2],[692,3],[696,4],[712,1],[731,1],[747,1],[749,1],[821,2],[853,2],[946,1],[948,1],[950,1],[952,1],[954,1],[956,1],[971,1],[973,1],[1004,1],[1006,2],[1009,3],[1013,4],[1029,1],[1048,1],[1064,1],[1066,1],[1107,2],[1168,2],[1283,1],[1285,1],[1287,1],[1289,1],[1291,1],[1293,1]]},"315":{"position":[[190,1],[192,2],[195,3],[215,1],[217,1],[269,1],[280,1],[300,2],[314,1],[334,1],[336,1],[338,1],[340,1],[342,1],[611,1],[613,1],[645,1],[647,2],[650,3],[654,4],[670,1],[689,1],[705,1],[707,1],[725,2],[794,1],[796,2],[842,1],[844,1],[846,1],[848,1],[850,1],[852,1],[854,1]]},"317":{"position":[[147,2],[293,2],[451,1],[481,2],[546,2],[584,1],[623,2],[657,1],[687,2],[773,2],[815,1],[851,2]]},"319":{"position":[[74,1],[76,1],[131,1],[133,2],[136,3],[140,2],[154,1],[173,1],[205,1],[207,1],[218,1],[220,2],[263,1],[265,2],[370,1],[372,1],[374,1],[376,2],[379,1],[381,1],[383,1],[385,1]]},"322":{"position":[[48,2],[81,2],[117,2],[170,2],[173,2],[218,1],[229,1],[231,1],[296,3],[308,1],[310,1],[339,1],[341,1],[343,2],[401,2],[404,1]]},"324":{"position":[[68,1],[79,1],[99,1],[101,1]]},"326":{"position":[[8,1],[21,1],[36,1],[47,1],[66,1],[68,2],[83,1],[94,1],[113,1],[115,2],[118,2],[121,1]]},"328":{"position":[[8,1],[21,1],[23,1],[73,1],[75,1],[77,1]]},"330":{"position":[[8,1],[19,1],[21,1],[63,2],[66,1],[68,1],[70,1]]},"332":{"position":[[176,1],[192,1],[270,3],[563,1],[579,1],[664,1],[677,1],[679,1],[742,1],[744,1],[746,1]]},"339":{"position":[[311,1],[340,1]]},"345":{"position":[[175,1],[221,1]]},"360":{"position":[[304,2],[362,2],[488,2]]},"368":{"position":[[471,1],[584,1],[604,1],[621,1],[639,1],[673,1],[692,1],[705,1],[791,1],[804,1],[890,1],[1052,1],[1117,1],[1158,1],[1232,1],[1357,1],[1443,1],[1841,3],[1963,1],[1965,3],[2306,3],[2408,1],[2410,3],[2812,3],[2936,1],[2938,3],[3704,1],[3706,3]]},"370":{"position":[[1052,1]]},"374":{"position":[[132,1],[161,1],[234,2],[553,1],[579,1],[609,1],[619,1],[662,1],[664,1],[916,1],[929,1],[931,1],[1014,1],[1115,1],[1117,1],[1119,2],[1133,1],[1135,1],[1183,1],[1242,1],[1244,1],[1246,2],[1249,1]]},"383":{"position":[[234,1],[251,1],[281,1],[320,1],[341,2],[440,2],[537,1],[539,2],[582,3],[586,1],[658,1],[670,1],[678,1],[687,1],[689,1],[737,1],[739,2],[756,3],[760,1],[808,1],[810,1],[847,1],[849,2],[868,1],[937,1],[966,1],[1042,1],[1044,2],[1150,1],[1285,1],[1337,1],[1363,2],[1366,3],[1377,1],[1429,1],[1480,1],[1502,2],[1505,3],[1509,1],[1563,1],[1588,2],[1591,3],[1595,1],[1764,1],[1776,2],[1779,3],[1783,1],[1838,1],[1840,1],[1853,2],[1856,3],[1873,2]]},"385":{"position":[[171,1],[196,1],[312,1],[330,1],[375,2],[498,1],[500,2],[711,1],[767,2],[824,1],[832,2],[919,1],[928,2],[1013,1],[1021,1],[1023,1]]},"387":{"position":[[294,2],[297,3],[308,1],[343,1],[412,1],[414,2],[417,3],[444,1],[487,1],[489,3],[493,2],[496,1],[498,2],[501,3],[505,2],[570,2],[648,1],[670,1],[672,2],[675,3],[697,2],[700,3],[739,1],[741,1],[804,1],[837,2],[842,3],[858,1],[1003,3],[1007,1],[1032,1],[1034,1],[1036,1],[1038,2],[1041,3],[1045,2],[1135,1],[1197,1],[1199,3],[1203,2],[1206,1],[1208,2],[1211,3],[1260,1],[1262,2],[1265,3],[1287,2],[1290,3],[1330,1],[1456,1],[1458,1],[1460,1]]},"389":{"position":[[213,1],[240,1],[292,1],[305,1],[395,1],[397,2],[400,3],[404,2],[451,2],[515,2],[664,1],[666,4],[682,1],[690,1],[746,1],[748,1],[762,1],[770,1],[831,2],[861,2],[932,2],[941,1],[964,1],[966,1],[968,1],[970,1]]},"391":{"position":[[330,1],[336,1],[350,2],[353,3],[416,1],[433,2],[436,3],[479,1],[494,1],[579,1],[611,3],[620,2],[632,3],[636,3],[640,1],[651,1],[661,1],[680,3],[684,4],[689,1],[704,1],[715,1],[729,1],[779,1],[788,1],[801,1],[809,1],[826,1],[828,1],[853,3],[862,2],[871,3],[885,2],[902,3],[915,2],[931,3],[935,4],[940,1],[986,1],[1000,3],[1009,2],[1020,3],[1034,2],[1053,3],[1066,2],[1084,3],[1088,4],[1093,1],[1141,1],[1147,1],[1162,1],[1210,1],[1222,1],[1292,1],[1338,2],[1394,1],[1396,1],[1550,1],[1566,1],[1610,2],[1613,3],[1676,1],[1678,2],[1681,3],[1735,1],[1744,1],[1757,1],[1763,1],[1776,1],[1836,2],[1968,2],[2023,1],[2035,1],[2046,1],[2048,1],[2050,1],[2188,1],[2204,1],[2248,2],[2251,3],[2314,1],[2316,2],[2319,3],[2340,1],[2348,2],[2351,2],[2354,1],[2360,1],[2373,1],[2486,1],[2498,1],[2500,2],[2624,1],[2626,1],[2628,1]]},"393":{"position":[[1577,1],[1632,1],[1677,2],[1680,3],[1743,1],[1745,2],[1748,3],[1817,1],[1819,4],[1846,1],[1874,1],[1876,3],[1884,1],[1886,2],[1943,1],[2054,1],[2062,1],[2077,2],[2128,2],[2183,1],[2185,1],[2210,1],[2218,1],[2220,2],[2234,3],[2238,1],[2240,1],[2242,1],[2250,2],[2329,1],[2331,1],[2423,2],[2426,2],[2544,1],[2556,1],[2567,1],[2569,2],[2615,2],[2663,2],[2784,1],[2818,2],[2905,2],[2981,1],[2983,1]]},"396":{"position":[[373,1],[387,1],[432,2],[435,3],[498,1],[515,3],[519,3],[523,1],[534,3],[538,4],[543,2],[546,3],[550,2],[627,1],[635,1],[637,2],[640,3],[673,1],[737,2],[740,1],[746,1],[759,1],[859,2],[920,2],[971,1],[978,1],[980,2],[983,1],[985,1],[1011,2],[1050,1],[1062,1],[1141,1],[1143,1],[1145,1]]},"398":{"position":[[831,1],[844,1],[875,2],[878,3],[941,1],[958,3],[962,3],[966,1],[977,3],[981,4],[986,2],[989,3],[993,2],[1109,1],[1131,1],[1133,1],[2859,1],[2890,1],[2892,2],[2975,2],[3068,1],[3097,1],[3099,1],[3537,1],[3568,1],[3601,1],[3630,2],[3704,1],[3706,1]]},"402":{"position":[[385,1],[640,1],[985,1],[992,1],[2101,1]]},"404":{"position":[[637,1]]},"409":{"position":[[76,1],[164,1],[231,1]]},"420":{"position":[[1524,1],[1570,1],[1572,3],[1576,2],[1590,1],[1608,1],[1610,1],[1834,2],[1924,2],[2024,2],[2107,2],[2134,3],[2359,1],[2405,1],[2407,3],[2411,2],[2425,1],[2462,1],[2464,1]]},"432":{"position":[[250,1],[400,1]]},"434":{"position":[[361,1],[427,1],[485,1],[2777,1],[2844,1],[3753,1],[3755,1],[3816,1],[3949,1],[3951,1],[3953,1]]},"436":{"position":[[543,1],[651,1],[1700,1],[1702,1],[1763,1],[1896,2],[1910,1],[1929,1],[1945,1],[1969,1],[1971,1],[1973,1],[1975,1],[1977,1]]},"438":{"position":[[276,1],[384,1]]},"440":{"position":[[917,1],[919,1],[980,1],[1113,2],[1127,1],[1146,1],[1162,1],[1186,1],[1188,1],[1190,1],[1192,1],[1194,1]]},"442":{"position":[[566,1],[1419,2],[1826,2]]},"473":{"position":[[178,3]]}}}],["0",{"_index":729,"t":{"77":{"position":[[63,2]]}}}],["0.0.0.0",{"_index":1076,"t":{"118":{"position":[[589,7]]},"120":{"position":[[385,10],[620,10]]},"126":{"position":[[581,7]]}}}],["0.3",{"_index":1907,"t":{"289":{"position":[[2135,3]]}}}],["0.33",{"_index":1910,"t":{"289":{"position":[[2544,5],[2607,5],[2672,4]]},"311":{"position":[[1235,5],[1256,5],[1278,4]]}}}],["0.4",{"_index":1905,"t":{"289":{"position":[[2111,3]]}}}],["02",{"_index":2383,"t":{"402":{"position":[[958,2]]},"409":{"position":[[50,2],[137,2],[204,2]]}}}],["029b081ba",{"_index":517,"t":{"37":{"position":[[319,10],[610,10]]},"59":{"position":[[357,10],[668,10]]},"130":{"position":[[738,10],[1029,10]]},"156":{"position":[[395,10],[706,10]]}}}],["0400",{"_index":2371,"t":{"402":{"position":[[374,5],[629,5]]}}}],["05",{"_index":1644,"t":{"244":{"position":[[894,3],[949,3]]}}}],["0500",{"_index":1636,"t":{"244":{"position":[[654,5]]}}}],["05:00",{"_index":2385,"t":{"402":{"position":[[973,5]]}}}],["06:00",{"_index":2406,"t":{"409":{"position":[[65,5],[152,5],[219,5]]}}}],["07",{"_index":2369,"t":{"402":{"position":[[354,2],[609,2]]}}}],["0845bdc965b4",{"_index":2202,"t":{"383":{"position":[[724,12]]}}}],["08:53:10.467",{"_index":1635,"t":{"244":{"position":[[640,12]]}}}],["0:48/3:56",{"_index":2328,"t":{"393":{"position":[[2187,9]]}}}],["1",{"_index":228,"t":{"13":{"position":[[4269,2],[4293,2],[4363,2]]},"77":{"position":[[201,2],[576,2]]},"98":{"position":[[552,1],[836,1]]},"289":{"position":[[2744,2],[2807,2]]},"332":{"position":[[737,4]]},"420":{"position":[[1776,2],[1949,1]]}}}],["1.5",{"_index":231,"t":{"13":{"position":[[4315,3],[4385,3]]},"77":{"position":[[363,4],[738,4]]}}}],["10",{"_index":248,"t":{"13":{"position":[[4970,2]]},"31":{"position":[[991,2]]},"402":{"position":[[357,2],[612,2]]}}}],["10,000",{"_index":1733,"t":{"265":{"position":[[733,7]]},"267":{"position":[[130,7]]}}}],["10.7",{"_index":1089,"t":{"122":{"position":[[23,4]]}}}],["100",{"_index":651,"t":{"61":{"position":[[1814,4]]}}}],["1000",{"_index":1226,"t":{"170":{"position":[[1571,4]]}}}],["1000:1000",{"_index":2146,"t":{"370":{"position":[[321,9]]}}}],["12",{"_index":1633,"t":{"244":{"position":[[634,2],[824,3],[917,3],[972,3]]}}}],["120",{"_index":752,"t":{"77":{"position":[[1581,4]]},"79":{"position":[[513,3]]}}}],["1234",{"_index":1192,"t":{"164":{"position":[[497,4]]},"188":{"position":[[2345,7],[2891,7]]}}}],["127.0.0.1",{"_index":1289,"t":{"190":{"position":[[1145,9],[1908,10]]},"210":{"position":[[379,9]]}}}],["127.0.0.1:5079",{"_index":1315,"t":{"190":{"position":[[3161,14]]}}}],["127.0.0.1:5079:8080",{"_index":1311,"t":{"190":{"position":[[2746,19]]}}}],["12:32:21.417",{"_index":2370,"t":{"402":{"position":[[360,12]]}}}],["12:32:21.418",{"_index":2380,"t":{"402":{"position":[[615,12]]}}}],["1673e4d57ce7",{"_index":1667,"t":{"244":{"position":[[1205,12]]}}}],["17",{"_index":1634,"t":{"244":{"position":[[637,2]]}}}],["192.168.0.100",{"_index":2143,"t":{"370":{"position":[[192,15]]},"402":{"position":[[510,15],[721,15]]},"430":{"position":[[203,13],[635,13]]}}}],["192.168.0.100:6600",{"_index":1246,"t":{"176":{"position":[[211,21],[477,21]]}}}],["192.168.0.101",{"_index":333,"t":{"21":{"position":[[620,13]]},"220":{"position":[[217,15],[412,15]]}}}],["192.168.0.101:3456",{"_index":1079,"t":{"118":{"position":[[863,18]]},"126":{"position":[[845,18]]},"162":{"position":[[1161,18]]}}}],["192.168.0.101:4000/my/subfold",{"_index":343,"t":{"21":{"position":[[978,31]]}}}],["192.168.0.233:32400",{"_index":757,"t":{"77":{"position":[[1799,22],[1969,22],[2326,22]]},"79":{"position":[[646,22],[800,22],[960,22]]}}}],["192.168.0.xxx",{"_index":1290,"t":{"190":{"position":[[1188,15]]}}}],["19t10:05:42",{"_index":2405,"t":{"409":{"position":[[53,11],[140,11],[207,11]]}}}],["1:50/2:40",{"_index":833,"t":{"86":{"position":[[803,11]]}}}],["1m:20",{"_index":834,"t":{"86":{"position":[[862,7]]}}}],["1psidts=sidt",{"_index":1466,"t":{"222":{"position":[[1108,13]]},"224":{"position":[[473,13],[830,13]]}}}],["1x",{"_index":167,"t":{"13":{"position":[[1571,2],[3254,2]]}}}],["2",{"_index":741,"t":{"77":{"position":[[1110,2]]},"190":{"position":[[3918,2]]},"420":{"position":[[1861,2],[2049,1],[3304,1]]}}}],["2.7",{"_index":1730,"t":{"265":{"position":[[674,3]]},"267":{"position":[[71,3]]}}}],["20",{"_index":855,"t":{"92":{"position":[[532,2],[568,3]]}}}],["200",{"_index":467,"t":{"33":{"position":[[124,3]]},"265":{"position":[[703,3]]},"267":{"position":[[100,3]]},"380":{"position":[[268,3]]}}}],["2023",{"_index":2382,"t":{"402":{"position":[[953,4]]},"409":{"position":[[45,4],[132,4],[199,4]]}}}],["2025",{"_index":1632,"t":{"244":{"position":[[628,5]]},"402":{"position":[[348,5],[603,5]]}}}],["22t11:16:12",{"_index":2384,"t":{"402":{"position":[[961,11]]}}}],["25",{"_index":1473,"t":{"222":{"position":[[1365,3]]}}}],["25th",{"_index":1898,"t":{"289":{"position":[[1758,4]]}}}],["28c1b7b7",{"_index":1652,"t":{"244":{"position":[[1064,8]]}}}],["2x",{"_index":163,"t":{"13":{"position":[[1532,2],[3215,2]]}}}],["3",{"_index":256,"t":{"13":{"position":[[5171,2]]},"31":{"position":[[1366,2]]},"420":{"position":[[1951,2],[2132,1],[3306,1]]}}}],["3.7",{"_index":2060,"t":{"355":{"position":[[80,5]]}}}],["30",{"_index":224,"t":{"13":{"position":[[4230,3]]}}}],["343b",{"_index":1665,"t":{"244":{"position":[[1195,4]]}}}],["355a",{"_index":1653,"t":{"244":{"position":[[1073,4]]}}}],["36759a8a",{"_index":1647,"t":{"244":{"position":[[1008,8]]}}}],["37",{"_index":1728,"t":{"265":{"position":[[637,2]]},"267":{"position":[[34,2]]}}}],["3be671f5ea2b",{"_index":521,"t":{"37":{"position":[[345,14],[636,14]]},"59":{"position":[[383,14],[694,14]]},"130":{"position":[[764,14],[1055,14]]},"156":{"position":[[421,14],[732,14]]}}}],["3papisid=3axsxpy0mkgu75qb/akisxgqonsdn1jekn",{"_index":776,"t":{"77":{"position":[[2922,44]]},"79":{"position":[[1314,44]]}}}],["3rd",{"_index":640,"t":{"61":{"position":[[1420,3]]},"420":{"position":[[2759,3]]}}}],["3x",{"_index":165,"t":{"13":{"position":[[1550,2],[3233,2]]}}}],["4",{"_index":257,"t":{"13":{"position":[[5182,2]]},"31":{"position":[[1377,2]]},"92":{"position":[[220,2]]},"190":{"position":[[2995,1]]},"420":{"position":[[2051,2]]}}}],["40",{"_index":854,"t":{"92":{"position":[[465,3],[502,2]]}}}],["401",{"_index":2401,"t":{"406":{"position":[[58,3],[142,3]]}}}],["403",{"_index":2048,"t":{"347":{"position":[[3282,3],[3294,3]]},"406":{"position":[[65,3]]}}}],["4303",{"_index":1821,"t":{"282":{"position":[[3129,4]]}}}],["4676",{"_index":1659,"t":{"244":{"position":[[1133,4]]}}}],["47da",{"_index":1649,"t":{"244":{"position":[[1022,4]]}}}],["48",{"_index":2327,"t":{"393":{"position":[[2179,2]]}}}],["48b1",{"_index":1654,"t":{"244":{"position":[[1078,4]]}}}],["49d7",{"_index":2200,"t":{"383":{"position":[[714,4]]}}}],["4ac0dfa2348f",{"_index":1823,"t":{"282":{"position":[[3139,14]]}}}],["4dhe",{"_index":708,"t":{"73":{"position":[[955,4],[1206,4]]},"204":{"position":[[955,4],[1164,4],[1394,4],[1859,4],[2174,4]]}}}],["4pe7",{"_index":519,"t":{"37":{"position":[[335,4],[626,4]]},"59":{"position":[[373,4],[684,4]]},"130":{"position":[[754,4],[1045,4]]},"156":{"position":[[411,4],[722,4]]}}}],["5",{"_index":26,"t":{"7":{"position":[[126,1]]},"13":{"position":[[4947,2],[5194,1]]},"31":{"position":[[968,2],[1389,1]]},"265":{"position":[[656,1]]},"267":{"position":[[53,1]]},"289":{"position":[[2065,24]]}}}],["50",{"_index":226,"t":{"13":{"position":[[4245,2]]},"92":{"position":[[155,4]]}}}],["500",{"_index":469,"t":{"33":{"position":[[161,3],[327,3],[451,3],[609,3],[708,3]]}}}],["5353/udp",{"_index":982,"t":{"108":{"position":[[955,9]]}}}],["6",{"_index":2440,"t":{"420":{"position":[[1859,1]]}}}],["60",{"_index":201,"t":{"13":{"position":[[2771,2]]},"192":{"position":[[474,2],[826,2]]}}}],["60f84fdc0cab",{"_index":1651,"t":{"244":{"position":[[1032,12]]}}}],["6600",{"_index":1240,"t":{"174":{"position":[[188,6]]}}}],["6644",{"_index":1227,"t":{"170":{"position":[[1594,5]]}}}],["6680",{"_index":1179,"t":{"162":{"position":[[902,4]]}}}],["6969",{"_index":2187,"t":{"380":{"position":[[673,4]]},"391":{"position":[[653,7]]}}}],["7",{"_index":246,"t":{"13":{"position":[[4958,2]]},"31":{"position":[[979,2]]}}}],["75b8eb8080ef",{"_index":1656,"t":{"244":{"position":[[1088,12]]}}}],["7905",{"_index":1252,"t":{"178":{"position":[[416,5]]}}}],["7cdr86vis3mpq5b1pi01md0hkm7ykzzxjy81r",{"_index":679,"t":{"66":{"position":[[774,40],[1040,40]]}}}],["7ef1",{"_index":1658,"t":{"244":{"position":[[1128,4]]}}}],["846b",{"_index":2201,"t":{"383":{"position":[[719,4]]}}}],["882e",{"_index":1660,"t":{"244":{"position":[[1138,4]]}}}],["88e5",{"_index":520,"t":{"37":{"position":[[340,4],[631,4]]},"59":{"position":[[378,4],[689,4]]},"130":{"position":[[759,4],[1050,4]]},"156":{"position":[[416,4],[727,4]]}}}],["8910....6jqupl.apps.googleusercontent.com",{"_index":1494,"t":{"222":{"position":[[2647,44],[3876,44]]}}}],["891098404....apps.googleusercontent.com",{"_index":1533,"t":{"224":{"position":[[521,42],[878,42]]}}}],["8dcc73a59",{"_index":2389,"t":{"402":{"position":[[1082,10]]}}}],["90",{"_index":1845,"t":{"285":{"position":[[206,3],[228,2],[253,2]]}}}],["9078",{"_index":329,"t":{"21":{"position":[[301,4]]},"368":{"position":[[2231,5]]},"370":{"position":[[144,4]]},"374":{"position":[[1306,5]]},"402":{"position":[[2259,4]]},"430":{"position":[[161,4]]}}}],["9078:9078",{"_index":1714,"t":{"256":{"position":[[1052,11]]},"278":{"position":[[2132,11]]},"368":{"position":[[1433,9],[2313,9],[2423,11]]},"370":{"position":[[633,9],[788,9],[1432,11]]},"432":{"position":[[496,11]]}}}],["9156",{"_index":518,"t":{"37":{"position":[[330,4],[621,4]]},"59":{"position":[[368,4],[679,4]]},"130":{"position":[[749,4],[1040,4]]},"156":{"position":[[406,4],[717,4]]}}}],["9390",{"_index":1666,"t":{"244":{"position":[[1200,4]]}}}],["984e",{"_index":1820,"t":{"282":{"position":[[3124,4]]}}}],["9a51",{"_index":1822,"t":{"282":{"position":[[3134,4]]}}}],["__secur",{"_index":775,"t":{"77":{"position":[[2912,9]]},"79":{"position":[[1304,9]]},"222":{"position":[[1098,9]]},"224":{"position":[[463,9],[820,9]]}}}],["_transforms=musicbrainz",{"_index":1794,"t":{"278":{"position":[[1001,24]]}}}],["_transforms=n",{"_index":1698,"t":{"256":{"position":[[115,19]]}}}],["a0d51240",{"_index":1657,"t":{"244":{"position":[[1119,8]]}}}],["a236",{"_index":1650,"t":{"244":{"position":[[1027,4]]}}}],["a89cba1569901a0671d5a9875fed4be1",{"_index":195,"t":{"13":{"position":[[2622,35],[4516,35]]},"17":{"position":[[1033,35]]},"43":{"position":[[537,35],[887,35]]},"140":{"position":[[377,35],[727,35]]},"192":{"position":[[325,35],[677,35]]},"374":{"position":[[1026,35]]}}}],["abcc",{"_index":1664,"t":{"244":{"position":[[1190,4]]}}}],["abcd",{"_index":443,"t":{"31":{"position":[[510,6]]}}}],["abil",{"_index":1282,"t":{"190":{"position":[[355,7]]},"226":{"position":[[36,7]]},"398":{"position":[[2008,7]]}}}],["abov",{"_index":258,"t":{"15":{"position":[[28,5]]},"126":{"position":[[487,6]]},"178":{"position":[[330,6]]},"230":{"position":[[33,5]]},"240":{"position":[[824,5]]},"256":{"position":[[32,5]]},"278":{"position":[[32,5]]},"282":{"position":[[728,5],[2712,5]]},"287":{"position":[[1164,5]]},"362":{"position":[[1036,5]]},"370":{"position":[[878,5]]},"442":{"position":[[1947,5]]},"462":{"position":[[377,5]]}}}],["above...aft",{"_index":2491,"t":{"434":{"position":[[772,13]]}}}],["absolut",{"_index":2074,"t":{"360":{"position":[[369,8]]}}}],["abstract",{"_index":2004,"t":{"343":{"position":[[325,8]]},"347":{"position":[[27,8]]}}}],["abstractcompon",{"_index":2013,"t":{"347":{"position":[[48,18]]},"383":{"position":[[1924,17]]}}}],["abstractsourc",{"_index":2254,"t":{"387":{"position":[[1230,15]]},"398":{"position":[[2702,14],[2844,14],[3522,14]]}}}],["abstractsource'",{"_index":2354,"t":{"398":{"position":[[1970,16]]}}}],["accept",{"_index":527,"t":{"39":{"position":[[112,6]]},"57":{"position":[[110,6]]},"132":{"position":[[39,6]]},"134":{"position":[[69,6]]},"136":{"position":[[268,9]]},"138":{"position":[[177,6]]},"146":{"position":[[39,6]]},"148":{"position":[[69,6]]},"152":{"position":[[348,9]]},"154":{"position":[[209,6]]},"178":{"position":[[42,6]]},"190":{"position":[[668,6]]},"206":{"position":[[1453,7]]},"294":{"position":[[1514,6]]},"383":{"position":[[1948,7]]},"385":{"position":[[82,6]]}}}],["access",{"_index":497,"t":{"35":{"position":[[523,6],[570,10],[1626,10]]},"45":{"position":[[409,6]]},"61":{"position":[[938,9]]},"68":{"position":[[1016,9]]},"75":{"position":[[418,6]]},"86":{"position":[[461,10]]},"96":{"position":[[633,6]]},"100":{"position":[[47,6]]},"170":{"position":[[201,6],[429,6],[1056,6],[1377,6]]},"184":{"position":[[66,6]]},"188":{"position":[[327,9]]},"190":{"position":[[505,6],[1049,6],[1820,10]]},"200":{"position":[[66,6]]},"206":{"position":[[521,10],[607,11]]},"210":{"position":[[607,10],[698,9]]},"222":{"position":[[1420,6],[4516,6]]},"347":{"position":[[1869,10]]},"368":{"position":[[2117,6]]},"380":{"position":[[656,8],[770,8]]},"402":{"position":[[2012,6]]},"404":{"position":[[155,6],[222,10]]},"406":{"position":[[784,6],[827,6]]},"420":{"position":[[506,6]]},"434":{"position":[[516,6]]},"442":{"position":[[1690,6],[1737,10],[2334,10]]},"462":{"position":[[323,8]]}}}],["accesstoken",{"_index":748,"t":{"77":{"position":[[1503,14]]},"79":{"position":[[435,14]]}}}],["accident",{"_index":1882,"t":{"289":{"position":[[485,12]]}}}],["accordingli",{"_index":2552,"t":{"471":{"position":[[336,12]]}}}],["account",{"_index":164,"t":{"13":{"position":[[1540,9],[1561,9],[3223,9],[3244,9]]},"35":{"position":[[60,7]]},"37":{"position":[[122,7]]},"39":{"position":[[75,7],[242,7],[294,8],[323,7],[365,7],[528,7]]},"43":{"position":[[123,7],[177,7]]},"45":{"position":[[67,7],[157,8],[246,8],[426,7]]},"57":{"position":[[68,7],[296,7]]},"61":{"position":[[674,8]]},"63":{"position":[[24,7],[168,7]]},"66":{"position":[[108,7],[165,8],[206,7],[558,7]]},"68":{"position":[[756,8]]},"70":{"position":[[26,8]]},"73":{"position":[[200,7],[257,8],[297,7],[706,7]]},"75":{"position":[[147,7],[253,7],[312,7]]},"100":{"position":[[286,8]]},"132":{"position":[[228,8]]},"146":{"position":[[248,8]]},"154":{"position":[[395,7]]},"190":{"position":[[656,7]]},"210":{"position":[[88,8]]},"222":{"position":[[1810,8]]},"420":{"position":[[2633,7]]},"434":{"position":[[1243,8],[3324,7],[3428,7],[3707,7],[4140,8]]},"442":{"position":[[915,7],[1019,7]]}}}],["account'",{"_index":1136,"t":{"130":{"position":[[29,9]]},"154":{"position":[[36,9]]}}}],["accumul",{"_index":1914,"t":{"289":{"position":[[2899,11]]}}}],["accur",{"_index":1279,"t":{"190":{"position":[[122,10]]},"194":{"position":[[548,8]]},"282":{"position":[[6588,8]]},"294":{"position":[[18,9],[1079,8],[1390,8]]},"420":{"position":[[59,10]]}}}],["accuraci",{"_index":1283,"t":{"190":{"position":[[411,8]]},"393":{"position":[[479,8]]}}}],["achiev",{"_index":1612,"t":{"240":{"position":[[424,7]]}}}],["action",{"_index":354,"t":{"23":{"position":[[123,7]]},"94":{"position":[[376,6]]},"96":{"position":[[1061,6]]},"112":{"position":[[824,6]]}}}],["activ",{"_index":77,"t":{"9":{"position":[[606,7],[723,6]]},"23":{"position":[[28,10],[150,10]]},"35":{"position":[[38,8]]},"39":{"position":[[39,8]]},"45":{"position":[[39,8]]},"57":{"position":[[39,8]]},"61":{"position":[[38,8]]},"68":{"position":[[38,8]]},"83":{"position":[[105,6],[112,8],[136,6],[184,6],[191,8],[216,6],[223,8],[249,6],[256,8],[280,6],[287,8],[309,6],[316,8],[339,6],[370,6],[402,6],[481,6],[559,6],[589,6],[596,8],[639,6],[646,8],[673,6],[680,8],[702,6],[709,8],[734,6],[765,6],[772,8],[814,6],[821,8],[846,6],[910,6],[917,8],[951,6],[958,8],[989,6]]},"86":{"position":[[168,6],[302,8],[644,8],[948,8]]},"88":{"position":[[164,8]]},"92":{"position":[[23,6]]},"108":{"position":[[1635,8]]},"132":{"position":[[201,8]]},"138":{"position":[[72,8]]},"142":{"position":[[73,8]]},"146":{"position":[[216,8]]},"380":{"position":[[848,8]]},"385":{"position":[[969,8]]},"430":{"position":[[373,8]]},"434":{"position":[[86,9],[536,8],[3121,8]]},"436":{"position":[[45,8]]},"442":{"position":[[87,8]]},"444":{"position":[[624,8]]},"448":{"position":[[1641,8]]}}}],["actual",{"_index":1280,"t":{"190":{"position":[[251,6]]},"204":{"position":[[244,6]]},"238":{"position":[[681,6]]},"282":{"position":[[6792,8]]},"287":{"position":[[1716,6]]},"332":{"position":[[34,8]]},"398":{"position":[[3940,8]]},"406":{"position":[[658,6]]},"420":{"position":[[3142,8]]}}}],["ad",{"_index":395,"t":{"23":{"position":[[3062,6],[3131,5],[3236,6]]},"94":{"position":[[592,6]]},"96":{"position":[[1258,6]]},"112":{"position":[[1021,6]]},"166":{"position":[[196,6]]},"210":{"position":[[271,6]]},"232":{"position":[[485,6]]},"240":{"position":[[192,5]]},"265":{"position":[[438,6],[508,6]]},"272":{"position":[[442,5]]},"289":{"position":[[2880,5]]},"292":{"position":[[633,6]]}}}],["adapt",{"_index":655,"t":{"63":{"position":[[62,7]]}}}],["add",{"_index":420,"t":{"25":{"position":[[430,3]]},"53":{"position":[[209,3],[503,3]]},"96":{"position":[[446,3]]},"170":{"position":[[1675,3]]},"190":{"position":[[4127,3]]},"210":{"position":[[97,3]]},"222":{"position":[[959,3],[2082,3],[3228,3],[3712,3]]},"226":{"position":[[501,4]]},"228":{"position":[[385,4],[804,4]]},"276":{"position":[[0,3],[769,4],[1204,3]]},"278":{"position":[[470,4],[566,4],[674,4],[749,4]]},"289":{"position":[[2363,3],[2797,3]]},"294":{"position":[[1249,3]]},"368":{"position":[[1249,3]]},"383":{"position":[[1152,3],[1633,3]]},"387":{"position":[[220,3],[578,3]]},"391":{"position":[[257,3]]},"420":{"position":[[1166,4],[1487,3]]},"424":{"position":[[172,3]]},"434":{"position":[[216,3],[813,3],[2220,4],[2592,3]]},"436":{"position":[[433,3],[936,3],[1079,3],[1221,3],[1359,3],[1567,3]]},"438":{"position":[[166,3]]},"440":{"position":[[153,3],[296,3],[438,3],[576,3],[784,3]]},"442":{"position":[[393,3],[690,3],[1070,3],[1984,3]]}}}],["add/substitut",{"_index":2520,"t":{"442":{"position":[[1925,14]]}}}],["addit",{"_index":653,"t":{"61":{"position":[[1859,10]]},"94":{"position":[[280,10]]},"108":{"position":[[1449,10],[1523,10]]},"112":{"position":[[1564,10]]},"122":{"position":[[721,10]]},"170":{"position":[[1118,10]]},"250":{"position":[[144,8],[734,10]]},"263":{"position":[[160,10]]},"272":{"position":[[354,10],[395,11],[975,10]]},"282":{"position":[[5331,10]]},"289":{"position":[[665,10]]},"345":{"position":[[496,10]]},"347":{"position":[[859,10]]},"402":{"position":[[1572,10]]},"471":{"position":[[84,10]]}}}],["addition",{"_index":868,"t":{"94":{"position":[[498,13]]},"96":{"position":[[1183,13]]},"112":{"position":[[946,13]]},"289":{"position":[[1077,12],[1834,13]]},"391":{"position":[[213,13]]},"393":{"position":[[984,12]]},"398":{"position":[[3106,12]]},"430":{"position":[[604,13]]}}}],["additionalallowedlibrarytyp",{"_index":1097,"t":{"122":{"position":[[906,29],[2543,32],[3162,32]]}}}],["additionalconfig",{"_index":2240,"t":{"387":{"position":[[452,19]]}}}],["additon",{"_index":1517,"t":{"222":{"position":[[5044,7]]}}}],["address",{"_index":1239,"t":{"174":{"position":[[175,7]]},"190":{"position":[[1134,7]]},"402":{"position":[[484,8],[1830,7]]},"404":{"position":[[130,7],[388,9],[458,7]]}}}],["address/ip",{"_index":1316,"t":{"190":{"position":[[3185,10]]}}}],["addsourc",{"_index":2251,"t":{"387":{"position":[[1125,9]]}}}],["admin",{"_index":522,"t":{"37":{"position":[[372,8],[663,8]]},"53":{"position":[[255,5],[341,5]]},"122":{"position":[[413,5]]},"130":{"position":[[791,8],[1082,8]]},"442":{"position":[[439,5],[525,5]]}}}],["administr",{"_index":875,"t":{"96":{"position":[[303,14]]},"122":{"position":[[123,14]]}}}],["advanc",{"_index":172,"t":{"13":{"position":[[1746,8]]},"118":{"position":[[455,8]]},"194":{"position":[[248,8]]},"446":{"position":[[9,8]]}}}],["advantag",{"_index":2313,"t":{"393":{"position":[[932,9],[1253,9]]}}}],["affect",{"_index":65,"t":{"9":{"position":[[400,7]]},"19":{"position":[[14,6]]},"190":{"position":[[343,6],[400,6]]},"214":{"position":[[192,7],[232,6]]},"222":{"position":[[4220,7]]},"232":{"position":[[642,6]]},"278":{"position":[[541,6]]},"289":{"position":[[2936,6]]},"345":{"position":[[476,6]]}}}],["after=network.target",{"_index":2478,"t":{"424":{"position":[[276,20]]}}}],["afterward",{"_index":419,"t":{"25":{"position":[[393,11]]},"406":{"position":[[1117,11]]}}}],["again",{"_index":696,"t":{"70":{"position":[[237,5]]},"222":{"position":[[4663,5]]},"420":{"position":[[3198,6]]}}}],["against",{"_index":646,"t":{"61":{"position":[[1626,7]]},"232":{"position":[[1590,7]]},"287":{"position":[[228,7]]},"393":{"position":[[802,7]]},"398":{"position":[[2446,7],[4001,7]]}}}],["agent",{"_index":1761,"t":{"272":{"position":[[89,5]]}}}],["aggreg",{"_index":473,"t":{"33":{"position":[[230,10],[388,10]]}}}],["aggress",{"_index":951,"t":{"106":{"position":[[246,12],[397,12],[464,12]]},"278":{"position":[[736,10]]},"282":{"position":[[4166,10]]},"294":{"position":[[1567,12]]}}}],["aggressive/broad",{"_index":1926,"t":{"294":{"position":[[1348,16]]},"311":{"position":[[873,16]]}}}],["agnost",{"_index":613,"t":{"61":{"position":[[391,8]]},"68":{"position":[[473,8]]}}}],["agress",{"_index":1921,"t":{"294":{"position":[[148,11]]}}}],["aio",{"_index":87,"t":{"9":{"position":[[891,3],[984,3]]},"13":{"position":[[310,3],[1969,3],[3097,3],[3499,3],[3623,3]]},"17":{"position":[[19,3]]},"23":{"position":[[846,3],[1603,3],[2227,3],[2584,3],[2715,3],[3562,3]]},"25":{"position":[[440,3]]},"31":{"position":[[218,3]]},"37":{"position":[[9,3],[486,3]]},"43":{"position":[[9,3],[744,3]]},"51":{"position":[[9,3],[899,3]]},"55":{"position":[[9,3],[399,3]]},"59":{"position":[[9,3],[528,3]]},"66":{"position":[[428,3],[915,3]]},"73":{"position":[[566,3],[1036,3]]},"92":{"position":[[369,3]]},"94":{"position":[[652,3]]},"96":{"position":[[1318,3]]},"98":{"position":[[9,3]]},"104":{"position":[[9,3]]},"110":{"position":[[9,3]]},"112":{"position":[[1081,3]]},"114":{"position":[[9,3]]},"120":{"position":[[9,3],[511,3]]},"122":{"position":[[1207,3]]},"128":{"position":[[9,3],[458,3]]},"130":{"position":[[396,3],[592,3],[905,3]]},"136":{"position":[[9,3],[467,3]]},"140":{"position":[[9,3],[209,3],[584,3]]},"144":{"position":[[9,3],[211,3],[542,3]]},"152":{"position":[[9,3],[546,3]]},"156":{"position":[[9,3],[219,3],[566,3]]},"160":{"position":[[9,3],[208,3],[493,3]]},"168":{"position":[[9,3],[281,3]]},"172":{"position":[[9,3],[555,3]]},"176":{"position":[[9,3],[371,3]]},"180":{"position":[[9,3],[398,3]]},"186":{"position":[[198,3],[398,3],[690,3]]},"188":{"position":[[1555,3],[2764,3]]},"192":{"position":[[9,3],[547,3]]},"194":{"position":[[685,3]]},"196":{"position":[[9,3],[454,3]]},"204":{"position":[[1458,3],[1658,3],[1998,3]]},"208":{"position":[[9,3],[323,3]]},"216":{"position":[[9,3],[546,3]]},"220":{"position":[[9,3],[303,3]]},"224":{"position":[[9,3],[692,3]]},"236":{"position":[[40,3],[457,3],[1137,3],[1972,3]]},"259":{"position":[[13,3]]},"261":{"position":[[13,3]]},"272":{"position":[[193,3]]},"303":{"position":[[13,3]]},"305":{"position":[[101,3]]},"307":{"position":[[290,3]]},"309":{"position":[[198,3]]}}}],["airson",{"_index":715,"t":{"75":{"position":[[173,8]]},"81":{"position":[[167,9]]},"194":{"position":[[126,8],[239,8]]},"448":{"position":[[409,8]]}}}],["aka",{"_index":1870,"t":{"287":{"position":[[1104,3]]}}}],["album",{"_index":1193,"t":{"166":{"position":[[69,7],[118,5],[182,5],[212,5],[437,6]]},"206":{"position":[[1136,5],[1443,6]]},"226":{"position":[[150,5],[549,6]]},"238":{"position":[[148,5],[434,5],[448,8],[500,5]]},"242":{"position":[[580,8],[626,5],[758,8],[804,5],[923,8],[958,5],[1040,5]]},"244":{"position":[[853,5],[877,5],[932,5],[1001,6]]},"252":{"position":[[326,8],[377,5]]},"265":{"position":[[667,6]]},"267":{"position":[[64,6]]},"276":{"position":[[696,8],[747,5]]},"282":{"position":[[114,6],[420,5],[615,5],[665,8],[2328,6],[2448,6],[2592,6],[2718,6],[2950,6],[3154,8],[3172,6],[3265,6],[3272,5],[3293,7],[3359,5],[3437,5],[3452,5],[3564,5],[3590,9]]},"287":{"position":[[302,7],[365,5],[408,6],[473,5],[530,5],[796,6]]},"289":{"position":[[952,7],[1030,9],[1484,5],[1566,8],[1674,9],[1725,5],[1827,6],[1869,5],[2178,5],[2498,5],[3103,5]]},"292":{"position":[[471,6],[534,9],[884,6],[947,9]]},"294":{"position":[[179,6]]},"298":{"position":[[567,8]]},"305":{"position":[[344,9]]},"307":{"position":[[721,8]]},"309":{"position":[[441,9]]},"313":{"position":[[243,6]]},"315":{"position":[[282,7]]},"319":{"position":[[437,6]]},"324":{"position":[[19,6],[81,7]]},"330":{"position":[[10,8]]},"349":{"position":[[200,6]]},"389":{"position":[[795,6]]},"420":{"position":[[2910,5]]}}}],["album/artist/titl",{"_index":1817,"t":{"282":{"position":[[2647,18]]}}}],["albumartist",{"_index":1601,"t":{"238":{"position":[[375,15]]},"242":{"position":[[1046,11]]},"298":{"position":[[583,15]]},"307":{"position":[[737,15]]}}}],["albumblacklist",{"_index":1196,"t":{"166":{"position":[[355,17]]},"168":{"position":[[190,17],[443,17]]}}}],["albummbid",{"_index":1818,"t":{"282":{"position":[[3101,12],[3247,9]]}}}],["albumnam",{"_index":2271,"t":{"389":{"position":[[715,10],[802,10]]}}}],["albumweight",{"_index":1904,"t":{"289":{"position":[[2096,14],[2529,14],[2860,11]]},"311":{"position":[[1220,14]]}}}],["alice.bsky.soci",{"_index":667,"t":{"66":{"position":[[135,17],[825,19],[1091,19]]},"73":{"position":[[227,17],[908,20],[1159,20]]},"186":{"position":[[600,19],[866,19]]},"204":{"position":[[908,20],[1117,20],[1347,20],[1812,20],[2127,20]]}}}],["allow",{"_index":99,"t":{"9":{"position":[[1220,7]]},"35":{"position":[[1506,5]]},"45":{"position":[[400,8]]},"61":{"position":[[224,5]]},"68":{"position":[[306,5]]},"108":{"position":[[928,5],[1974,5],[2061,7],[2175,5],[2351,5]]},"122":{"position":[[623,7],[939,5],[2013,5]]},"124":{"position":[[167,5]]},"164":{"position":[[32,5]]},"188":{"position":[[94,7],[398,5],[1338,7],[2130,5]]},"190":{"position":[[1081,6]]},"204":{"position":[[781,8],[1207,5]]},"234":{"position":[[166,6]]},"236":{"position":[[1067,8]]},"287":{"position":[[482,7],[1217,5],[1384,5],[1800,5],[1866,5]]},"296":{"position":[[55,5],[106,5]]},"347":{"position":[[351,5]]},"398":{"position":[[2587,8]]},"416":{"position":[[280,5]]},"442":{"position":[[2214,5]]}}}],["allowed/deni",{"_index":1357,"t":{"204":{"position":[[469,14]]}}}],["allowunknown",{"_index":1100,"t":{"122":{"position":[[1135,15],[2593,15],[3214,15]]}}}],["allowunknownmedia",{"_index":1014,"t":{"108":{"position":[[2080,20],[2407,20]]}}}],["allowunknownmedia=fals",{"_index":2416,"t":{"416":{"position":[[231,24]]}}}],["along",{"_index":210,"t":{"13":{"position":[[3967,5]]},"234":{"position":[[605,5]]}}}],["alongsid",{"_index":1609,"t":{"240":{"position":[[230,9]]},"378":{"position":[[90,9]]},"446":{"position":[[261,9]]}}}],["alphabet",{"_index":84,"t":{"9":{"position":[[835,14]]}}}],["alpin",{"_index":992,"t":{"108":{"position":[[1120,7]]}}}],["alreadi",{"_index":315,"t":{"17":{"position":[[1893,7]]},"23":{"position":[[637,7],[1394,7]]},"35":{"position":[[129,7]]},"53":{"position":[[38,7]]},"66":{"position":[[284,7]]},"70":{"position":[[48,7]]},"73":{"position":[[379,7]]},"77":{"position":[[1651,7]]},"190":{"position":[[1523,7]]},"228":{"position":[[271,7],[414,8],[652,7],[838,7]]},"232":{"position":[[153,7],[389,7],[495,7]]},"265":{"position":[[393,7]]},"282":{"position":[[77,7],[169,7],[4357,7]]},"341":{"position":[[201,7]]},"398":{"position":[[472,7],[2366,7],[2454,7]]},"434":{"position":[[3056,7]]},"442":{"position":[[222,7],[1300,7]]},"448":{"position":[[2076,7]]}}}],["altern",{"_index":1299,"t":{"190":{"position":[[1779,14]]},"194":{"position":[[325,11]]},"282":{"position":[[6461,11]]},"289":{"position":[[239,11]]},"471":{"position":[[442,14]]}}}],["alway",{"_index":356,"t":{"23":{"position":[[171,6]]},"94":{"position":[[732,6]]},"96":{"position":[[1398,6]]},"108":{"position":[[479,6],[1875,6],[2778,6],[2935,6]]},"112":{"position":[[1159,6]]},"130":{"position":[[525,6]]},"140":{"position":[[142,6]]},"144":{"position":[[144,6]]},"156":{"position":[[152,6]]},"160":{"position":[[140,6]]},"186":{"position":[[331,6]]},"190":{"position":[[3760,6]]},"204":{"position":[[1591,6]]},"238":{"position":[[405,6],[471,6],[532,6],[610,6]]},"242":{"position":[[1417,6]]},"252":{"position":[[348,6]]},"276":{"position":[[718,6]]},"278":{"position":[[147,6]]},"282":{"position":[[705,6]]},"287":{"position":[[334,6]]},"289":{"position":[[461,6]]},"345":{"position":[[41,6]]},"398":{"position":[[231,6],[445,6],[695,6],[2619,8]]}}}],["ambplayobject",{"_index":2055,"t":{"349":{"position":[[750,13]]}}}],["amount",{"_index":851,"t":{"92":{"position":[[172,6]]},"265":{"position":[[1463,6]]},"269":{"position":[[367,6]]}}}],["and/or",{"_index":422,"t":{"27":{"position":[[33,6]]},"61":{"position":[[1648,6]]},"88":{"position":[[50,6]]},"148":{"position":[[804,6]]},"206":{"position":[[1436,6]]},"238":{"position":[[141,6]]},"250":{"position":[[394,6]]},"383":{"position":[[2133,6]]},"393":{"position":[[1078,6]]},"398":{"position":[[39,6]]},"430":{"position":[[344,6],[428,6]]},"448":{"position":[[1304,6]]},"462":{"position":[[260,6]]}}}],["android",{"_index":728,"t":{"75":{"position":[[908,7]]}}}],["anecdot",{"_index":1916,"t":{"292":{"position":[[164,12]]}}}],["anniversari",{"_index":1899,"t":{"289":{"position":[[1763,11]]}}}],["annot",{"_index":2153,"t":{"370":{"position":[[905,12]]},"383":{"position":[[554,10]]}}}],["anoth",{"_index":628,"t":{"61":{"position":[[960,7]]},"68":{"position":[[1038,7]]},"332":{"position":[[194,7],[581,7],[644,7]]},"370":{"position":[[34,7]]},"402":{"position":[[2288,7]]}}}],["anotherbadterm",{"_index":1953,"t":{"317":{"position":[[463,17],[507,16],[595,14]]}}}],["anotherus",{"_index":1113,"t":{"122":{"position":[[2399,16],[3010,13]]},"188":{"position":[[2451,13],[2997,13]]}}}],["any/al",{"_index":1025,"t":{"108":{"position":[[3099,7]]},"282":{"position":[[2398,7]]}}}],["anyon",{"_index":1261,"t":{"188":{"position":[[311,6]]}}}],["anyth",{"_index":471,"t":{"33":{"position":[[190,8]]},"51":{"position":[[191,8],[235,8],[739,11],[761,11],[1043,11],[1065,11]]},"144":{"position":[[382,11],[404,11],[686,11],[708,11]]},"150":{"position":[[112,8]]},"282":{"position":[[5385,8]]},"292":{"position":[[408,8],[821,8]]},"434":{"position":[[1939,9]]}}}],["anywher",{"_index":1576,"t":{"232":{"position":[[783,8]]}}}],["apassword",{"_index":1088,"t":{"120":{"position":[[429,11],[664,11]]}}}],["api",{"_index":351,"t":{"23":{"position":[[98,3],[289,3],[1821,3]]},"27":{"position":[[161,3]]},"35":{"position":[[167,3],[251,3],[1034,3]]},"37":{"position":[[98,3]]},"39":{"position":[[269,4],[319,3],[361,3],[503,3]]},"43":{"position":[[101,3],[119,3],[173,3]]},"45":{"position":[[242,3],[255,3],[304,4],[337,3]]},"51":{"position":[[209,3]]},"53":{"position":[[384,3],[533,3]]},"55":{"position":[[146,3]]},"63":{"position":[[240,3]]},"66":{"position":[[614,3]]},"77":{"position":[[1669,3]]},"83":{"position":[[809,4]]},"102":{"position":[[153,3]]},"122":{"position":[[49,3],[154,3],[302,3],[372,3],[618,4],[1389,3],[1416,3]]},"188":{"position":[[1740,3]]},"190":{"position":[[324,4]]},"194":{"position":[[73,3],[630,4]]},"196":{"position":[[165,3]]},"210":{"position":[[109,3],[407,3],[500,3]]},"212":{"position":[[103,3],[376,3],[458,3]]},"218":{"position":[[396,3]]},"222":{"position":[[1860,4],[3054,4],[3524,3]]},"236":{"position":[[407,3]]},"265":{"position":[[1666,3]]},"272":{"position":[[45,3],[295,7],[455,3],[560,3],[864,7]]},"274":{"position":[[215,7]]},"282":{"position":[[1282,3]]},"300":{"position":[[230,3]]},"303":{"position":[[115,7]]},"305":{"position":[[203,7]]},"307":{"position":[[392,7]]},"309":{"position":[[300,7]]},"311":{"position":[[524,7]]},"337":{"position":[[317,3]]},"345":{"position":[[322,3]]},"368":{"position":[[1507,3]]},"374":{"position":[[568,3],[1284,3]]},"380":{"position":[[187,4],[196,4],[763,3],[832,3]]},"385":{"position":[[996,3]]},"389":{"position":[[101,3],[596,3]]},"391":{"position":[[706,8]]},"402":{"position":[[393,5],[648,5],[832,3]]},"412":{"position":[[36,3]]},"434":{"position":[[201,3],[429,3],[3320,3],[3462,3],[3703,3]]},"436":{"position":[[263,3]]},"442":{"position":[[568,3],[911,3],[1338,3],[1422,3]]},"448":{"position":[[398,4],[1416,4]]}}}],["api/health",{"_index":2181,"t":{"380":{"position":[[243,11]]}}}],["api/live/nowplaying/websocket",{"_index":880,"t":{"96":{"position":[[484,31]]}}}],["api/now",{"_index":2186,"t":{"380":{"position":[[492,8]]}}}],["api/rec",{"_index":2183,"t":{"380":{"position":[[414,11]]}}}],["apikey",{"_index":237,"t":{"13":{"position":[[4771,9]]},"17":{"position":[[587,9],[1023,9]]},"43":{"position":[[527,9],[877,9]]},"51":{"position":[[729,9],[1033,9]]},"55":{"position":[[305,9],[566,9]]},"77":{"position":[[2572,9],[3266,9],[3384,9],[3502,9],[3579,9]]},"79":{"position":[[1127,9],[1660,9],[1760,9],[1860,9],[1945,9]]},"122":{"position":[[1471,6],[1579,6],[2265,9],[2903,9]]},"140":{"position":[[367,9],[717,9]]},"144":{"position":[[372,9],[676,9]]},"160":{"position":[[399,9],[660,9]]},"374":{"position":[[1016,9],[1218,9]]},"434":{"position":[[3818,9]]},"436":{"position":[[1765,9]]},"440":{"position":[[982,9]]}}}],["apis/listenbrainz",{"_index":502,"t":{"35":{"position":[[742,18]]}}}],["app",{"_index":307,"t":{"17":{"position":[[1598,5]]},"61":{"position":[[1061,3]]},"68":{"position":[[1139,3]]},"70":{"position":[[153,3],[180,3]]},"73":{"position":[[788,3]]},"75":{"position":[[922,3]]},"79":{"position":[[62,3]]},"108":{"position":[[640,3],[2368,3]]},"110":{"position":[[499,5],[602,5]]},"122":{"position":[[260,3]]},"148":{"position":[[381,4]]},"190":{"position":[[559,3],[757,3],[830,3],[1685,4],[4052,4]]},"244":{"position":[[668,5]]},"337":{"position":[[291,3]]},"360":{"position":[[105,3]]},"362":{"position":[[95,4],[1062,3]]},"370":{"position":[[132,3]]},"376":{"position":[[98,3]]},"402":{"position":[[105,3],[387,5],[642,5],[987,4]]},"409":{"position":[[78,5],[84,3],[166,5],[233,5]]},"416":{"position":[[17,3]]},"434":{"position":[[571,3]]},"448":{"position":[[13,3],[1131,4],[1318,3],[1508,4]]}}}],["app'",{"_index":1329,"t":{"190":{"position":[[4097,5]]}}}],["app.rockski",{"_index":625,"t":{"61":{"position":[[860,14]]}}}],["appear",{"_index":2427,"t":{"420":{"position":[[831,6]]}}}],["append",{"_index":626,"t":{"61":{"position":[[893,8]]},"66":{"position":[[377,6]]},"68":{"position":[[971,8]]},"73":{"position":[[515,6]]},"218":{"position":[[367,6]]},"347":{"position":[[615,6]]},"362":{"position":[[1005,6]]}}}],["appli",{"_index":1599,"t":{"238":{"position":[[41,5],[230,5],[309,5],[412,5],[478,5],[539,5],[617,5]]},"252":{"position":[[181,5],[260,5],[355,5]]},"256":{"position":[[50,7],[169,5],[195,7],[841,7]]},"276":{"position":[[551,5],[630,5],[725,5]]},"278":{"position":[[337,6],[372,8],[806,7],[920,7],[1060,5],[1086,7],[1882,7]]},"298":{"position":[[13,5],[234,8]]}}}],["applic",{"_index":1,"t":{"2":{"position":[[15,11]]},"39":{"position":[[142,12]]},"57":{"position":[[140,12]]},"61":{"position":[[240,12],[423,11],[554,11],[968,11]]},"68":{"position":[[322,12],[505,11],[636,11],[1046,11]]},"75":{"position":[[375,11]]},"77":{"position":[[1306,12],[1639,11]]},"102":{"position":[[374,12]]},"108":{"position":[[1715,11],[1834,11],[2214,12],[2246,11],[2539,11],[2598,11],[2748,11],[2889,12]]},"132":{"position":[[69,12]]},"138":{"position":[[207,12]]},"146":{"position":[[69,12]]},"148":{"position":[[315,11],[720,12]]},"152":{"position":[[287,11]]},"154":{"position":[[239,12]]},"194":{"position":[[32,11]]},"210":{"position":[[206,11]]},"222":{"position":[[2188,11],[2212,11]]},"278":{"position":[[198,12]]},"341":{"position":[[128,11]]},"434":{"position":[[790,11]]},"454":{"position":[[15,11]]},"462":{"position":[[395,10]]}}}],["apppassword",{"_index":705,"t":{"73":{"position":[[929,14],[1180,14]]},"204":{"position":[[929,14],[1138,14],[1368,14],[1833,14],[2148,14]]}}}],["appris",{"_index":454,"t":{"31":{"position":[[1395,8],[1564,10]]},"448":{"position":[[754,8]]}}}],["appriseconfig",{"_index":455,"t":{"31":{"position":[[1435,13]]}}}],["approach",{"_index":1319,"t":{"190":{"position":[[3443,8],[3889,9]]}}}],["appropri",{"_index":1493,"t":{"222":{"position":[[2553,11]]},"296":{"position":[[280,11]]}}}],["aqzi58fa.rfszbm",{"_index":450,"t":{"31":{"position":[[925,18]]}}}],["arch",{"_index":2470,"t":{"422":{"position":[[128,5]]}}}],["architectur",{"_index":2160,"t":{"374":{"position":[[365,12]]},"466":{"position":[[9,12]]}}}],["arg",{"_index":2072,"t":{"360":{"position":[[295,5]]}}}],["arl",{"_index":915,"t":{"102":{"position":[[4,3],[103,3],[270,3],[505,4],[718,3]]},"104":{"position":[[85,3],[219,6],[522,6]]},"106":{"position":[[325,6]]}}}],["arm64",{"_index":2102,"t":{"368":{"position":[[56,5]]}}}],["array",{"_index":187,"t":{"13":{"position":[[2392,5]]},"33":{"position":[[505,5]]},"112":{"position":[[1724,5]]},"242":{"position":[[1137,5]]},"244":{"position":[[210,5],[351,5]]},"319":{"position":[[21,5]]}}}],["artist",{"_index":1199,"t":{"166":{"position":[[478,7],[493,6],[565,7],[580,6]]},"194":{"position":[[172,7],[596,8]]},"206":{"position":[[1117,7],[1423,6],[1701,6],[1755,6]]},"226":{"position":[[137,8],[446,6],[531,6],[607,6]]},"234":{"position":[[296,7],[318,6]]},"236":{"position":[[728,11],[1291,11],[1391,7],[2243,11],[2508,11]]},"238":{"position":[[133,7],[262,10],[331,7],[440,7]]},"242":{"position":[[496,9],[543,6],[674,9],[721,6],[941,8],[984,8],[1032,7],[1210,6],[1325,9],[1450,6],[1519,9],[1595,10],[1620,9]]},"244":{"position":[[833,7],[859,8],[1056,7]]},"248":{"position":[[60,7],[188,7],[259,7],[270,6],[315,7],[371,7],[442,6],[496,7],[561,7],[783,10],[901,10]]},"250":{"position":[[133,7],[278,8],[437,6],[580,8],[596,7],[667,11],[695,7],[745,7],[758,6],[815,7],[890,7],[941,7],[1120,7],[1173,6],[1281,7],[1369,7],[1508,7],[1536,11],[1606,11]]},"252":{"position":[[213,10],[282,7]]},"259":{"position":[[284,11]]},"263":{"position":[[42,7]]},"265":{"position":[[687,7],[1064,8],[1080,6],[1247,6],[1324,8],[1345,6]]},"267":{"position":[[84,7],[461,8]]},"269":{"position":[[151,6],[228,8],[249,6]]},"276":{"position":[[583,10],[652,7]]},"278":{"position":[[689,7],[697,8],[1720,6]]},"282":{"position":[[105,8],[406,7],[604,7],[653,11],[2335,7],[2725,7],[3069,10],[3234,8],[3612,7],[3620,8],[3669,6],[3736,7],[3754,6],[3783,6],[3975,7],[3998,11],[4222,7],[4274,6],[4299,6],[4536,10],[4666,6],[4777,6],[4868,10],[5057,7],[5080,11],[5194,6],[5270,6],[5342,7],[5359,6],[5486,10],[5706,10],[5846,7],[5869,11],[6152,8],[6696,6]]},"289":{"position":[[1500,6],[1533,10],[1852,7],[2194,6],[2624,6],[3050,6]]},"292":{"position":[[258,6],[640,6],[658,8],[729,7],[1062,6],[1125,10]]},"294":{"position":[[171,7],[485,6],[574,6],[611,7],[686,10],[788,7],[813,6],[868,10]]},"298":{"position":[[549,10]]},"305":{"position":[[469,9]]},"307":{"position":[[703,10]]},"309":{"position":[[73,6],[566,9]]},"311":{"position":[[924,9]]},"313":{"position":[[292,7],[305,6],[361,6]]},"315":{"position":[[303,10],[325,8]]},"319":{"position":[[429,7]]},"322":{"position":[[87,6],[312,9]]},"328":{"position":[[10,10]]},"330":{"position":[[42,9]]},"332":{"position":[[17,6],[51,7],[145,6],[165,6],[181,6],[209,6],[220,7],[452,6],[466,6],[552,6],[568,6],[617,6],[632,6],[666,10]]},"349":{"position":[[191,8]]},"389":{"position":[[772,8]]},"412":{"position":[[50,6],[141,8],[263,6],[281,6]]},"416":{"position":[[179,6],[328,6]]},"420":{"position":[[3008,7]]},"434":{"position":[[1504,7]]}}}],["artist(",{"_index":1816,"t":{"282":{"position":[[2599,10],[2957,10],[3341,10]]}}}],["artist/album/titl",{"_index":1839,"t":{"282":{"position":[[6952,18]]}}}],["artist/album/track",{"_index":1053,"t":{"112":{"position":[[329,18]]}}}],["artist/title/album",{"_index":1584,"t":{"234":{"position":[[219,18],[432,18]]},"282":{"position":[[5998,19]]}}}],["artist/track",{"_index":1668,"t":{"248":{"position":[[78,12]]}}}],["artistnam",{"_index":2270,"t":{"389":{"position":[[703,11],[781,13]]}}}],["artists(",{"_index":1814,"t":{"282":{"position":[[2455,11]]}}}],["artists/album/titl",{"_index":1939,"t":{"307":{"position":[[53,21]]}}}],["artists/title/album",{"_index":1938,"t":{"298":{"position":[[146,19]]}}}],["artistsignor",{"_index":1689,"t":{"250":{"position":[[360,13]]},"261":{"position":[[129,16]]}}}],["artistsparsefrom",{"_index":1593,"t":{"236":{"position":[[708,19],[1271,19],[1421,19],[2223,19],[2488,19]]},"250":{"position":[[500,16],[916,16],[1424,16],[1516,19],[1586,19],[1640,19],[1679,19]]},"259":{"position":[[264,19]]}}}],["artistsparsemonolithiconli",{"_index":1692,"t":{"250":{"position":[[1001,26]]}}}],["artistweight",{"_index":1906,"t":{"289":{"position":[[2119,15],[2656,15]]},"311":{"position":[[1262,15]]}}}],["ask",{"_index":1513,"t":{"222":{"position":[[4471,4]]}}}],["aspect",{"_index":2001,"t":{"343":{"position":[[41,7]]},"378":{"position":[[116,7]]}}}],["associ",{"_index":1356,"t":{"204":{"position":[[434,10]]},"287":{"position":[[29,10],[1587,10]]},"307":{"position":[[106,11]]}}}],["assum",{"_index":1137,"t":{"130":{"position":[[502,7]]},"140":{"position":[[117,7]]},"144":{"position":[[118,7]]},"156":{"position":[[122,7]]},"160":{"position":[[116,7]]},"186":{"position":[[306,7]]},"188":{"position":[[1071,9]]},"204":{"position":[[1566,7]]},"238":{"position":[[987,7]]},"272":{"position":[[674,7]]},"389":{"position":[[834,8],[864,8]]},"396":{"position":[[862,8]]},"402":{"position":[[1674,6]]},"434":{"position":[[693,8],[2150,8]]},"475":{"position":[[0,8]]}}}],["assumpt",{"_index":1617,"t":{"240":{"position":[[830,11]]}}}],["async",{"_index":2021,"t":{"347":{"position":[[880,5]]},"387":{"position":[[446,5],[1137,5]]},"391":{"position":[[741,5],[1695,5],[2342,5]]},"393":{"position":[[1762,5]]},"396":{"position":[[675,5]]}}}],["asynchron",{"_index":645,"t":{"61":{"position":[[1584,14]]},"347":{"position":[[335,12]]}}}],["athent",{"_index":1527,"t":{"224":{"position":[[165,13],[224,13],[290,13]]}}}],["atlu",{"_index":1892,"t":{"289":{"position":[[1544,7]]}}}],["atproto",{"_index":664,"t":{"66":{"position":[[57,7],[530,7]]},"68":{"position":[[54,7],[188,7]]},"73":{"position":[[4,7],[131,7],[671,7]]},"198":{"position":[[29,7],[160,7]]}}}],["atproto.at",{"_index":690,"t":{"68":{"position":[[1618,10]]},"204":{"position":[[612,10]]}}}],["attempt",{"_index":734,"t":{"77":{"position":[[419,7],[794,7]]},"206":{"position":[[1098,7]]},"250":{"position":[[1101,7]]},"282":{"position":[[3708,7]]},"292":{"position":[[1084,7]]},"294":{"position":[[1580,7]]},"347":{"position":[[2835,7],[3302,7]]}}}],["attribut",{"_index":1847,"t":{"287":{"position":[[18,10],[164,10],[564,11],[582,10],[1170,10]]},"289":{"position":[[116,9],[622,11],[647,9],[2922,10]]}}}],["attribute_nam",{"_index":1856,"t":{"287":{"position":[[593,15]]}}}],["attribute_name]allow",{"_index":1872,"t":{"287":{"position":[[1316,21]]}}}],["attribute_name]deni",{"_index":1873,"t":{"287":{"position":[[1346,20]]}}}],["attribute_name]prior",{"_index":1885,"t":{"289":{"position":[[814,24]]}}}],["audio",{"_index":1059,"t":{"112":{"position":[[1557,6]]},"122":{"position":[[1053,6]]}}}],["audiobook",{"_index":1099,"t":{"122":{"position":[[980,11]]}}}],["auser",{"_index":1087,"t":{"120":{"position":[[408,8],[643,8]]}}}],["auserw",{"_index":1420,"t":{"212":{"position":[[191,10],[357,7]]}}}],["auth",{"_index":359,"t":{"23":{"position":[[269,4],[1753,7]]},"190":{"position":[[4346,4]]},"222":{"position":[[4329,4],[5360,4]]},"337":{"position":[[179,4]]},"347":{"position":[[1946,5],[1969,4],[2192,4],[2314,4],[2602,4],[2626,4],[3095,4],[3334,4]]},"383":{"position":[[397,4],[629,4]]},"385":{"position":[[112,4],[877,4]]},"391":{"position":[[2057,5],[2090,4]]}}}],["authent",{"_index":319,"t":{"21":{"position":[[67,14]]},"23":{"position":[[1076,14]]},"33":{"position":[[574,14],[629,13]]},"41":{"position":[[86,14]]},"43":{"position":[[261,15],[373,14]]},"45":{"position":[[374,14]]},"47":{"position":[[86,14]]},"51":{"position":[[345,15],[459,14]]},"116":{"position":[[230,14]]},"120":{"position":[[179,14],[245,13]]},"122":{"position":[[459,12],[595,13],[1367,12],[1435,14],[1540,12]]},"150":{"position":[[42,15]]},"152":{"position":[[233,15]]},"188":{"position":[[202,13],[602,13],[776,13],[978,13],[1090,13],[1268,13]]},"190":{"position":[[459,12],[1306,14],[2191,15],[2440,15],[2904,12],[3344,15]]},"210":{"position":[[770,14]]},"222":{"position":[[489,15],[750,14],[1225,14],[4650,12],[4777,14],[4881,14],[4926,12],[5002,14],[5145,14],[5225,14]]},"224":{"position":[[113,14]]},"347":{"position":[[2383,14],[2538,14],[2671,14],[2849,13],[2954,14]]},"380":{"position":[[311,13]]},"385":{"position":[[791,14]]},"404":{"position":[[269,14]]},"406":{"position":[[176,15],[234,15],[267,14],[440,15],[469,14],[563,15],[841,13],[1135,12]]},"434":{"position":[[652,14]]},"444":{"position":[[485,14]]},"452":{"position":[[322,12]]},"454":{"position":[[243,12]]}}}],["author",{"_index":917,"t":{"102":{"position":[[121,10]]},"190":{"position":[[957,14]]},"222":{"position":[[2015,10],[2101,10],[2257,13],[2296,10],[3199,10],[3739,10],[4121,10]]},"347":{"position":[[3205,13]]},"380":{"position":[[385,13]]},"434":{"position":[[1205,9],[1294,13],[4102,9],[4191,13]]},"448":{"position":[[1109,13]]},"462":{"position":[[242,9]]}}}],["auto",{"_index":2534,"t":{"448":{"position":[[1054,4]]}}}],["autom",{"_index":1535,"t":{"226":{"position":[[75,9]]},"360":{"position":[[43,9]]}}}],["automat",{"_index":34,"t":{"7":{"position":[[193,13]]},"23":{"position":[[499,14],[1256,14]]},"61":{"position":[[634,13]]},"66":{"position":[[363,13]]},"68":{"position":[[716,13]]},"73":{"position":[[501,13]]},"77":{"position":[[92,9]]},"94":{"position":[[205,14],[748,13],[796,13]]},"96":{"position":[[432,13],[1414,13],[1462,13],[1758,13],[1846,9]]},"108":{"position":[[812,13]]},"112":{"position":[[518,13],[588,9],[713,9],[1175,13],[1223,13],[1663,9],[2098,13]]},"188":{"position":[[142,13]]},"218":{"position":[[353,13]]},"222":{"position":[[4609,14]]},"254":{"position":[[96,13]]},"315":{"position":[[453,13]]},"372":{"position":[[70,13]]},"398":{"position":[[2122,13]]},"426":{"position":[[254,13]]},"434":{"position":[[1274,13],[4171,13]]},"446":{"position":[[418,13]]}}}],["automix",{"_index":1277,"t":{"190":{"position":[[12,7],[47,7]]}}}],["avahi",{"_index":986,"t":{"108":{"position":[[1038,5],[1167,5],[1205,5],[1250,5]]}}}],["avail",{"_index":261,"t":{"15":{"position":[[146,9],[204,9]]},"33":{"position":[[60,9]]},"94":{"position":[[31,9]]},"110":{"position":[[71,9]]},"170":{"position":[[1576,9]]},"222":{"position":[[5061,9],[5287,9]]},"250":{"position":[[0,9]]},"282":{"position":[[1811,9],[2406,9]]},"368":{"position":[[80,9]]},"446":{"position":[[231,9]]}}}],["avoid",{"_index":383,"t":{"23":{"position":[[1934,5]]},"272":{"position":[[3,5]]},"294":{"position":[[1871,5]]},"368":{"position":[[3287,5]]}}}],["await",{"_index":2255,"t":{"387":{"position":[[1332,5]]},"391":{"position":[[1778,5],[2375,5]]},"393":{"position":[[1945,5]]},"396":{"position":[[761,5]]}}}],["awar",{"_index":416,"t":{"25":{"position":[[231,5]]},"190":{"position":[[3538,6]]},"294":{"position":[[1332,5]]}}}],["az_stat",{"_index":899,"t":{"98":{"position":[[112,10]]}}}],["az_url",{"_index":896,"t":{"98":{"position":[[66,6]]}}}],["azura",{"_index":905,"t":{"98":{"position":[[425,8],[709,8]]}}}],["azura_l",{"_index":888,"t":{"96":{"position":[[1625,11]]},"98":{"position":[[169,10]]}}}],["azura_listeners_num",{"_index":891,"t":{"96":{"position":[[1675,20]]},"98":{"position":[[231,19]]}}}],["azuracast",{"_index":798,"t":{"83":{"position":[[95,9]]},"96":{"position":[[21,9],[222,9],[375,9]]},"98":{"position":[[77,9],[388,12],[672,12]]},"448":{"position":[[135,9]]}}}],["azuracast.json",{"_index":870,"t":{"94":{"position":[[664,14]]},"96":{"position":[[1330,14]]}}}],["b",{"_index":2070,"t":{"360":{"position":[[266,1],[360,1]]}}}],["b2c4",{"_index":1655,"t":{"244":{"position":[[1083,4]]}}}],["back",{"_index":1307,"t":{"190":{"position":[[2697,4]]},"222":{"position":[[4402,4]]},"294":{"position":[[2041,4]]},"420":{"position":[[3026,4]]}}}],["backend",{"_index":1174,"t":{"162":{"position":[[204,7]]},"337":{"position":[[68,7],[94,7],[328,7]]}}}],["background",{"_index":2156,"t":{"372":{"position":[[91,11]]}}}],["backlog",{"_index":2338,"t":{"396":{"position":[[266,11],[582,10]]}}}],["backslash",{"_index":1977,"t":{"332":{"position":[[511,9]]}}}],["bad",{"_index":1194,"t":{"166":{"position":[[178,3],[301,3]]},"294":{"position":[[537,3]]},"313":{"position":[[172,3]]}}}],["bad/incomplet",{"_index":1029,"t":{"108":{"position":[[3218,14]]}}}],["bad\\w+/i",{"_index":1951,"t":{"317":{"position":[[246,11]]}}}],["badmus",{"_index":1118,"t":{"122":{"position":[[2529,13],[3148,10]]},"188":{"position":[[2589,10],[3135,10]]}}}],["badsometh",{"_index":1952,"t":{"317":{"position":[[267,12]]}}}],["badterm",{"_index":1949,"t":{"315":{"position":[[807,7],[832,9]]},"317":{"position":[[107,9],[126,7]]},"319":{"position":[[231,9],[252,10]]}}}],["bais",{"_index":1791,"t":{"278":{"position":[[862,6]]}}}],["balanc",{"_index":1768,"t":{"272":{"position":[[552,7]]}}}],["band",{"_index":1673,"t":{"248":{"position":[[336,4]]},"265":{"position":[[1409,4]]},"269":{"position":[[313,4]]},"282":{"position":[[4595,6],[4656,4],[4930,6]]}}}],["bandcamp",{"_index":1172,"t":{"162":{"position":[[123,9]]}}}],["bar",{"_index":929,"t":{"102":{"position":[[496,3]]},"248":{"position":[[323,3]]},"250":{"position":[[1455,4],[1574,5],[1635,4]]}}}],["barterm",{"_index":1961,"t":{"319":{"position":[[318,9],[360,9]]}}}],["base",{"_index":83,"t":{"9":{"position":[[799,5]]},"13":{"position":[[456,5],[1418,5],[3101,5]]},"27":{"position":[[202,5]]},"35":{"position":[[714,4],[856,4],[904,4],[968,4],[1008,4]]},"37":{"position":[[182,4]]},"41":{"position":[[124,4],[590,4]]},"47":{"position":[[124,4],[584,4]]},"55":{"position":[[97,4]]},"59":{"position":[[200,4]]},"92":{"position":[[101,5],[265,5]]},"96":{"position":[[588,5],[1561,5],[1781,5]]},"106":{"position":[[188,5]]},"108":{"position":[[789,5],[2118,5],[2715,5]]},"110":{"position":[[94,5]]},"112":{"position":[[426,5],[1382,5],[1597,5],[1681,5]]},"148":{"position":[[283,4]]},"196":{"position":[[139,4]]},"204":{"position":[[129,4]]},"206":{"position":[[1567,5]]},"210":{"position":[[458,5]]},"212":{"position":[[139,5]]},"218":{"position":[[515,4]]},"222":{"position":[[1730,5],[3316,4]]},"240":{"position":[[109,5]]},"272":{"position":[[593,4]]},"282":{"position":[[1426,5]]},"289":{"position":[[719,5],[1107,5],[1348,5]]},"294":{"position":[[1175,5],[1264,5],[2012,5],[2052,5]]},"347":{"position":[[36,4],[1165,4],[2002,5]]},"368":{"position":[[2435,4],[2665,4]]},"370":{"position":[[215,4]]},"378":{"position":[[161,5]]},"380":{"position":[[54,5]]},"385":{"position":[[398,4],[538,4]]},"387":{"position":[[73,5]]},"393":{"position":[[1207,5]]},"402":{"position":[[26,5]]},"420":{"position":[[625,5],[2557,6]]}}}],["base_url",{"_index":323,"t":{"21":{"position":[[184,8],[598,8],[832,8]]},"430":{"position":[[582,8]]}}}],["base_url:port/lastfm/callback",{"_index":332,"t":{"21":{"position":[[502,29]]}}}],["base_url=\"http://hostmachineip",{"_index":2129,"t":{"368":{"position":[[2819,31]]}}}],["base_url=192.168.0.100",{"_index":2149,"t":{"370":{"position":[[516,24],[760,24]]}}}],["base_url=http://192.168.0.100:9078",{"_index":2154,"t":{"370":{"position":[[1275,34]]},"432":{"position":[[365,34]]}}}],["base_url=http://192.168.0.101:9078",{"_index":2120,"t":{"368":{"position":[[1123,34]]}}}],["base_url=http://hostmachineip",{"_index":2130,"t":{"368":{"position":[[2957,29]]}}}],["base_url=http://myhostip:9078",{"_index":2121,"t":{"368":{"position":[[1161,29]]}}}],["baseurl",{"_index":324,"t":{"21":{"position":[[196,7]]},"383":{"position":[[852,8]]},"387":{"position":[[743,8]]},"391":{"position":[[162,7],[245,7],[418,9],[818,7],[991,8],[1012,7],[1045,7],[1257,8],[1266,12],[1327,10]]}}}],["baseurl.trim",{"_index":2290,"t":{"391":{"position":[[1069,14]]}}}],["bash",{"_index":2064,"t":{"360":{"position":[[14,4]]}}}],["basic",{"_index":174,"t":{"13":{"position":[[1822,5]]},"108":{"position":[[423,5]]},"190":{"position":[[4103,5]]},"278":{"position":[[659,5],[1711,5]]},"282":{"position":[[1797,5],[2360,7],[2635,9]]},"292":{"position":[[1116,8]]},"305":{"position":[[460,8]]},"311":{"position":[[914,9],[1159,8]]},"347":{"position":[[3089,5]]},"398":{"position":[[1916,5]]},"448":{"position":[[953,5]]}}}],["basic\",\"freetext",{"_index":1811,"t":{"282":{"position":[[1671,19]]}}}],["basicorid",{"_index":1788,"t":{"278":{"position":[[646,10]]},"282":{"position":[[2675,12],[2993,14]]},"294":{"position":[[1030,11],[1901,10]]}}}],["baz",{"_index":1672,"t":{"248":{"position":[[332,3]]}}}],["be",{"_index":841,"t":{"88":{"position":[[85,5]]},"106":{"position":[[629,5]]},"138":{"position":[[416,5]]},"142":{"position":[[302,5]]},"204":{"position":[[555,5]]},"206":{"position":[[1014,5]]},"222":{"position":[[259,5],[5055,5]]},"232":{"position":[[119,5],[357,5],[1479,5],[1575,5]]},"289":{"position":[[2330,5]]},"398":{"position":[[209,5],[2176,5]]},"406":{"position":[[1002,5]]},"448":{"position":[[1615,5]]}}}],["be9f354075cb",{"_index":1661,"t":{"244":{"position":[[1143,12]]}}}],["bearer",{"_index":2045,"t":{"347":{"position":[[3072,6]]}}}],["befor",{"_index":30,"t":{"7":{"position":[[158,6]]},"13":{"position":[[1043,6]]},"77":{"position":[[269,6],[463,6],[644,6],[838,6]]},"206":{"position":[[2230,6]]},"222":{"position":[[3046,7]]},"226":{"position":[[282,6],[823,6]]},"230":{"position":[[61,6]]},"232":{"position":[[203,6],[438,6]]},"282":{"position":[[19,6],[4436,6]]},"294":{"position":[[2026,6]]},"300":{"position":[[260,6]]},"343":{"position":[[461,6]]},"349":{"position":[[659,6]]},"378":{"position":[[191,6]]},"393":{"position":[[2908,6]]},"398":{"position":[[2930,6]]},"402":{"position":[[1386,6]]},"418":{"position":[[0,6]]},"420":{"position":[[3288,6]]},"436":{"position":[[142,6]]},"464":{"position":[[63,6]]},"471":{"position":[[424,6]]}}}],["begin",{"_index":1500,"t":{"222":{"position":[[3016,9],[5468,5]]},"228":{"position":[[83,9]]},"282":{"position":[[29,6]]},"287":{"position":[[1851,5]]},"434":{"position":[[1268,5],[4165,5]]}}}],["behavior",{"_index":56,"t":{"9":{"position":[[214,8],[432,8],[948,8]]},"19":{"position":[[39,8]]},"94":{"position":[[543,8]]},"96":{"position":[[986,8],[1209,8],[1552,8],[1954,9]]},"108":{"position":[[3272,8]]},"112":{"position":[[668,8],[749,8],[972,8]]},"214":{"position":[[210,8],[261,8]]},"236":{"position":[[1114,9]]},"240":{"position":[[610,9]]},"250":{"position":[[1411,8]]},"311":{"position":[[380,8]]},"345":{"position":[[483,9]]},"385":{"position":[[117,9]]},"393":{"position":[[259,8]]},"420":{"position":[[2182,9],[3078,8]]},"471":{"position":[[268,8]]}}}],["behind",{"_index":1162,"t":{"148":{"position":[[877,6]]},"190":{"position":[[1555,6],[1831,6]]},"218":{"position":[[442,6]]}}}],["bell",{"_index":2178,"t":{"380":{"position":[[136,5]]}}}],["belong",{"_index":1849,"t":{"287":{"position":[[93,7],[448,7]]}}}],["below",{"_index":69,"t":{"9":{"position":[[458,7]]},"13":{"position":[[2360,5]]},"23":{"position":[[161,5],[811,5],[1568,5],[2192,5],[3254,5],[3423,6]]},"35":{"position":[[450,5],[948,5]]},"41":{"position":[[560,6]]},"47":{"position":[[554,6]]},"51":{"position":[[156,5]]},"53":{"position":[[586,6]]},"102":{"position":[[248,5]]},"108":{"position":[[3420,5]]},"116":{"position":[[334,6]]},"122":{"position":[[341,5],[2325,5]]},"124":{"position":[[302,6]]},"138":{"position":[[484,6]]},"142":{"position":[[370,6]]},"188":{"position":[[485,5]]},"190":{"position":[[4228,5]]},"278":{"position":[[453,6]]},"332":{"position":[[287,6]]},"347":{"position":[[281,5],[445,6]]},"362":{"position":[[38,5],[639,5]]},"424":{"position":[[185,5]]},"430":{"position":[[597,6]]},"432":{"position":[[433,5]]},"434":{"position":[[3297,6],[3629,5]]},"436":{"position":[[180,6],[1610,6]]},"440":{"position":[[827,6]]},"442":{"position":[[1621,5],[1843,5]]}}}],["benefit",{"_index":1726,"t":{"265":{"position":[[495,7]]},"298":{"position":[[205,7]]},"307":{"position":[[93,7]]},"448":{"position":[[2353,7]]}}}],["best",{"_index":1052,"t":{"112":{"position":[[315,4]]},"280":{"position":[[122,4]]},"289":{"position":[[425,4]]},"406":{"position":[[713,4]]}}}],["better",{"_index":119,"t":{"13":{"position":[[259,6]]},"296":{"position":[[422,6]]}}}],["between",{"_index":40,"t":{"7":{"position":[[304,7]]},"226":{"position":[[655,7]]},"244":{"position":[[506,7]]},"300":{"position":[[452,7]]},"332":{"position":[[432,7]]},"343":{"position":[[88,7]]},"366":{"position":[[23,7]]},"414":{"position":[[230,7]]},"420":{"position":[[677,7],[934,7]]}}}],["bia",{"_index":1945,"t":{"311":{"position":[[1171,4]]}}}],["bidirection",{"_index":1222,"t":{"170":{"position":[[1451,15]]}}}],["bind",{"_index":2124,"t":{"368":{"position":[[1626,4]]}}}],["bind_to_address",{"_index":1237,"t":{"174":{"position":[[129,15]]}}}],["blacklist",{"_index":976,"t":{"108":{"position":[[626,9]]},"164":{"position":[[286,9]]},"172":{"position":[[334,9],[458,12],[686,12]]},"216":{"position":[[460,12],[681,12]]}}}],["blacklistedapp",{"_index":1046,"t":{"110":{"position":[[748,18],[991,18]]}}}],["blacklisteddevic",{"_index":1044,"t":{"110":{"position":[[696,21],[939,21]]}}}],["blank",{"_index":1488,"t":{"222":{"position":[[2290,5],[2396,5]]}}}],["block",{"_index":1590,"t":{"236":{"position":[[98,6]]}}}],["blueski",{"_index":606,"t":{"61":{"position":[[160,10],[666,7],[1097,7]]},"63":{"position":[[16,7],[160,7]]},"66":{"position":[[100,7],[157,7],[256,7],[550,7]]},"68":{"position":[[748,7],[1175,7]]},"70":{"position":[[0,8],[18,7]]},"73":{"position":[[192,7],[249,7],[347,7],[698,7]]},"182":{"position":[[135,10]]},"184":{"position":[[81,7]]},"200":{"position":[[81,7]]}}}],["bluesky/atproto",{"_index":702,"t":{"73":{"position":[[764,15]]}}}],["bodi",{"_index":2306,"t":{"391":{"position":[[2573,4]]},"393":{"position":[[2056,5]]},"396":{"position":[[881,4],[973,4]]}}}],["body.map(x",{"_index":2342,"t":{"396":{"position":[[1000,10]]}}}],["book",{"_index":1098,"t":{"122":{"position":[[971,4]]}}}],["boolean",{"_index":298,"t":{"17":{"position":[[1332,9]]},"250":{"position":[[1030,7]]},"252":{"position":[[29,8]]},"276":{"position":[[262,8]]}}}],["bootleg",{"_index":1851,"t":{"287":{"position":[[387,7],[706,8]]}}}],["both",{"_index":1249,"t":{"178":{"position":[[130,4]]},"230":{"position":[[146,4]]},"250":{"position":[[613,5],[631,4]]},"280":{"position":[[362,4]]},"343":{"position":[[96,5],[397,4]]},"349":{"position":[[490,4]]},"362":{"position":[[215,4]]}}}],["bottom",{"_index":487,"t":{"35":{"position":[[229,7]]},"206":{"position":[[129,6],[449,6]]},"442":{"position":[[1400,7]]}}}],["bowl",{"_index":1682,"t":{"248":{"position":[[794,9],[912,9]]},"282":{"position":[[3080,9],[4547,9],[4613,7],[4879,9],[5497,9],[5593,8],[5717,9]]},"294":{"position":[[697,9],[879,9]]}}}],["box",{"_index":1378,"t":{"206":{"position":[[427,3]]},"289":{"position":[[1788,3]]}}}],["boz",{"_index":1967,"t":{"328":{"position":[[35,4],[60,4]]}}}],["brainz",{"_index":1646,"t":{"244":{"position":[[994,6],[1049,6],[1105,6],[1160,6]]}}}],["brainzclient",{"_index":601,"t":{"59":{"position":[[281,15],[592,15]]}}}],["brainzsourc",{"_index":1170,"t":{"156":{"position":[[319,15],[630,15]]}}}],["branch",{"_index":2062,"t":{"357":{"position":[[8,6]]}}}],["brand",{"_index":1485,"t":{"222":{"position":[[1996,8]]}}}],["break",{"_index":912,"t":{"100":{"position":[[167,8]]},"387":{"position":[[704,6],[1009,6],[1025,6],[1294,6],[1433,6],[1449,6]]},"471":{"position":[[248,8]]}}}],["bridg",{"_index":2122,"t":{"368":{"position":[[1275,6],[2030,6],[2562,6]]}}}],["broadcast",{"_index":1055,"t":{"112":{"position":[[451,11]]},"228":{"position":[[427,10]]}}}],["broken",{"_index":816,"t":{"86":{"position":[[50,6]]}}}],["brows",{"_index":1463,"t":{"222":{"position":[[949,9]]},"406":{"position":[[121,7]]},"420":{"position":[[2971,7]]}}}],["browser",{"_index":534,"t":{"41":{"position":[[53,7],[348,10]]},"47":{"position":[[53,7],[348,10]]},"102":{"position":[[13,7]]},"104":{"position":[[122,7]]},"190":{"position":[[927,7],[2003,7],[2381,7],[2593,7]]},"206":{"position":[[579,7]]},"210":{"position":[[464,8],[518,8]]},"222":{"position":[[207,8],[804,8],[3117,7]]},"368":{"position":[[2762,8]]},"404":{"position":[[242,7],[349,7]]},"406":{"position":[[665,7],[692,8],[1109,7]]},"448":{"position":[[1286,7]]}}}],["bsky.soci",{"_index":673,"t":{"66":{"position":[[384,12]]},"73":{"position":[[522,12]]}}}],["bu",{"_index":998,"t":{"108":{"position":[[1238,3]]}}}],["build",{"_index":1697,"t":{"254":{"position":[[110,6]]},"315":{"position":[[467,6]]},"347":{"position":[[779,5]]},"360":{"position":[[84,8]]},"362":{"position":[[77,5],[617,5]]},"374":{"position":[[245,5],[272,5],[292,8],[438,6]]},"376":{"position":[[76,5]]},"383":{"position":[[377,5]]},"387":{"position":[[67,5],[123,5]]},"389":{"position":[[528,5]]},"391":{"position":[[76,5],[111,5]]}}}],["build/artifact",{"_index":2075,"t":{"360":{"position":[[432,16]]},"362":{"position":[[744,16]]}}}],["builder",{"_index":2058,"t":{"355":{"position":[[32,7]]},"362":{"position":[[789,7]]}}}],["buildsourcesfromconfig",{"_index":2239,"t":{"387":{"position":[[421,22]]}}}],["built",{"_index":605,"t":{"61":{"position":[[135,5]]},"108":{"position":[[1190,5]]},"182":{"position":[[110,5]]},"222":{"position":[[4758,5]]},"234":{"position":[[265,5]]},"248":{"position":[[22,5]]},"343":{"position":[[375,5]]},"347":{"position":[[121,5],[2470,5]]},"364":{"position":[[3,5]]},"368":{"position":[[26,5]]},"387":{"position":[[549,5]]},"448":{"position":[[636,5]]}}}],["bukem",{"_index":1642,"t":{"244":{"position":[[847,5]]}}}],["buserw",{"_index":1423,"t":{"212":{"position":[[275,10],[439,7]]}}}],["busi",{"_index":1744,"t":{"265":{"position":[[968,8],[1431,8]]},"267":{"position":[[365,8]]},"269":{"position":[[335,8]]},"420":{"position":[[2243,4]]}}}],["button",{"_index":964,"t":{"108":{"position":[[47,6]]},"122":{"position":[[227,6]]}}}],["bvki",{"_index":1520,"t":{"222":{"position":[[5129,5]]}}}],["c9f91cdc",{"_index":1819,"t":{"282":{"position":[[3114,9]]}}}],["c9fae8756fbf481ebd9c5bb56bd6540c",{"_index":768,"t":{"77":{"position":[[2582,35]]},"79":{"position":[[1137,35]]},"122":{"position":[[2275,35],[2913,35]]}}}],["cach",{"_index":347,"t":{"23":{"position":[[16,6],[178,6],[331,6],[735,5],[784,6],[930,5],[993,8],[1118,6],[1492,5],[1541,6],[1683,5],[1742,8],[1924,6],[2028,6],[2062,6],[2125,6],[2165,6],[2306,5],[2361,8],[2473,7],[2508,5],[2613,5],[2807,5],[2906,5],[2939,8],[3657,5],[3787,8]]},"265":{"position":[[1637,7],[1648,5]]}}}],["cache_auth",{"_index":378,"t":{"23":{"position":[[1660,10]]}}}],["cache_auth_conn",{"_index":379,"t":{"23":{"position":[[1701,15]]}}}],["cache_metadata",{"_index":387,"t":{"23":{"position":[[2284,14],[3627,14]]}}}],["cache_metadata_conn",{"_index":388,"t":{"23":{"position":[[2324,19],[3675,19]]}}}],["cache_scrobbl",{"_index":371,"t":{"23":{"position":[[903,14],[2780,14]]}}}],["cache_scrobble_conn",{"_index":372,"t":{"23":{"position":[[948,19],[2825,19]]}}}],["cachename].cach",{"_index":391,"t":{"23":{"position":[[2692,18]]}}}],["call",{"_index":352,"t":{"23":{"position":[[102,6],[293,5],[1825,5],[1895,5],[1950,5],[2013,5],[2069,5]]},"75":{"position":[[686,6]]},"265":{"position":[[1670,5]]},"272":{"position":[[564,6]]},"282":{"position":[[1286,5]]},"380":{"position":[[73,6]]},"385":{"position":[[29,6]]}}}],["callback",{"_index":530,"t":{"39":{"position":[[341,8]]},"41":{"position":[[13,10]]},"47":{"position":[[13,10]]},"190":{"position":[[2414,8]]},"192":{"position":[[201,8]]},"337":{"position":[[184,9]]},"345":{"position":[[307,8]]},"347":{"position":[[2344,8]]},"404":{"position":[[580,8]]},"434":{"position":[[3366,8]]},"442":{"position":[[957,8]]},"462":{"position":[[291,8]]}}}],["callback/redirect",{"_index":532,"t":{"39":{"position":[[454,17]]},"404":{"position":[[71,17]]}}}],["can...spotti",{"_index":743,"t":{"77":{"position":[[1161,12]]}}}],["cancel",{"_index":1852,"t":{"287":{"position":[[398,9]]}}}],["candid",{"_index":1581,"t":{"232":{"position":[[1428,12]]},"282":{"position":[[896,11]]},"326":{"position":[[23,12]]}}}],["capabl",{"_index":2339,"t":{"396":{"position":[[278,13]]}}}],["captur",{"_index":652,"t":{"61":{"position":[[1819,8]]},"206":{"position":[[1344,7]]},"332":{"position":[[328,7]]},"448":{"position":[[2364,9]]}}}],["card",{"_index":867,"t":{"94":{"position":[[492,5]]},"96":{"position":[[1177,5]]},"112":{"position":[[940,5]]},"190":{"position":[[4328,4]]},"222":{"position":[[4309,4],[5400,4]]},"434":{"position":[[1197,4],[4094,4]]}}}],["care",{"_index":2315,"t":{"393":{"position":[[1170,4]]},"398":{"position":[[2742,4]]}}}],["case",{"_index":294,"t":{"17":{"position":[[1226,4]]},"96":{"position":[[97,4]]},"148":{"position":[[839,4]]},"164":{"position":[[324,4]]},"166":{"position":[[327,4]]},"206":{"position":[[2223,6]]},"218":{"position":[[163,4]]},"278":{"position":[[390,4]]},"332":{"position":[[374,5]]},"387":{"position":[[590,4],[679,4],[711,4],[1269,4],[1301,4]]}}}],["cast",{"_index":802,"t":{"83":{"position":[[166,4]]},"108":{"position":[[28,4],[162,4],[456,4],[654,5],[697,4],[738,4],[1584,4],[1773,4],[3062,4]]},"110":{"position":[[39,4],[198,4],[300,4],[411,4],[492,6],[595,6]]},"414":{"position":[[11,4],[92,7],[132,4],[463,4],[576,4]]},"416":{"position":[[36,4]]},"448":{"position":[[159,4]]}}}],["catalog",{"_index":649,"t":{"61":{"position":[[1665,9]]}}}],["catch",{"_index":2049,"t":{"347":{"position":[[3286,5]]},"391":{"position":[[1212,5],[2025,5],[2488,5]]},"393":{"position":[[2546,5]]},"396":{"position":[[1052,5]]}}}],["categori",{"_index":819,"t":{"86":{"position":[[71,11]]}}}],["caus",{"_index":947,"t":{"106":{"position":[[49,5]]},"222":{"position":[[332,5]]},"226":{"position":[[691,6]]},"391":{"position":[[1279,7]]},"396":{"position":[[1128,7]]},"420":{"position":[[1676,5],[2476,5]]}}}],["caveat",{"_index":291,"t":{"17":{"position":[[1176,7]]}}}],["cc_blacklist_app",{"_index":1042,"t":{"110":{"position":[[547,17]]}}}],["cc_blacklist_devic",{"_index":1039,"t":{"110":{"position":[[360,20]]}}}],["cc_enabl",{"_index":1031,"t":{"110":{"position":[[161,9]]}}}],["cc_whitelist_app",{"_index":1040,"t":{"110":{"position":[[446,17]]}}}],["cc_whitelist_devic",{"_index":1032,"t":{"110":{"position":[[251,20]]}}}],["cd",{"_index":1995,"t":{"339":{"position":[[313,2]]},"374":{"position":[[134,2]]}}}],["certain",{"_index":837,"t":{"86":{"position":[[994,7]]},"166":{"position":[[4,7]]},"294":{"position":[[57,7]]}}}],["certificates/http",{"_index":1294,"t":{"190":{"position":[[1439,18]]}}}],["cf5b",{"_index":2199,"t":{"383":{"position":[[709,4]]}}}],["chanc",{"_index":1460,"t":{"222":{"position":[[903,6]]},"406":{"position":[[979,6]]}}}],["chang",{"_index":910,"t":{"100":{"position":[[123,6]]},"190":{"position":[[2492,8]]},"206":{"position":[[141,6],[472,7]]},"222":{"position":[[174,6],[4108,8]]},"224":{"position":[[342,7]]},"238":{"position":[[240,7],[315,7],[418,7],[484,7],[545,7],[623,7]]},"252":{"position":[[191,7],[266,7],[361,7]]},"276":{"position":[[561,7],[636,7],[731,7]]},"282":{"position":[[1266,6]]},"298":{"position":[[135,6]]},"393":{"position":[[1230,7],[2631,7],[2655,7]]},"420":{"position":[[646,7],[927,6],[1428,6],[1704,7],[1747,7],[2789,7]]},"434":{"position":[[1993,7],[2335,7]]},"471":{"position":[[257,7],[301,8]]}}}],["changem",{"_index":1406,"t":{"208":{"position":[[242,10],[459,10]]}}}],["charact",{"_index":1688,"t":{"250":{"position":[[81,10],[226,10]]},"317":{"position":[[983,11]]}}}],["check",{"_index":104,"t":{"11":{"position":[[4,5]]},"77":{"position":[[1612,5]]},"90":{"position":[[499,5]]},"94":{"position":[[64,5]]},"116":{"position":[[169,5],[245,7]]},"124":{"position":[[161,5]]},"164":{"position":[[183,5]]},"204":{"position":[[593,5],[714,5]]},"238":{"position":[[744,5]]},"282":{"position":[[48,6]]},"347":{"position":[[1407,5],[1912,5]]},"391":{"position":[[137,5],[1398,5],[1445,5]]},"393":{"position":[[794,7],[2857,6]]},"398":{"position":[[2341,7],[3986,5]]},"402":{"position":[[1357,5],[1547,5],[1596,5],[2146,5],[2398,5]]},"420":{"position":[[697,7],[792,7],[946,6]]},"446":{"position":[[336,5]]},"464":{"position":[[49,5]]},"471":{"position":[[408,5]]}}}],["check/test",{"_index":2040,"t":{"347":{"position":[[2181,10]]}}}],["child",{"_index":2024,"t":{"347":{"position":[[1036,5],[1771,5],[3018,5]]}}}],["choic",{"_index":1881,"t":{"289":{"position":[[430,6],[516,7],[606,7]]}}}],["choos",{"_index":587,"t":{"53":{"position":[[571,6]]},"112":{"position":[[463,7]]},"222":{"position":[[2163,6]]},"278":{"position":[[418,6]]},"282":{"position":[[1215,7]]},"289":{"position":[[3153,6]]}}}],["chosen",{"_index":1903,"t":{"289":{"position":[[2032,7],[2336,6]]}}}],["chrome",{"_index":919,"t":{"102":{"position":[[288,6]]}}}],["chromecast",{"_index":803,"t":{"83":{"position":[[171,12]]},"108":{"position":[[2319,13],[2851,13],[3510,13]]},"110":{"position":[[1047,12]]},"448":{"position":[[164,12]]}}}],["chromecast.j",{"_index":2209,"t":{"383":{"position":[[1344,18]]}}}],["chromecast.json",{"_index":1015,"t":{"108":{"position":[[2273,15],[2805,15],[3464,15]]}}}],["chromecastsourceaioconfig",{"_index":2207,"t":{"383":{"position":[[1287,26]]}}}],["chromecastsourceconfig",{"_index":2208,"t":{"383":{"position":[[1314,22]]}}}],["chromium",{"_index":1413,"t":{"210":{"position":[[449,8]]}}}],["circumv",{"_index":987,"t":{"108":{"position":[[1062,10]]}}}],["cjeb3egaevcd",{"_index":1467,"t":{"222":{"position":[[1122,12]]},"224":{"position":[[487,12],[844,12]]}}}],["class",{"_index":2002,"t":{"343":{"position":[[284,5],[334,5]]},"347":{"position":[[41,6],[1042,5],[1230,5],[1777,5],[2015,5],[2118,6],[3024,5],[3148,5]]},"385":{"position":[[403,5],[454,5],[543,5]]},"387":{"position":[[390,5]]},"389":{"position":[[351,5]]},"391":{"position":[[372,5],[1632,5],[2270,5]]},"393":{"position":[[1699,5]]},"396":{"position":[[454,5]]},"398":{"position":[[897,5],[1760,6],[2816,5],[3488,5]]}}}],["classifi",{"_index":1011,"t":{"108":{"position":[[1882,10]]}}}],["claus",{"_index":1621,"t":{"242":{"position":[[327,6],[375,7]]}}}],["clean",{"_index":1538,"t":{"226":{"position":[[249,6]]},"362":{"position":[[994,5]]}}}],["click",{"_index":864,"t":{"94":{"position":[[420,8]]},"96":{"position":[[1105,8]]},"102":{"position":[[464,5],[747,5],[780,5]]},"112":{"position":[[868,8]]},"122":{"position":[[219,5]]},"190":{"position":[[4290,5]]},"206":{"position":[[431,5]]},"222":{"position":[[4264,5],[5444,5]]},"434":{"position":[[1159,5],[4047,5]]}}}],["client",{"_index":0,"t":{"2":{"position":[[2,6]]},"7":{"position":[[55,6]]},"9":{"position":[[90,7],[185,7],[408,7],[515,7],[756,6],[910,7],[1072,9]]},"13":{"position":[[12,7],[593,6],[1619,6],[1715,7],[2585,10],[3302,6],[3398,7],[4442,10],[4659,10]]},"15":{"position":[[75,6],[175,7],[192,7]]},"17":{"position":[[567,9],[1003,9]]},"29":{"position":[[105,7]]},"31":{"position":[[163,6],[380,10]]},"37":{"position":[[266,8],[290,9],[527,10],[557,8],[581,9]]},"43":{"position":[[507,9],[785,10],[857,9]]},"51":{"position":[[709,9],[940,10],[1013,9]]},"55":{"position":[[212,8],[252,9],[440,10],[473,8],[513,9]]},"59":{"position":[[328,9],[569,10],[639,9]]},"61":{"position":[[1879,7]]},"66":{"position":[[747,9],[956,10],[1013,9]]},"73":{"position":[[874,9],[1077,10],[1125,9]]},"77":{"position":[[628,6],[964,10],[1220,10],[1466,10],[1722,10],[1892,10],[2201,7],[2268,7],[2437,7],[2504,7],[2696,10],[2865,10],[3100,10],[3163,10]]},"79":{"position":[[128,10],[263,10],[398,10],[569,10],[723,10],[1257,10],[1500,10]]},"90":{"position":[[15,7],[57,7],[147,7],[221,10],[302,7],[319,11],[414,8],[433,6],[579,6],[647,6]]},"104":{"position":[[194,10],[497,10]]},"122":{"position":[[2190,10],[2828,10]]},"130":{"position":[[110,8],[176,8],[199,8],[469,6],[545,6]]},"132":{"position":[[165,8]]},"138":{"position":[[95,8],[165,8],[387,8]]},"140":{"position":[[84,6],[162,6]]},"142":{"position":[[96,8],[159,8],[273,8]]},"144":{"position":[[85,6],[164,6]]},"146":{"position":[[180,8]]},"150":{"position":[[18,7]]},"154":{"position":[[117,8],[197,8]]},"156":{"position":[[89,6],[172,6]]},"158":{"position":[[59,8],[83,8]]},"160":{"position":[[83,6],[160,6]]},"174":{"position":[[39,6]]},"182":{"position":[[52,8],[255,8],[323,8]]},"184":{"position":[[45,8]]},"186":{"position":[[16,8],[273,6],[351,6]]},"188":{"position":[[2311,10],[2857,10]]},"190":{"position":[[572,6],[3725,6],[4071,6],[4135,6]]},"192":{"position":[[288,10],[640,10]]},"198":{"position":[[59,8],[334,8],[402,8]]},"200":{"position":[[45,8]]},"202":{"position":[[16,8]]},"204":{"position":[[1533,6],[1611,6]]},"212":{"position":[[202,10],[286,10]]},"222":{"position":[[563,6],[1375,7],[2177,6],[2466,6],[2488,6],[2502,6],[2899,7],[2907,6],[2922,6],[3180,6],[3792,7],[4858,7]]},"224":{"position":[[145,6],[200,6],[428,10],[785,10]]},"226":{"position":[[311,6],[678,6]]},"228":{"position":[[474,7],[491,7],[551,6],[592,6],[739,6]]},"230":{"position":[[162,6],[358,8]]},"232":{"position":[[230,7],[242,8]]},"276":{"position":[[30,6]]},"294":{"position":[[1654,6]]},"298":{"position":[[183,7],[272,6]]},"307":{"position":[[170,7]]},"343":{"position":[[64,7]]},"349":{"position":[[507,7]]},"351":{"position":[[32,6]]},"368":{"position":[[2480,6]]},"370":{"position":[[117,6]]},"374":{"position":[[953,10],[1122,10]]},"389":{"position":[[480,6]]},"393":{"position":[[903,7],[2929,7]]},"398":{"position":[[3014,7],[3373,7],[3669,7],[3973,7]]},"404":{"position":[[11,6]]},"406":{"position":[[433,6]]},"420":{"position":[[2769,7]]},"434":{"position":[[584,6],[3151,8],[3281,7]]},"436":{"position":[[172,7]]},"442":{"position":[[0,7],[135,7]]},"444":{"position":[[355,7]]},"446":{"position":[[253,7]]},"448":{"position":[[517,7],[716,7],[821,7],[1007,6],[1718,6],[1901,7],[2271,7]]},"450":{"position":[[66,8],[224,7]]},"452":{"position":[[372,6],[476,8]]},"454":{"position":[[2,6],[158,6],[265,7]]}}}],["client/secret",{"_index":268,"t":{"17":{"position":[[184,14]]}}}],["client/sourc",{"_index":109,"t":{"13":{"position":[[72,13],[2337,13],[2414,14]]},"33":{"position":[[289,13],[373,14]]}}}],["client1maloja",{"_index":1421,"t":{"212":{"position":[[215,15]]}}}],["client2maloja",{"_index":1424,"t":{"212":{"position":[[299,15]]}}}],["clientconfig",{"_index":2252,"t":{"387":{"position":[[1143,14]]}}}],["clientdefault",{"_index":232,"t":{"13":{"position":[[4322,17]]},"77":{"position":[[535,17]]}}}],["clientid",{"_index":194,"t":{"13":{"position":[[2610,11],[4504,11]]},"77":{"position":[[1001,11],[1257,11]]},"79":{"position":[[165,11],[300,11]]},"192":{"position":[[313,11],[665,11]]},"222":{"position":[[2635,11],[3864,11]]},"224":{"position":[[509,11],[866,11]]}}}],["clients/sourc",{"_index":474,"t":{"33":{"position":[[255,15],[545,15]]}}}],["clientsecret",{"_index":196,"t":{"13":{"position":[[2658,15],[4552,15]]},"77":{"position":[[1033,15],[1380,15]]},"79":{"position":[[197,15],[332,15]]},"192":{"position":[[361,15],[713,15]]},"222":{"position":[[2692,15],[3921,15]]},"224":{"position":[[564,15],[921,15]]}}}],["clone",{"_index":1992,"t":{"339":{"position":[[179,5],[259,5]]},"374":{"position":[[0,5],[80,5]]},"475":{"position":[[67,6]]}}}],["close",{"_index":1838,"t":{"282":{"position":[[6829,6]]},"285":{"position":[[77,5]]},"289":{"position":[[1255,7]]},"311":{"position":[[150,5]]},"406":{"position":[[1097,7]]}}}],["cloud",{"_index":1478,"t":{"222":{"position":[[1785,5],[4156,5]]},"452":{"position":[[145,5]]}}}],["clv",{"_index":1518,"t":{"222":{"position":[[5120,4]]}}}],["code",{"_index":552,"t":{"45":{"position":[[233,5]]},"190":{"position":[[997,4],[3667,4]]},"222":{"position":[[5115,4],[5258,4]]},"287":{"position":[[1061,4]]},"406":{"position":[[136,5],[302,5]]}}}],["cog",{"_index":582,"t":{"53":{"position":[[353,4]]},"442":{"position":[[537,4]]}}}],["collect",{"_index":1321,"t":{"190":{"position":[[3554,7]]},"204":{"position":[[679,10]]},"226":{"position":[[371,10]]},"292":{"position":[[751,10]]},"298":{"position":[[83,10]]}}}],["collid",{"_index":313,"t":{"17":{"position":[[1774,7]]}}}],["collis",{"_index":311,"t":{"17":{"position":[[1683,10]]}}}],["column",{"_index":939,"t":{"102":{"position":[[763,6]]}}}],["combin",{"_index":1604,"t":{"238":{"position":[[881,9]]},"276":{"position":[[1222,8]]},"278":{"position":[[400,8]]},"289":{"position":[[2825,8],[3066,8]]},"294":{"position":[[598,8]]},"374":{"position":[[384,11]]},"412":{"position":[[130,10]]}}}],["come",{"_index":955,"t":{"106":{"position":[[428,5]]},"232":{"position":[[987,6]]},"265":{"position":[[305,6]]},"294":{"position":[[1472,5]]},"296":{"position":[[70,4]]}}}],["comma",{"_index":1033,"t":{"110":{"position":[[314,5],[425,5],[505,5],[608,5]]},"122":{"position":[[1623,5],[1713,5],[1814,5],[1889,5],[1976,5],[2062,5]]},"172":{"position":[[186,5],[263,5]]},"188":{"position":[[1764,5],[1846,5],[1939,5],[2010,5],[2093,5],[2175,5]]},"216":{"position":[[225,5],[314,5]]},"278":{"position":[[293,5]]},"332":{"position":[[605,5]]},"434":{"position":[[2822,5]]},"436":{"position":[[1621,5]]},"440":{"position":[[838,5]]}}}],["command",{"_index":1381,"t":{"206":{"position":[[755,7],[945,7]]},"362":{"position":[[645,7],[1042,7]]},"364":{"position":[[90,7]]},"368":{"position":[[3452,8]]},"473":{"position":[[191,7],[218,7]]}}}],["commerci",{"_index":1740,"t":{"265":{"position":[[855,10]]},"267":{"position":[[252,10]]}}}],["commit",{"_index":270,"t":{"17":{"position":[[251,9]]},"357":{"position":[[22,6]]},"475":{"position":[[103,7]]}}}],["common",{"_index":433,"t":{"29":{"position":[[30,6]]},"108":{"position":[[415,7]]},"206":{"position":[[2178,6]]},"248":{"position":[[290,6],[507,6]]},"282":{"position":[[4236,6],[4258,6],[5170,6],[5566,6]]},"294":{"position":[[391,6]]},"332":{"position":[[390,6]]},"343":{"position":[[308,6],[434,6]]},"378":{"position":[[236,6]]},"383":{"position":[[64,6],[415,6]]},"414":{"position":[[44,6],[353,6]]},"446":{"position":[[530,6]]}}}],["common.j",{"_index":2193,"t":{"383":{"position":[[258,15]]}}}],["common/errors/upstreamerror.j",{"_index":2298,"t":{"391":{"position":[[1573,36],[2211,36]]}}}],["common/infrastructure/atomic.j",{"_index":2225,"t":{"385":{"position":[[337,37]]},"389":{"position":[[247,37]]},"393":{"position":[[1639,37]]},"396":{"position":[[394,37]]}}}],["common/infrastructure/config/source/coolplayer.j",{"_index":2221,"t":{"385":{"position":[[203,55]]}}}],["commonclientconfig",{"_index":2009,"t":{"345":{"position":[[136,19]]}}}],["commonsourceconfig",{"_index":2008,"t":{"345":{"position":[[113,18]]},"383":{"position":[[283,19],[918,18]]}}}],["commonsourcedata",{"_index":2194,"t":{"383":{"position":[[303,16],[504,17]]}}}],["commun",{"_index":820,"t":{"86":{"position":[[86,13]]},"116":{"position":[[32,11]]},"124":{"position":[[32,11]]},"170":{"position":[[34,13],[315,12],[382,13],[1473,13]]},"174":{"position":[[3,12]]},"206":{"position":[[3,12]]},"222":{"position":[[8,13]]},"337":{"position":[[300,12]]},"347":{"position":[[1468,11],[2410,11]]},"448":{"position":[[1381,12]]},"452":{"position":[[307,11]]},"454":{"position":[[228,11]]}}}],["compar",{"_index":1340,"t":{"194":{"position":[[605,8]]},"228":{"position":[[218,8],[599,8]]},"230":{"position":[[76,8],[93,8],[116,8],[523,10]]},"232":{"position":[[69,7],[125,8],[307,7],[363,8],[718,7],[1050,7],[1067,7],[1413,10],[1485,8],[1581,8]]},"326":{"position":[[10,10]]},"398":{"position":[[2395,9]]}}}],["comparison",{"_index":1579,"t":{"232":{"position":[[1198,10],[1326,11]]}}}],["compat",{"_index":811,"t":{"83":{"position":[[798,10]]},"448":{"position":[[387,10]]}}}],["compens",{"_index":2423,"t":{"420":{"position":[[532,10]]}}}],["compil",{"_index":1854,"t":{"287":{"position":[[461,11],[899,12],[1470,12],[1516,15]]}}}],["complet",{"_index":535,"t":{"41":{"position":[[105,10]]},"47":{"position":[[105,10]]},"61":{"position":[[1410,9]]},"190":{"position":[[948,8],[1289,8],[2180,10],[3335,8]]},"222":{"position":[[5322,10]]},"294":{"position":[[4,9]]},"296":{"position":[[481,10]]},"347":{"position":[[2305,8]]},"404":{"position":[[258,10]]},"406":{"position":[[257,9]]},"434":{"position":[[1311,9],[4208,9]]}}}],["complex",{"_index":184,"t":{"13":{"position":[[2276,7],[3901,7]]}}}],["complic",{"_index":2528,"t":{"446":{"position":[[187,11]]}}}],["compon",{"_index":1775,"t":{"276":{"position":[[825,9]]},"311":{"position":[[281,9]]},"343":{"position":[[145,10],[158,9],[263,9],[362,9]]},"345":{"position":[[24,9],[265,9],[427,9]]},"347":{"position":[[0,10],[108,9],[195,9],[726,9],[975,9],[1501,9],[1592,9],[1643,9],[1992,9],[2108,9],[2206,9],[2364,9]]},"349":{"position":[[552,9]]}}}],["compos",{"_index":138,"t":{"13":{"position":[[766,7]]},"17":{"position":[[792,7]]},"23":{"position":[[615,8],[1372,8],[3167,7]]},"53":{"position":[[311,7]]},"170":{"position":[[1093,7]]},"343":{"position":[[171,8]]},"368":{"position":[[1591,7],[1794,7],[1908,8],[2259,7],[2353,8],[2793,7],[2881,8],[3095,8]]},"370":{"position":[[56,7],[345,7]]},"430":{"position":[[84,8]]},"442":{"position":[[495,7]]},"444":{"position":[[237,7]]},"473":{"position":[[14,7],[271,7],[291,7]]}}}],["compose.yaml",{"_index":1215,"t":{"170":{"position":[[1144,12]]}}}],["compose.yml",{"_index":139,"t":{"13":{"position":[[781,11]]},"23":{"position":[[3189,11]]},"53":{"position":[[112,12],[145,11]]},"368":{"position":[[259,12],[344,11],[1924,11],[2369,11],[2897,11],[3635,11]]},"370":{"position":[[292,11],[859,11],[925,11]]},"430":{"position":[[264,11]]},"432":{"position":[[76,11],[123,11]]},"434":{"position":[[274,11],[315,11],[871,11],[912,11],[1845,11],[1886,11],[2232,11],[2650,11],[2691,11],[3598,11]]},"436":{"position":[[490,11],[531,11],[992,11],[1033,11],[1135,11],[1176,11],[1277,11],[1318,11],[1415,11],[1456,11]]},"438":{"position":[[223,11],[264,11]]},"440":{"position":[[209,11],[250,11],[352,11],[393,11],[494,11],[535,11],[632,11],[673,11]]},"442":{"position":[[296,12],[329,11],[748,11],[817,11],[1128,11],[1197,11],[2034,11],[2103,11]]},"444":{"position":[[168,11]]}}}],["compositeconfig",{"_index":2257,"t":{"387":{"position":[[1365,15]]}}}],["compris",{"_index":1799,"t":{"280":{"position":[[215,9]]}}}],["concern",{"_index":425,"t":{"27":{"position":[[74,8]]}}}],["concret",{"_index":1563,"t":{"230":{"position":[[259,8]]},"343":{"position":[[275,8]]}}}],["condit",{"_index":893,"t":{"96":{"position":[[1801,10]]},"238":{"position":[[898,9]]},"240":{"position":[[583,10]]},"242":{"position":[[1097,10],[1150,10],[1188,9],[1402,9]]},"252":{"position":[[114,11]]},"276":{"position":[[347,10]]},"322":{"position":[[15,11]]}}}],["config",{"_index":88,"t":{"9":{"position":[[902,7],[995,8],[1190,8]]},"13":{"position":[[100,6],[132,6],[633,6],[1322,7],[1973,6],[1995,7],[2505,6],[3503,6],[3627,6],[4019,6]]},"17":{"position":[[502,7]]},"23":{"position":[[585,8],[795,6],[971,7],[1052,9],[1342,8],[1552,6],[1720,7],[1797,9],[2176,6],[2588,7],[2848,7],[2998,9]]},"31":{"position":[[662,6],[1017,6],[1417,6]]},"35":{"position":[[1552,6]]},"37":{"position":[[17,6],[217,6],[490,6]]},"41":{"position":[[434,7]]},"43":{"position":[[17,6],[415,6],[748,6]]},"47":{"position":[[427,7]]},"49":{"position":[[164,7]]},"51":{"position":[[17,6],[615,6],[903,6]]},"55":{"position":[[17,6],[159,6],[403,6]]},"59":{"position":[[17,6],[232,6],[532,6]]},"66":{"position":[[436,6],[669,6],[919,6]]},"73":{"position":[[574,6],[806,6],[1040,6]]},"77":{"position":[[173,6],[337,6],[525,6],[712,6],[900,6]]},"79":{"position":[[100,7]]},"90":{"position":[[671,7]]},"92":{"position":[[373,7]]},"94":{"position":[[656,7]]},"96":{"position":[[717,6],[1322,7]]},"106":{"position":[[175,6]]},"108":{"position":[[3403,6]]},"110":{"position":[[100,7]]},"112":{"position":[[1085,7],[1738,6]]},"118":{"position":[[52,6],[666,6]]},"120":{"position":[[17,6],[293,6],[515,6]]},"126":{"position":[[50,6],[658,6]]},"128":{"position":[[17,6],[224,6],[462,6]]},"130":{"position":[[312,6],[328,6],[404,6],[476,6],[596,6],[636,6],[909,6]]},"136":{"position":[[17,6],[297,6],[471,6]]},"140":{"position":[[17,6],[91,6],[213,6],[255,6],[588,6]]},"144":{"position":[[17,6],[92,6],[215,6],[258,6],[546,6]]},"152":{"position":[[17,6],[376,6],[550,6]]},"156":{"position":[[17,6],[96,6],[223,6],[270,6],[570,6]]},"158":{"position":[[196,6],[212,6]]},"160":{"position":[[17,6],[90,6],[212,6],[253,6],[497,6]]},"162":{"position":[[407,6],[967,6]]},"164":{"position":[[154,7]]},"168":{"position":[[17,6],[49,6],[285,6]]},"172":{"position":[[17,6],[349,6],[559,6]]},"174":{"position":[[121,7]]},"176":{"position":[[17,6],[129,6],[375,6]]},"180":{"position":[[17,6],[166,6],[402,6]]},"186":{"position":[[129,6],[145,6],[206,6],[280,6],[402,6],[444,6],[694,6]]},"188":{"position":[[1563,6],[2241,6],[2768,6]]},"192":{"position":[[17,6],[215,6],[551,6]]},"196":{"position":[[17,6],[181,6],[458,6]]},"202":{"position":[[130,6],[146,6]]},"204":{"position":[[1466,6],[1540,6],[1662,6],[1704,6],[2002,6]]},"206":{"position":[[1573,7]]},"208":{"position":[[17,6],[130,6],[327,6]]},"212":{"position":[[145,7]]},"216":{"position":[[17,6],[340,6],[550,6]]},"220":{"position":[[17,6],[126,6],[307,6]]},"222":{"position":[[995,6],[4724,7]]},"224":{"position":[[17,6],[355,6],[696,6]]},"226":{"position":[[16,7]]},"236":{"position":[[44,6],[461,7],[767,7],[1141,7],[1478,7],[1666,7],[1976,7],[2282,7]]},"244":{"position":[[110,6]]},"250":{"position":[[1488,6]]},"254":{"position":[[257,7]]},"256":{"position":[[68,6]]},"259":{"position":[[17,7],[323,7]]},"261":{"position":[[17,7],[222,7]]},"263":{"position":[[255,7]]},"265":{"position":[[1527,6]]},"272":{"position":[[197,7]]},"278":{"position":[[99,6]]},"287":{"position":[[612,7]]},"300":{"position":[[557,7]]},"303":{"position":[[17,7],[193,7]]},"305":{"position":[[10,6],[57,7],[80,7],[105,7],[506,7]]},"307":{"position":[[294,7],[528,7]]},"309":{"position":[[202,7],[603,7]]},"315":{"position":[[589,7]]},"347":{"position":[[1145,6],[1236,6],[1257,6],[3128,6],[3376,6]]},"383":{"position":[[21,6],[71,6],[104,6],[156,7],[1960,6]]},"385":{"position":[[93,6],[549,6],[575,7],[630,7],[739,7]]},"387":{"position":[[28,7],[86,7],[166,6],[1097,6]]},"398":{"position":[[3428,7]]},"409":{"position":[[88,6]]},"420":{"position":[[2344,6]]},"424":{"position":[[62,7]]},"434":{"position":[[1801,6],[3544,8]]},"442":{"position":[[2260,6]]},"471":{"position":[[328,7]]}}}],["config.json",{"_index":373,"t":{"23":{"position":[[979,11],[1728,11],[2347,11],[2925,11],[3773,11]]},"25":{"position":[[444,11],[456,11]]},"31":{"position":[[222,11],[344,11],[809,11],[1162,11],[1542,11]]},"112":{"position":[[1802,11]]},"236":{"position":[[51,11],[469,11],[1149,11],[1984,11]]},"259":{"position":[[25,11]]},"261":{"position":[[25,11]]},"272":{"position":[[205,11],[774,11]]},"274":{"position":[[125,11]]},"303":{"position":[[25,11]]},"305":{"position":[[113,11]]},"307":{"position":[[302,11]]},"309":{"position":[[210,11]]},"311":{"position":[[434,11]]},"315":{"position":[[178,11]]},"383":{"position":[[1073,13]]},"409":{"position":[[246,11]]}}}],["config/config.json",{"_index":203,"t":{"13":{"position":[[2994,19]]},"374":{"position":[[874,20],[895,20]]}}}],["config/config.json.exampl",{"_index":207,"t":{"13":{"position":[[3681,27]]}}}],["config/data",{"_index":2144,"t":{"370":{"position":[[224,11]]}}}],["config/endpointlfm.json",{"_index":1146,"t":{"136":{"position":[[309,23]]}}}],["config/endpointlz.json",{"_index":1168,"t":{"152":{"position":[[388,22]]}}}],["config/kodi.json",{"_index":1132,"t":{"128":{"position":[[236,16]]}}}],["config/koito.json",{"_index":516,"t":{"37":{"position":[[229,17]]},"130":{"position":[[648,17]]}}}],["config/lastfm.json",{"_index":549,"t":{"43":{"position":[[427,18]]},"140":{"position":[[267,18]]}}}],["config/librefm.json",{"_index":568,"t":{"51":{"position":[[627,19]]},"144":{"position":[[270,19]]}}}],["config/listenbrainz.json",{"_index":600,"t":{"59":{"position":[[244,24]]},"156":{"position":[[282,24]]}}}],["config/maloja.json",{"_index":590,"t":{"55":{"position":[[171,18]]},"160":{"position":[[265,18]]}}}],["config/mopidy.json",{"_index":1200,"t":{"168":{"position":[[61,18]]}}}],["config/mpd.json",{"_index":1244,"t":{"176":{"position":[[141,15]]}}}],["config/mpris.json",{"_index":1234,"t":{"172":{"position":[[361,17]]}}}],["config/musiccast.json",{"_index":1444,"t":{"220":{"position":[[138,21]]}}}],["config/musikcube.json",{"_index":1256,"t":{"180":{"position":[[178,21]]}}}],["config/plex.json",{"_index":1273,"t":{"188":{"position":[[2253,16]]}}}],["config/rocksky.json",{"_index":677,"t":{"66":{"position":[[681,19]]},"186":{"position":[[456,19]]}}}],["config/spotify.json",{"_index":1335,"t":{"192":{"position":[[227,19]]}}}],["config/subsonic.json",{"_index":1344,"t":{"196":{"position":[[193,20]]}}}],["config/systemd/us",{"_index":2472,"t":{"424":{"position":[[79,22]]}}}],["config/systemd/user/multi",{"_index":2474,"t":{"424":{"position":[[108,28]]}}}],["config/tealfm.json",{"_index":703,"t":{"73":{"position":[[818,18]]},"204":{"position":[[1716,18]]}}}],["config/vlc.json",{"_index":1394,"t":{"206":{"position":[[1581,15],[2376,15]]},"208":{"position":[[142,15]]}}}],["config/webscrobbler.json",{"_index":1433,"t":{"216":{"position":[[352,24]]}}}],["config/ytmusic.json",{"_index":1531,"t":{"224":{"position":[[367,19]]}}}],["config:/config",{"_index":1713,"t":{"256":{"position":[[1024,18]]},"278":{"position":[[2104,18]]},"368":{"position":[[1202,18],[1980,18]]},"370":{"position":[[1404,18]]},"432":{"position":[[468,18]]}}}],["config_dir",{"_index":154,"t":{"13":{"position":[[1209,10],[2458,11],[2869,10]]},"23":{"position":[[2636,10]]}}}],["config_dir/azuracast.json",{"_index":904,"t":{"98":{"position":[[350,25]]}}}],["config_dir/chromecast.json",{"_index":1043,"t":{"110":{"position":[[637,26]]}}}],["config_dir/config.json",{"_index":213,"t":{"13":{"position":[[4034,22]]},"37":{"position":[[502,22]]},"43":{"position":[[760,22]]},"51":{"position":[[915,22]]},"55":{"position":[[415,22]]},"59":{"position":[[544,22]]},"66":{"position":[[931,22]]},"73":{"position":[[1052,22]]},"77":{"position":[[0,22]]},"98":{"position":[[624,22]]},"104":{"position":[[420,22]]},"110":{"position":[[871,22]]},"114":{"position":[[287,22]]},"120":{"position":[[527,22]]},"122":{"position":[[2750,22]]},"128":{"position":[[474,22]]},"130":{"position":[[921,22]]},"136":{"position":[[483,22]]},"140":{"position":[[600,22]]},"144":{"position":[[558,22]]},"152":{"position":[[562,22]]},"156":{"position":[[582,22]]},"160":{"position":[[509,22]]},"168":{"position":[[297,22]]},"172":{"position":[[571,22]]},"176":{"position":[[387,22]]},"180":{"position":[[414,22]]},"186":{"position":[[706,22]]},"188":{"position":[[2780,22]]},"192":{"position":[[563,22]]},"196":{"position":[[470,22]]},"204":{"position":[[2014,22]]},"208":{"position":[[339,22]]},"216":{"position":[[562,22]]},"220":{"position":[[319,22]]},"224":{"position":[[708,22]]}}}],["config_dir/deezer.json",{"_index":941,"t":{"104":{"position":[[130,22]]}}}],["config_dir/endpointlz.json",{"_index":792,"t":{"79":{"position":[[1441,26]]}}}],["config_dir/icecast.json",{"_index":1068,"t":{"114":{"position":[[102,23]]}}}],["config_dir/jellyfin.json",{"_index":790,"t":{"79":{"position":[[1017,24]]},"122":{"position":[[2123,24]]}}}],["config_dir/jriver.json",{"_index":1085,"t":{"120":{"position":[[305,22]]}}}],["config_dir/lastfm.json",{"_index":90,"t":{"9":{"position":[[1004,22]]},"79":{"position":[[1889,22]]}}}],["config_dir/maloja.json",{"_index":793,"t":{"79":{"position":[[1563,22]]}}}],["config_dir/plex.json",{"_index":789,"t":{"79":{"position":[[524,20]]}}}],["config_dir/spotify.json",{"_index":192,"t":{"13":{"position":[[2520,23]]},"79":{"position":[[0,23]]}}}],["config_dir/ytmusic.json",{"_index":791,"t":{"79":{"position":[[1206,23]]}}}],["configs.push",{"_index":2248,"t":{"387":{"position":[[860,14]]}}}],["configur",{"_index":72,"t":{"9":{"position":[[535,10],[815,13]]},"11":{"position":[[47,14]]},"13":{"position":[[24,10],[158,13],[181,13],[224,14],[462,13],[1147,13],[1384,9],[1424,13],[1755,13],[1828,13],[1859,13],[1922,14],[2140,13],[2284,14],[2808,13],[3068,9],[3107,13],[3765,13],[3909,14],[3952,14]]},"15":{"position":[[8,13],[82,15],[256,13],[300,9],[321,13]]},"17":{"position":[[23,14],[211,13]]},"21":{"position":[[215,13],[453,14],[583,14]]},"23":{"position":[[213,12],[480,10],[526,10],[571,13],[751,14],[1237,10],[1283,10],[1328,13],[1508,14],[2132,14],[2481,14],[2558,10],[3408,14]]},"25":{"position":[[89,13]]},"31":{"position":[[42,10],[200,10],[302,10]]},"35":{"position":[[1492,10]]},"41":{"position":[[546,13]]},"45":{"position":[[359,14]]},"47":{"position":[[540,13]]},"53":{"position":[[548,13]]},"57":{"position":[[385,14]]},"88":{"position":[[134,13]]},"90":{"position":[[97,13],[403,10],[443,10]]},"92":{"position":[[626,10]]},"94":{"position":[[291,14]]},"96":{"position":[[1601,11],[1734,10],[1835,10]]},"108":{"position":[[605,9],[767,10],[795,13],[914,10],[2124,14],[2156,10],[2721,13]]},"110":{"position":[[27,11]]},"112":{"position":[[703,9],[2059,10]]},"116":{"position":[[320,13]]},"122":{"position":[[327,13],[1168,14],[1183,14]]},"124":{"position":[[288,13]]},"130":{"position":[[99,10],[208,13],[272,14],[372,14],[552,14]]},"134":{"position":[[29,13]]},"136":{"position":[[151,14]]},"138":{"position":[[84,10],[286,9],[351,13],[470,13]]},"140":{"position":[[169,14]]},"142":{"position":[[85,10],[171,9],[236,13],[356,13]]},"144":{"position":[[171,14]]},"148":{"position":[[29,13],[298,11]]},"150":{"position":[[202,13]]},"152":{"position":[[149,14]]},"154":{"position":[[106,10],[485,14]]},"156":{"position":[[179,14]]},"158":{"position":[[92,13],[156,14]]},"160":{"position":[[167,14]]},"162":{"position":[[748,13],[835,13]]},"170":{"position":[[1009,10]]},"178":{"position":[[26,9]]},"182":{"position":[[244,10]]},"186":{"position":[[25,13],[89,14],[358,14]]},"188":{"position":[[491,13],[1531,14]]},"190":{"position":[[1940,10],[2252,13],[4206,13]]},"194":{"position":[[689,13]]},"198":{"position":[[323,10]]},"202":{"position":[[25,13],[90,14]]},"204":{"position":[[362,10],[1618,14]]},"206":{"position":[[869,13],[2362,13]]},"214":{"position":[[10,10],[279,10]]},"222":{"position":[[1879,9],[4984,14]]},"230":{"position":[[314,13]]},"236":{"position":[[23,10],[260,13],[370,9],[1055,11],[1836,14],[1863,13]]},"238":{"position":[[1079,11]]},"240":{"position":[[25,10]]},"250":{"position":[[31,14]]},"254":{"position":[[60,14],[149,14]]},"256":{"position":[[12,13],[368,13],[543,13]]},"263":{"position":[[177,13]]},"265":{"position":[[1604,14]]},"272":{"position":[[171,13],[459,14]]},"274":{"position":[[69,10],[89,13]]},"276":{"position":[[874,13]]},"278":{"position":[[12,13],[50,10],[246,9],[949,13],[1259,13],[1440,13]]},"280":{"position":[[387,14]]},"282":{"position":[[532,13],[1522,14],[1962,13],[2208,13],[2522,13],[2880,13],[3481,13],[3881,13],[4177,13],[4385,10],[4956,13],[5746,13],[6851,13]]},"285":{"position":[[129,13]]},"287":{"position":[[1910,14]]},"289":{"position":[[799,14],[2420,13]]},"292":{"position":[[73,13]]},"309":{"position":[[18,10]]},"311":{"position":[[338,13],[420,13]]},"315":{"position":[[10,13],[102,13],[417,14]]},"341":{"position":[[105,14]]},"343":{"position":[[240,13]]},"345":{"position":[[4,13]]},"347":{"position":[[834,14]]},"366":{"position":[[74,13]]},"368":{"position":[[322,14],[1550,13],[1679,14],[3248,13]]},"372":{"position":[[37,9]]},"398":{"position":[[3391,10]]},"402":{"position":[[1646,13],[1929,11]]},"404":{"position":[[52,14]]},"409":{"position":[[304,13],[357,13]]},"418":{"position":[[65,14]]},"420":{"position":[[1458,13]]},"434":{"position":[[156,13],[2001,9]]},"436":{"position":[[241,9]]},"442":{"position":[[117,10],[147,9],[2200,10]]},"444":{"position":[[328,10],[434,10]]},"446":{"position":[[102,13],[140,9],[271,13]]},"448":{"position":[[838,11],[1141,13]]},"450":{"position":[[11,14],[99,10],[247,10]]},"452":{"position":[[244,14],[465,10]]},"454":{"position":[[165,14]]},"460":{"position":[[8,13]]},"462":{"position":[[61,13],[194,14]]},"464":{"position":[[34,14]]},"471":{"position":[[280,14]]}}}],["configuraion",{"_index":1798,"t":{"280":{"position":[[96,12]]}}}],["configuration/data",{"_index":2022,"t":{"347":{"position":[[941,18]]}}}],["configurea",{"_index":92,"t":{"9":{"position":[[1057,14]]},"17":{"position":[[552,14],[988,14]]},"37":{"position":[[275,14],[566,14]]},"43":{"position":[[492,14],[842,14]]},"51":{"position":[[694,14],[998,14]]},"55":{"position":[[237,14],[498,14]]},"59":{"position":[[313,14],[624,14]]},"66":{"position":[[732,14],[998,14]]},"73":{"position":[[859,14],[1110,14]]},"130":{"position":[[348,14],[694,14],[985,14]]},"138":{"position":[[422,14]]},"140":{"position":[[332,14],[682,14]]},"142":{"position":[[308,14]]},"144":{"position":[[337,14],[641,14]]},"156":{"position":[[351,14],[662,14]]},"158":{"position":[[232,14]]},"160":{"position":[[331,14],[592,14]]},"186":{"position":[[165,14],[507,14],[773,14]]},"202":{"position":[[166,14]]},"204":{"position":[[859,14],[1068,14],[1298,14],[1763,14],[2078,14]]},"230":{"position":[[419,14]]},"311":{"position":[[655,14]]},"319":{"position":[[98,14]]},"387":{"position":[[943,12]]},"434":{"position":[[3783,14]]},"436":{"position":[[1730,14]]},"440":{"position":[[947,14]]}}}],["confirm",{"_index":2079,"t":{"360":{"position":[[507,10]]}}}],["confus",{"_index":2412,"t":{"414":{"position":[[269,7]]}}}],["congratul",{"_index":2336,"t":{"393":{"position":[[2985,16]]}}}],["conjunct",{"_index":1883,"t":{"289":{"position":[[570,11]]}}}],["connect",{"_index":374,"t":{"23":{"position":[[1038,13],[1783,13],[2408,13],[2528,10],[2984,13],[3383,10],[3434,10],[3479,7],[3723,7],[3834,13]]},"96":{"position":[[364,7]]},"108":{"position":[[718,10]]},"110":{"position":[[51,11]]},"118":{"position":[[16,7],[83,7],[561,7],[719,7]]},"126":{"position":[[16,7],[81,7],[553,7],[711,7]]},"162":{"position":[[360,7],[438,7],[1020,7]]},"174":{"position":[[46,11]]},"178":{"position":[[59,11]]},"188":{"position":[[63,7]]},"347":{"position":[[1413,11],[1897,10]]},"368":{"position":[[1378,7]]},"391":{"position":[[1404,11],[1451,10]]},"402":{"position":[[271,8],[908,7],[1200,7]]},"434":{"position":[[2561,7]]},"464":{"position":[[19,11]]}}}],["connect:/run/user/1000/bu",{"_index":1229,"t":{"170":{"position":[[1642,26]]}}}],["connector",{"_index":1429,"t":{"214":{"position":[[69,11],[149,10],[251,9]]},"216":{"position":[[213,11],[302,11]]}}}],["consecut",{"_index":2425,"t":{"420":{"position":[[685,11]]}}}],["consent",{"_index":1480,"t":{"222":{"position":[[1899,7]]}}}],["consid",{"_index":367,"t":{"23":{"position":[[708,8],[1465,8]]},"194":{"position":[[418,11]]},"250":{"position":[[107,10],[252,10]]},"265":{"position":[[429,8]]},"285":{"position":[[272,10]]},"292":{"position":[[624,8]]},"296":{"position":[[28,9]]},"420":{"position":[[583,9]]}}}],["consider",{"_index":1810,"t":{"282":{"position":[[1370,14]]}}}],["consist",{"_index":531,"t":{"39":{"position":[[406,10]]},"112":{"position":[[395,11]]},"232":{"position":[[1138,8]]},"234":{"position":[[557,8]]},"236":{"position":[[116,8]]},"265":{"position":[[1144,10]]},"269":{"position":[[48,10]]},"294":{"position":[[1223,12],[1746,12]]},"311":{"position":[[62,10]]},"337":{"position":[[54,8]]},"349":{"position":[[127,8]]},"420":{"position":[[968,11]]},"452":{"position":[[259,7]]},"454":{"position":[[180,7]]}}}],["consol",{"_index":1479,"t":{"222":{"position":[[1791,7],[4162,7]]}}}],["const",{"_index":2217,"t":{"383":{"position":[[1806,5]]},"387":{"position":[[614,6],[730,5]]},"389":{"position":[[684,5]]},"391":{"position":[[481,5],[569,5],[803,5],[1765,5],[2362,5]]},"393":{"position":[[1848,5],[1932,5],[2048,5],[2295,5],[2769,5]]},"396":{"position":[[748,5],[965,5]]},"398":{"position":[[3037,5],[3570,5]]}}}],["constraint",{"_index":1829,"t":{"282":{"position":[[6026,11]]}}}],["constructor",{"_index":2038,"t":{"347":{"position":[[2072,11]]},"385":{"position":[[67,11]]},"396":{"position":[[236,11],[500,14]]},"398":{"position":[[659,12],[943,14]]}}}],["constructor(nam",{"_index":2227,"t":{"385":{"position":[[607,17]]}}}],["consult",{"_index":2529,"t":{"446":{"position":[[497,7]]}}}],["contact",{"_index":1763,"t":{"272":{"position":[[307,10],[876,10],[995,10]]},"274":{"position":[[227,10]]},"303":{"position":[[127,10]]},"305":{"position":[[215,10]]},"307":{"position":[[404,10]]},"309":{"position":[[312,10]]},"311":{"position":[[536,10]]},"398":{"position":[[1280,8],[1331,10]]},"402":{"position":[[140,7],[195,10]]},"436":{"position":[[420,7],[597,7]]},"438":{"position":[[153,7],[330,7]]}}}],["contact@mydomain.com",{"_index":1764,"t":{"272":{"position":[[318,22],[887,22],[1006,23]]},"274":{"position":[[238,22]]},"303":{"position":[[138,22]]},"305":{"position":[[226,22]]},"307":{"position":[[415,22]]},"309":{"position":[[323,22]]},"311":{"position":[[547,22]]}}}],["contain",{"_index":134,"t":{"13":{"position":[[659,12],[1338,10],[3022,10]]},"23":{"position":[[2882,10],[3076,9],[3114,9]]},"53":{"position":[[280,10]]},"81":{"position":[[31,8]]},"108":{"position":[[1278,9],[2377,8],[2907,8]]},"170":{"position":[[735,9],[847,9],[965,10],[1027,9]]},"190":{"position":[[985,7],[2346,9],[2555,9],[2650,9],[3419,9]]},"234":{"position":[[62,10]]},"236":{"position":[[328,10]]},"265":{"position":[[628,8]]},"267":{"position":[[25,8]]},"272":{"position":[[100,8]]},"282":{"position":[[85,9],[387,10],[1863,8],[2112,8],[2790,8],[3323,8],[3651,8]]},"285":{"position":[[35,8]]},"294":{"position":[[258,8],[1071,7]]},"341":{"position":[[16,8],[422,9]]},"345":{"position":[[228,8]]},"347":{"position":[[1152,10],[1269,8]]},"368":{"position":[[1253,9],[1657,9],[1750,9],[2095,9],[2213,9],[3032,9],[3145,9]]},"370":{"position":[[156,9]]},"406":{"position":[[50,7]]},"430":{"position":[[469,9]]},"442":{"position":[[464,10]]},"444":{"position":[[44,9],[210,10]]},"452":{"position":[[31,8]]},"473":{"position":[[77,9],[115,9]]}}}],["container_nam",{"_index":1706,"t":{"256":{"position":[[663,15]]},"278":{"position":[[1560,15]]},"368":{"position":[[413,15]]},"370":{"position":[[994,15]]},"432":{"position":[[192,15]]}}}],["content",{"_index":930,"t":{"102":{"position":[[523,8]]},"190":{"position":[[2216,8]]},"332":{"position":[[306,8]]},"424":{"position":[[176,8]]},"432":{"position":[[98,8]]},"434":{"position":[[3635,9]]}}}],["context",{"_index":2053,"t":{"349":{"position":[[374,7]]},"420":{"position":[[2605,8]]}}}],["continu",{"_index":627,"t":{"61":{"position":[[912,8]]},"68":{"position":[[990,8]]},"190":{"position":[[3001,8]]},"222":{"position":[[1619,8],[4388,8]]},"240":{"position":[[39,8],[266,9],[474,9],[1451,10]]},"309":{"position":[[919,10]]},"347":{"position":[[747,8]]}}}],["contribut",{"_index":1732,"t":{"265":{"position":[[718,11]]},"267":{"position":[[115,11]]}}}],["control",{"_index":426,"t":{"27":{"position":[[108,7]]},"124":{"position":[[153,7],[180,7]]},"126":{"position":[[461,7]]},"190":{"position":[[1421,8],[3505,7],[3816,8]]},"240":{"position":[[629,7],[791,7],[887,7],[1168,7]]},"282":{"position":[[1003,8],[7119,8]]},"287":{"position":[[134,12]]},"309":{"position":[[122,7]]},"406":{"position":[[947,8]]},"420":{"position":[[434,7]]},"448":{"position":[[959,8]]}}}],["conveni",{"_index":692,"t":{"68":{"position":[[1650,12]]},"190":{"position":[[3369,12]]},"254":{"position":[[9,12]]},"315":{"position":[[368,12]]},"360":{"position":[[2,11]]}}}],["cooki",{"_index":774,"t":{"77":{"position":[[2902,9]]},"79":{"position":[[1294,9]]},"102":{"position":[[21,6],[274,6],[448,7],[545,6],[655,7]]},"104":{"position":[[89,6]]},"222":{"position":[[549,7],[672,6],[784,6],[849,6],[967,6],[1088,9],[1337,8],[1721,8]]},"224":{"position":[[106,6],[453,9],[810,9]]},"406":{"position":[[391,7],[555,7],[640,7],[1035,6],[1204,7]]}}}],["cool",{"_index":1198,"t":{"166":{"position":[[466,4],[488,4],[553,4],[575,4]]},"206":{"position":[[1767,4]]},"248":{"position":[[346,4],[612,4]]},"250":{"position":[[1465,4]]},"263":{"position":[[89,4]]},"282":{"position":[[3167,4],[4590,4],[4651,4],[4925,4]]},"317":{"position":[[134,4],[161,4],[280,4],[307,4],[610,4],[644,4],[838,4],[878,4]]},"380":{"position":[[80,4],[93,4],[630,4],[704,4],[919,4]]},"383":{"position":[[42,4],[617,4],[645,4],[786,4]]},"385":{"position":[[770,4]]},"389":{"position":[[87,4],[582,4]]},"391":{"position":[[1978,5],[2506,4]]},"393":{"position":[[2432,4]]}}}],["coolplay",{"_index":2205,"t":{"383":{"position":[[1137,12],[1785,13],[1860,12]]},"387":{"position":[[155,10],[716,13],[881,13],[1112,12],[1306,13]]},"389":{"position":[[457,10],[951,12]]}}}],["coolplayer'",{"_index":2218,"t":{"383":{"position":[[2012,12]]}}}],["coolplayer.j",{"_index":2210,"t":{"383":{"position":[[1436,18]]}}}],["coolplayerdata",{"_index":2236,"t":{"387":{"position":[[328,14],[988,14]]}}}],["coolplayersourc",{"_index":2219,"t":{"385":{"position":[[36,16],[460,16]]},"387":{"position":[[131,16],[224,16],[310,17],[511,16],[1070,16]]},"389":{"position":[[357,16]]},"391":{"position":[[50,16],[378,16],[1638,16],[2276,16]]},"393":{"position":[[607,16],[1705,16],[3007,16]]},"396":{"position":[[460,16]]},"398":{"position":[[903,16],[2088,16]]}}}],["coolplayersource(nam",{"_index":2256,"t":{"387":{"position":[[1342,22]]}}}],["coolplayersource.formatplayobj(play",{"_index":2331,"t":{"393":{"position":[[2376,37]]}}}],["coolplayersource.formatplayobj(x",{"_index":2343,"t":{"396":{"position":[[1014,35]]}}}],["coolplayersource.j",{"_index":2237,"t":{"387":{"position":[[350,24]]}}}],["coolplayersource.parseconnectionurl(baseurl",{"_index":2293,"t":{"391":{"position":[[1164,45]]}}}],["coolplayersourceaioconfig",{"_index":2204,"t":{"383":{"position":[[985,25],[1379,26],[1597,26]]}}}],["coolplayersourceconfig",{"_index":2203,"t":{"383":{"position":[[887,22],[1019,22],[1406,22],[1511,23]]},"385":{"position":[[173,22],[583,23],[638,23]]},"387":{"position":[[1384,23]]}}}],["coolplayersourcedata",{"_index":2196,"t":{"383":{"position":[[475,20],[945,20]]}}}],["copi",{"_index":179,"t":{"13":{"position":[[2125,6],[3750,6]]},"35":{"position":[[302,4],[325,4]]},"53":{"position":[[465,4]]},"102":{"position":[[510,4],[789,4]]},"122":{"position":[[285,4]]},"190":{"position":[[2207,4],[4062,4]]},"222":{"position":[[2522,4]]},"409":{"position":[[337,4]]},"434":{"position":[[3620,4]]},"442":{"position":[[652,4],[1473,4],[1496,4]]}}}],["core",{"_index":2353,"t":{"398":{"position":[[1937,4]]}}}],["core/atomic.j",{"_index":2264,"t":{"389":{"position":[[312,23]]},"398":{"position":[[851,23]]}}}],["corner",{"_index":584,"t":{"53":{"position":[[373,7]]},"442":{"position":[[557,7]]}}}],["corpor",{"_index":1755,"t":{"265":{"position":[[1421,9]]},"269":{"position":[[325,9]]}}}],["correct",{"_index":1287,"t":{"190":{"position":[[783,7]]},"265":{"position":[[149,7]]},"287":{"position":[[1273,7]]},"289":{"position":[[1332,9],[2283,7]]},"292":{"position":[[193,10]]},"296":{"position":[[183,8]]},"311":{"position":[[247,10]]},"313":{"position":[[137,10],[317,10]]},"339":{"position":[[357,7]]},"374":{"position":[[180,7]]},"402":{"position":[[2381,7]]},"404":{"position":[[36,7]]},"420":{"position":[[327,7]]},"446":{"position":[[432,7]]},"448":{"position":[[645,12],[2040,7]]}}}],["correct/norm",{"_index":2510,"t":{"436":{"position":[[109,17]]}}}],["correctli",{"_index":159,"t":{"13":{"position":[[1399,9],[3083,9]]},"96":{"position":[[39,9],[207,10],[660,9]]},"108":{"position":[[1748,9]]},"206":{"position":[[2080,9]]},"218":{"position":[[117,9],[273,10]]},"294":{"position":[[1767,9]]}}}],["correspond",{"_index":1352,"t":{"204":{"position":[[111,10]]},"282":{"position":[[2803,13]]},"294":{"position":[[744,13]]},"349":{"position":[[591,13]]},"398":{"position":[[1445,13]]}}}],["count",{"_index":890,"t":{"96":{"position":[[1669,5]]}}}],["countri",{"_index":1855,"t":{"287":{"position":[[505,7],[946,7],[983,7],[1144,7]]}}}],["cover",{"_index":1401,"t":{"206":{"position":[[2209,5]]},"265":{"position":[[810,6]]},"267":{"position":[[207,6]]}}}],["cp",{"_index":2244,"t":{"387":{"position":[[736,2],[982,2]]}}}],["crash",{"_index":967,"t":{"108":{"position":[[211,7]]}}}],["creat",{"_index":259,"t":{"15":{"position":[[55,8]]},"35":{"position":[[68,6],[148,6],[260,6]]},"39":{"position":[[83,6],[190,6],[280,8]]},"45":{"position":[[75,6]]},"53":{"position":[[439,6]]},"57":{"position":[[76,6],[202,6]]},"61":{"position":[[60,6],[657,6]]},"68":{"position":[[70,6],[739,6]]},"70":{"position":[[9,6],[167,6]]},"122":{"position":[[39,6],[238,6],[294,7]]},"130":{"position":[[161,6]]},"132":{"position":[[148,6],[237,6]]},"138":{"position":[[148,6],[255,6]]},"142":{"position":[[141,6]]},"146":{"position":[[158,6],[257,6]]},"154":{"position":[[175,6],[301,6]]},"158":{"position":[[43,6]]},"182":{"position":[[35,6]]},"190":{"position":[[542,6],[750,6],[1470,6],[2546,6]]},"198":{"position":[[42,6]]},"222":{"position":[[1799,7],[1833,6],[2141,6],[2438,6],[2458,7]]},"300":{"position":[[267,8]]},"341":{"position":[[435,8]]},"378":{"position":[[52,8]]},"383":{"position":[[8,6],[129,6],[634,7],[1888,6]]},"385":{"position":[[9,6]]},"387":{"position":[[1059,6]]},"389":{"position":[[12,6]]},"422":{"position":[[150,6]]},"424":{"position":[[0,6],[207,8]]},"432":{"position":[[0,6],[62,6]]},"434":{"position":[[290,8],[437,7],[554,6],[805,7],[887,8],[1650,6],[1687,6],[1751,8],[1861,8],[2467,7],[2666,8],[2906,6],[3501,6]]},"436":{"position":[[506,8],[1008,8],[1151,8],[1293,8],[1431,8],[1530,7]]},"438":{"position":[[239,8]]},"440":{"position":[[225,8],[368,8],[510,8],[648,8],[747,7]]},"442":{"position":[[626,6],[764,7],[1144,7],[1319,6],[1431,6],[2050,7]]},"444":{"position":[[184,7]]},"464":{"position":[[70,8]]}}}],["creation",{"_index":533,"t":{"39":{"position":[[536,9]]},"434":{"position":[[3436,8],[3715,9]]},"442":{"position":[[1027,8]]}}}],["credenti",{"_index":1300,"t":{"190":{"position":[[2027,12]]},"194":{"position":[[282,12]]},"222":{"position":[[1555,11],[2129,11],[2148,11],[4579,11],[4705,11]]},"345":{"position":[[294,12]]},"347":{"position":[[1329,11],[3235,11]]},"368":{"position":[[1698,12]]},"448":{"position":[[1084,11]]}}}],["critic",{"_index":1027,"t":{"108":{"position":[[3175,8]]}}}],["crosbi",{"_index":1715,"t":{"261":{"position":[[148,8]]}}}],["cross",{"_index":2099,"t":{"368":{"position":[[0,5]]}}}],["ctrl+shift+i",{"_index":933,"t":{"102":{"position":[[583,12]]}}}],["current",{"_index":47,"t":{"9":{"position":[[31,9]]},"86":{"position":[[815,7]]},"94":{"position":[[21,9]]},"108":{"position":[[1627,7]]},"240":{"position":[[137,9],[746,7]]},"244":{"position":[[560,7]]},"368":{"position":[[3429,7]]},"374":{"position":[[338,7]]},"380":{"position":[[578,7]]},"383":{"position":[[2112,7]]},"393":{"position":[[397,10],[1889,9],[2670,9]]},"444":{"position":[[466,7]]},"448":{"position":[[2306,7]]},"471":{"position":[[0,10]]}}}],["custom",{"_index":89,"t":{"9":{"position":[[922,9]]},"49":{"position":[[70,6]]},"51":{"position":[[523,6]]},"75":{"position":[[949,6]]},"92":{"position":[[323,10]]},"96":{"position":[[618,6]]},"148":{"position":[[745,6]]},"218":{"position":[[451,6]]},"222":{"position":[[2886,6],[3353,8],[3435,6],[3721,6]]},"224":{"position":[[260,6]]},"240":{"position":[[1152,10]]},"406":{"position":[[402,6]]}}}],["cwd/build",{"_index":2076,"t":{"360":{"position":[[473,11]]}}}],["d",{"_index":580,"t":{"53":{"position":[[323,1]]},"108":{"position":[[1236,1]]},"442":{"position":[[507,1]]},"444":{"position":[[249,1]]},"473":{"position":[[303,1]]}}}],["d3df",{"_index":1648,"t":{"244":{"position":[[1017,4]]}}}],["daemon",{"_index":809,"t":{"83":{"position":[[631,7]]},"108":{"position":[[1044,6],[1256,6]]},"170":{"position":[[455,7]]},"426":{"position":[[34,6]]},"448":{"position":[[317,7]]}}}],["daemon/socket",{"_index":1004,"t":{"108":{"position":[[1390,13]]}}}],["daemon/socket:/var/run/avahi",{"_index":1003,"t":{"108":{"position":[[1361,28]]}}}],["dashboard",{"_index":37,"t":{"7":{"position":[[270,10]]},"9":{"position":[[686,9]]},"27":{"position":[[23,9]]},"35":{"position":[[198,9],[541,9],[620,9],[1613,9]]},"41":{"position":[[227,10],[283,9]]},"47":{"position":[[227,10],[283,9]]},"63":{"position":[[216,9]]},"66":{"position":[[654,9]]},"90":{"position":[[525,9]]},"94":{"position":[[407,9]]},"96":{"position":[[1092,9]]},"112":{"position":[[855,9]]},"122":{"position":[[141,9]]},"190":{"position":[[726,9],[4276,9]]},"222":{"position":[[3097,9],[4254,9],[5080,10],[5172,9],[5304,11],[5390,9]]},"337":{"position":[[359,10]]},"368":{"position":[[1037,9],[1075,9],[2128,9],[2647,9],[2747,9]]},"398":{"position":[[3155,9]]},"406":{"position":[[533,10]]},"430":{"position":[[136,9],[526,9]]},"434":{"position":[[1116,9],[4004,9]]},"442":{"position":[[1369,9],[1708,9],[1787,9],[2321,9]]},"444":{"position":[[418,9]]}}}],["data",{"_index":93,"t":{"9":{"position":[[1082,7]]},"13":{"position":[[2600,7],[4494,7],[4728,7]]},"17":{"position":[[165,4],[577,7],[1013,7]]},"23":{"position":[[60,4],[274,4],[363,4],[447,4],[1204,4]]},"37":{"position":[[300,7],[591,7]]},"43":{"position":[[517,7],[867,7]]},"49":{"position":[[139,4]]},"51":{"position":[[719,7],[1023,7]]},"55":{"position":[[262,7],[523,7]]},"59":{"position":[[338,7],[649,7]]},"61":{"position":[[288,5],[299,4],[358,4],[381,4],[473,4],[757,4],[797,4],[855,4],[1012,4],[1070,4],[1548,4],[1621,4]]},"66":{"position":[[757,7],[1023,7]]},"68":{"position":[[239,4],[370,5],[381,4],[440,4],[463,4],[555,4],[839,4],[879,4],[937,4],[1090,4],[1148,4],[1645,4]]},"73":{"position":[[884,7],[1135,7]]},"77":{"position":[[991,7],[1247,7],[1493,7],[1749,7],[1919,7],[2276,7],[2512,7],[2723,7],[2892,7],[3127,7],[3218,7],[3336,7],[3454,7],[3569,7]]},"79":{"position":[[155,7],[290,7],[425,7],[596,7],[750,7],[910,7],[1067,7],[1284,7],[1527,7],[1612,7],[1712,7],[1812,7],[1935,7]]},"81":{"position":[[14,4]]},"86":{"position":[[133,4],[265,4],[381,4],[540,4],[725,4],[1275,4]]},"90":{"position":[[272,7]]},"92":{"position":[[396,7]]},"94":{"position":[[681,7]]},"96":{"position":[[1347,7]]},"98":{"position":[[434,7],[718,7]]},"100":{"position":[[61,4]]},"104":{"position":[[209,7],[512,7]]},"106":{"position":[[315,7]]},"108":{"position":[[435,4],[510,4],[2333,7],[2865,7],[3524,7]]},"110":{"position":[[686,7],[929,7]]},"112":{"position":[[370,4],[1108,7],[1851,7]]},"114":{"position":[[163,7],[360,7]]},"120":{"position":[[368,7],[603,7]]},"122":{"position":[[2205,7],[2843,7]]},"128":{"position":[[291,7],[548,7]]},"130":{"position":[[719,7],[1010,7]]},"136":{"position":[[370,7],[556,7]]},"138":{"position":[[365,4]]},"140":{"position":[[357,7],[707,7]]},"142":{"position":[[250,4]]},"144":{"position":[[362,7],[666,7]]},"152":{"position":[[447,7],[634,7]]},"156":{"position":[[376,7],[687,7]]},"160":{"position":[[356,7],[617,7]]},"166":{"position":[[188,4],[305,5]]},"168":{"position":[[120,7],[373,7]]},"172":{"position":[[417,7],[645,7]]},"176":{"position":[[194,7],[460,7]]},"180":{"position":[[262,7],[512,7]]},"184":{"position":[[117,5]]},"186":{"position":[[532,7],[798,7]]},"188":{"position":[[2326,7],[2872,7]]},"190":{"position":[[3571,4]]},"192":{"position":[[303,7],[655,7]]},"196":{"position":[[256,7],[548,7]]},"198":{"position":[[211,4]]},"200":{"position":[[117,5]]},"204":{"position":[[662,4],[884,7],[1093,7],[1323,7],[1788,7],[2103,7]]},"206":{"position":[[1634,7],[1876,4],[2429,7]]},"208":{"position":[[195,7],[412,7]]},"212":{"position":[[234,7],[318,7]]},"216":{"position":[[407,7],[628,7]]},"220":{"position":[[200,7],[395,7]]},"222":{"position":[[1005,4],[1078,7],[2625,7],[3854,7]]},"224":{"position":[[443,7],[800,7]]},"226":{"position":[[64,4],[260,4],[506,4],[780,4],[834,4]]},"230":{"position":[[68,4],[85,4],[108,4],[444,7]]},"232":{"position":[[38,4],[103,4],[198,4],[276,4],[341,4],[433,4],[607,4],[654,4],[931,4],[1264,5]]},"234":{"position":[[119,5],[374,4],[451,4],[491,4],[626,4],[702,4]]},"236":{"position":[[311,4],[343,4],[815,7],[1526,7],[1704,7],[2330,7]]},"238":{"position":[[107,4],[1011,4],[1202,5]]},"240":{"position":[[224,5],[525,4]]},"242":{"position":[[289,5],[1537,4]]},"244":{"position":[[378,7]]},"248":{"position":[[91,5],[155,4],[699,5]]},"250":{"position":[[1144,4],[1298,4]]},"252":{"position":[[68,4]]},"254":{"position":[[305,7]]},"259":{"position":[[371,7]]},"261":{"position":[[270,7]]},"263":{"position":[[303,7]]},"265":{"position":[[40,4],[202,5],[268,5],[598,4],[1021,4],[1158,4],[1201,4]]},"267":{"position":[[418,4]]},"269":{"position":[[62,4],[105,4]]},"272":{"position":[[151,4],[285,7],[854,7]]},"274":{"position":[[205,7]]},"276":{"position":[[105,7],[301,4],[406,7],[804,4],[991,7]]},"280":{"position":[[176,4]]},"282":{"position":[[72,4],[194,4],[311,4],[502,4],[734,4],[784,4],[1858,4],[2107,4],[2785,4],[3318,4],[3646,4],[4340,5],[4800,4],[5622,4],[5993,4],[6315,4]]},"287":{"position":[[246,4]]},"292":{"position":[[238,4],[345,4]]},"294":{"position":[[42,4],[253,4],[439,4],[492,5],[541,4],[1088,4],[1312,4],[1829,4]]},"296":{"position":[[192,4],[242,4],[476,4]]},"298":{"position":[[37,4],[305,4],[368,5],[422,7]]},"300":{"position":[[605,7]]},"303":{"position":[[105,7],[241,7]]},"305":{"position":[[193,7],[554,7]]},"307":{"position":[[33,4],[382,7],[576,7]]},"309":{"position":[[290,7],[651,7]]},"311":{"position":[[514,7],[679,7],[996,7],[1215,4]]},"313":{"position":[[101,5],[176,5],[209,5],[312,4]]},"315":{"position":[[637,7]]},"319":{"position":[[123,7]]},"345":{"position":[[190,6],[223,4],[237,4]]},"347":{"position":[[785,5],[870,4],[1264,4],[2455,4],[2553,4],[2686,4]]},"349":{"position":[[31,4],[94,4],[146,4],[303,4],[636,4]]},"374":{"position":[[1006,7],[1175,7]]},"380":{"position":[[1057,4]]},"383":{"position":[[364,4],[383,4],[939,5],[2031,4]]},"387":{"position":[[976,5]]},"389":{"position":[[68,4],[572,4],[764,5]]},"391":{"position":[[82,5],[117,4]]},"393":{"position":[[1225,4],[1927,4],[2229,4],[2290,4]]},"398":{"position":[[116,4],[204,4],[1796,4],[2541,4],[2641,4]]},"402":{"position":[[823,4]]},"414":{"position":[[65,4],[554,4]]},"420":{"position":[[219,4],[1562,7],[2397,7]]},"430":{"position":[[217,4]]},"432":{"position":[[48,4]]},"434":{"position":[[3677,4],[3808,7]]},"436":{"position":[[100,5],[136,5],[1755,7]]},"440":{"position":[[972,7]]},"448":{"position":[[609,4],[1607,4],[1950,4],[2029,4],[2379,4]]},"452":{"position":[[14,4],[292,4]]},"454":{"position":[[213,4]]}}}],["data.baseurl",{"_index":2026,"t":{"347":{"position":[[1179,13]]}}}],["databas",{"_index":1587,"t":{"234":{"position":[[400,8]]},"265":{"position":[[66,9],[619,8],[801,8]]},"267":{"position":[[16,8],[198,8]]},"282":{"position":[[863,8]]},"294":{"position":[[210,8]]},"368":{"position":[[498,8]]},"370":{"position":[[1079,8]]},"432":{"position":[[277,8]]},"448":{"position":[[677,8],[2000,8]]},"471":{"position":[[45,9]]}}}],["datatyp",{"_index":615,"t":{"61":{"position":[[453,9]]},"68":{"position":[[535,9]]}}}],["date",{"_index":2052,"t":{"349":{"position":[[227,4]]},"406":{"position":[[738,4]]}}}],["datetim",{"_index":1558,"t":{"228":{"position":[[336,9],[717,9]]}}}],["dayj",{"_index":2262,"t":{"389":{"position":[[186,5],[197,8]]}}}],["dayjs(playedat",{"_index":2275,"t":{"389":{"position":[[916,15]]}}}],["dbu",{"_index":1206,"t":{"170":{"position":[[450,4],[939,4],[1350,4],[1503,4],[1548,4]]}}}],["dbus_session_bus_address=tcp:host=yourhostip,port=6644",{"_index":1230,"t":{"170":{"position":[[1726,54]]}}}],["dbus_session_bus_address=unix:path=/run/user/uid/bu",{"_index":1216,"t":{"170":{"position":[[1172,52]]}}}],["dead",{"_index":38,"t":{"7":{"position":[[281,4]]}}}],["debian",{"_index":2469,"t":{"422":{"position":[[116,7]]}}}],["debug",{"_index":411,"t":{"25":{"position":[[11,5],[60,11],[121,5],[279,5],[412,5]]},"108":{"position":[[370,5],[3444,5]]},"122":{"position":[[2672,7],[3292,7]]},"188":{"position":[[2658,8],[3204,8]]},"206":{"position":[[1845,5]]},"244":{"position":[[660,5]]},"300":{"position":[[170,5],[365,6]]},"402":{"position":[[979,5],[1422,5],[1452,5],[2443,9]]}}}],["debug_mode=tru",{"_index":421,"t":{"25":{"position":[[531,15]]},"244":{"position":[[250,15]]},"402":{"position":[[1524,16]]},"420":{"position":[[1650,15]]}}}],["debugmod",{"_index":214,"t":{"13":{"position":[[4059,12]]},"25":{"position":[[470,12]]}}}],["decid",{"_index":1447,"t":{"222":{"position":[[163,7]]},"282":{"position":[[1408,6]]}}}],["declar",{"_index":2226,"t":{"385":{"position":[[567,7]]}}}],["decod",{"_index":1337,"t":{"194":{"position":[[303,9]]}}}],["deezer",{"_index":799,"t":{"83":{"position":[[129,6]]},"100":{"position":[[54,6],[112,6],[279,6]]},"102":{"position":[[33,6],[217,7]]},"104":{"position":[[663,8]]},"106":{"position":[[30,6],[55,6],[161,6]]},"448":{"position":[[145,6]]}}}],["deezer'",{"_index":908,"t":{"100":{"position":[[98,8]]},"102":{"position":[[144,8]]}}}],["deezer.com",{"_index":921,"t":{"102":{"position":[[306,11],[470,11],[567,11],[689,10]]}}}],["deezer.json",{"_index":952,"t":{"106":{"position":[[259,11],[279,11]]}}}],["deezer_arl",{"_index":940,"t":{"104":{"position":[[66,10]]}}}],["deezerarl",{"_index":942,"t":{"104":{"position":[[165,12],[468,12]]}}}],["default",{"_index":53,"t":{"9":{"position":[[161,7],[768,7]]},"13":{"position":[[1258,8],[2918,8],[3462,8],[3531,7]]},"21":{"position":[[41,7],[138,7]]},"23":{"position":[[433,8],[826,7],[883,7],[1190,8],[1583,7],[1640,7],[1998,8],[2207,7],[2264,7],[2760,7],[3607,7]]},"37":{"position":[[62,7]]},"43":{"position":[[62,7]]},"51":{"position":[[62,7]]},"55":{"position":[[62,7]]},"59":{"position":[[62,7]]},"61":{"position":[[1089,7]]},"66":{"position":[[481,7]]},"68":{"position":[[1167,7]]},"73":{"position":[[619,7]]},"77":{"position":[[79,7],[217,7],[381,7],[592,7],[756,7],[1125,7]]},"90":{"position":[[358,7]]},"92":{"position":[[246,7]]},"94":{"position":[[535,7]]},"96":{"position":[[1201,7],[1533,7],[1865,8],[1946,7]]},"98":{"position":[[46,7]]},"104":{"position":[[46,7]]},"108":{"position":[[1908,8],[2442,8],[3029,8]]},"110":{"position":[[141,7]]},"112":{"position":[[639,8],[964,7]]},"114":{"position":[[46,7]]},"118":{"position":[[176,7],[281,7]]},"120":{"position":[[61,7]]},"122":{"position":[[524,8],[536,10],[1244,7]]},"126":{"position":[[174,7],[277,7]]},"128":{"position":[[61,7]]},"136":{"position":[[62,7]]},"152":{"position":[[62,7]]},"162":{"position":[[531,7],[634,7]]},"172":{"position":[[62,7]]},"176":{"position":[[62,7]]},"178":{"position":[[405,7]]},"180":{"position":[[62,7]]},"188":{"position":[[112,8],[184,8],[551,7],[695,9],[1061,9],[1360,8],[1372,7],[1608,7]]},"192":{"position":[[62,7]]},"196":{"position":[[62,7]]},"208":{"position":[[62,7]]},"216":{"position":[[62,7]]},"218":{"position":[[378,7]]},"220":{"position":[[62,7]]},"224":{"position":[[62,7]]},"236":{"position":[[222,8],[252,7],[559,11],[576,7],[655,7],[1106,7],[1234,11],[1349,11],[1855,7],[2074,11],[2091,7],[2170,7],[2477,10]]},"240":{"position":[[257,8],[334,8],[465,8],[602,7],[874,7]]},"250":{"position":[[174,7],[327,9],[619,8],[1045,8]]},"252":{"position":[[431,8]]},"254":{"position":[[131,8],[423,7]]},"256":{"position":[[4,7]]},"259":{"position":[[115,11],[132,7],[211,7]]},"261":{"position":[[115,11]]},"263":{"position":[[221,7]]},"272":{"position":[[918,7]]},"274":{"position":[[106,9],[266,11]]},"276":{"position":[[848,8],[1164,8],[1236,8]]},"278":{"position":[[262,8],[460,7],[479,7],[941,7]]},"280":{"position":[[84,7]]},"282":{"position":[[360,9],[447,8],[562,11],[1544,11],[1693,7],[1770,7],[1992,11],[2238,11],[2552,11],[2910,11],[3511,11],[3911,11],[4986,11],[5776,11],[6881,11]]},"285":{"position":[[195,7]]},"287":{"position":[[1932,11]]},"289":{"position":[[2466,11]]},"305":{"position":[[35,7],[256,11]]},"307":{"position":[[445,11],[492,8]]},"309":{"position":[[43,8],[91,7],[353,11]]},"311":{"position":[[310,7],[575,11]]},"315":{"position":[[94,7],[160,9],[257,11],[344,7],[753,7]]},"347":{"position":[[2140,8],[2242,8]]},"364":{"position":[[31,8]]},"368":{"position":[[2045,8],[2205,7]]},"380":{"position":[[648,7]]},"385":{"position":[[446,7]]},"387":{"position":[[382,7],[1016,8],[1172,9],[1440,8]]},"389":{"position":[[343,7]]},"391":{"position":[[261,7],[364,7],[1624,7],[2262,7]]},"393":{"position":[[1691,7]]},"396":{"position":[[446,7]]},"398":{"position":[[889,7],[2808,7],[3480,7]]}}}],["default/exampl",{"_index":2397,"t":{"404":{"position":[[372,15]]}}}],["defaultconfigurea",{"_index":2250,"t":{"387":{"position":[[956,19]]}}}],["defaults/filt",{"_index":2504,"t":{"434":{"position":[[2975,18]]}}}],["defin",{"_index":97,"t":{"9":{"position":[[1166,6]]},"21":{"position":[[0,7]]},"23":{"position":[[2671,7]]},"61":{"position":[[435,7]]},"68":{"position":[[517,7]]},"110":{"position":[[233,6]]},"118":{"position":[[377,6]]},"126":{"position":[[373,6]]},"138":{"position":[[446,7]]},"142":{"position":[[332,7]]},"162":{"position":[[730,6]]},"188":{"position":[[748,7]]},"194":{"position":[[739,7]]},"212":{"position":[[621,8]]},"216":{"position":[[141,6]]},"232":{"position":[[1170,6]]},"234":{"position":[[183,6]]},"236":{"position":[[243,8],[956,8],[1083,6]]},"240":{"position":[[726,7]]},"254":{"position":[[36,6]]},"272":{"position":[[501,7],[582,6],[650,7]]},"282":{"position":[[298,6],[1146,7],[7014,7]]},"315":{"position":[[395,6]]},"347":{"position":[[72,7]]},"360":{"position":[[456,7]]},"368":{"position":[[2542,7]]},"391":{"position":[[975,10],[1130,10]]}}}],["definit",{"_index":839,"t":{"86":{"position":[[1166,12]]}}}],["degre",{"_index":2310,"t":{"393":{"position":[[468,7]]}}}],["delay",{"_index":732,"t":{"77":{"position":[[395,5],[770,5]]}}}],["delet",{"_index":1486,"t":{"222":{"position":[[2042,6]]},"360":{"position":[[307,6]]},"362":{"position":[[194,7]]}}}],["delim",{"_index":1973,"t":{"332":{"position":[[322,5],[408,13],[593,11]]}}}],["delim>\\\\s*\\\\/\\\\",{"_index":1978,"t":{"332":{"position":[[691,34]]}}}],["delim>\\\\s*\\\\\\\\\\",{"_index":1976,"t":{"332":{"position":[[489,21]]}}}],["delimit",{"_index":1034,"t":{"110":{"position":[[320,9],[431,9],[511,9],[614,9]]},"172":{"position":[[192,9],[269,9]]},"216":{"position":[[231,9],[320,9]]},"236":{"position":[[584,10],[629,13],[663,10],[1248,13],[2099,10],[2144,13],[2178,10]]},"248":{"position":[[297,10],[404,10],[468,9]]},"250":{"position":[[118,10],[196,10],[263,10],[300,10]]},"259":{"position":[[140,10],[185,13],[219,10]]},"278":{"position":[[299,9]]},"282":{"position":[[4243,10],[5177,9],[5573,10]]},"332":{"position":[[59,9],[232,9],[351,9]]},"434":{"position":[[2828,9]]}}}],["delimitersextra",{"_index":1687,"t":{"250":{"position":[[46,15]]}}}],["delux",{"_index":1900,"t":{"289":{"position":[[1775,6]]}}}],["demon",{"_index":1638,"t":{"244":{"position":[[793,6]]}}}],["deni",{"_index":1370,"t":{"204":{"position":[[999,4]]},"287":{"position":[[1247,4]]},"296":{"position":[[45,4]]}}}],["depend",{"_index":1009,"t":{"108":{"position":[[1698,9]]},"341":{"position":[[188,12]]},"347":{"position":[[1653,7]]},"393":{"position":[[488,9]]},"471":{"position":[[58,12]]}}}],["deploy",{"_index":1704,"t":{"256":{"position":[[527,6]]},"278":{"position":[[1424,6]]}}}],["deriv",{"_index":2316,"t":{"393":{"position":[[1178,8]]}}}],["describ",{"_index":264,"t":{"15":{"position":[[283,9]]},"33":{"position":[[516,9]]},"35":{"position":[[772,8]]},"343":{"position":[[216,10]]},"347":{"position":[[420,10]]},"378":{"position":[[100,10]]}}}],["descript",{"_index":370,"t":{"23":{"position":[[891,11],[1648,11],[2272,11],[2768,11],[3615,11]]},"37":{"position":[[70,11]]},"43":{"position":[[70,11]]},"51":{"position":[[70,11]]},"55":{"position":[[70,11]]},"59":{"position":[[70,11]]},"66":{"position":[[489,11]]},"73":{"position":[[627,11]]},"98":{"position":[[54,11]]},"104":{"position":[[54,11]]},"110":{"position":[[149,11]]},"114":{"position":[[54,11]]},"120":{"position":[[69,11]]},"122":{"position":[[1252,11]]},"128":{"position":[[69,11]]},"136":{"position":[[70,11]]},"152":{"position":[[70,11]]},"172":{"position":[[70,11]]},"176":{"position":[[70,11]]},"180":{"position":[[70,11]]},"188":{"position":[[1616,11]]},"192":{"position":[[70,11]]},"196":{"position":[[70,11]]},"208":{"position":[[70,11]]},"216":{"position":[[70,11]]},"220":{"position":[[70,11]]},"224":{"position":[[70,11]]}}}],["description=multi",{"_index":2477,"t":{"424":{"position":[[248,17]]}}}],["design",{"_index":637,"t":{"61":{"position":[[1363,6]]},"210":{"position":[[583,8]]}}}],["desir",{"_index":1935,"t":{"296":{"position":[[148,7]]}}}],["desired/allow",{"_index":1801,"t":{"280":{"position":[[340,15]]}}}],["desktop",{"_index":1091,"t":{"122":{"position":[[93,7]]},"420":{"position":[[2741,9],[2825,7]]},"448":{"position":[[338,8]]},"452":{"position":[[108,7]]}}}],["destin",{"_index":796,"t":{"83":{"position":[[56,11]]}}}],["detail",{"_index":970,"t":{"108":{"position":[[331,8]]},"222":{"position":[[374,8],[412,7]]},"292":{"position":[[782,7]]},"332":{"position":[[0,7]]},"374":{"position":[[690,7]]},"420":{"position":[[2594,6],[2624,8]]},"448":{"position":[[972,8]]},"466":{"position":[[0,8]]},"471":{"position":[[353,8]]}}}],["detect",{"_index":505,"t":{"35":{"position":[[999,8]]},"106":{"position":[[477,6]]},"122":{"position":[[1042,7],[1111,8]]},"222":{"position":[[431,9]]},"420":{"position":[[7,7],[731,8],[1259,9],[1435,10]]}}}],["determin",{"_index":58,"t":{"9":{"position":[[248,11],[1271,10]]},"35":{"position":[[471,9]]},"86":{"position":[[574,9]]},"92":{"position":[[67,9]]},"94":{"position":[[159,9]]},"112":{"position":[[532,9],[1350,9]]},"190":{"position":[[133,9],[769,9]]},"238":{"position":[[1113,9]]},"347":{"position":[[1955,10]]},"387":{"position":[[40,10]]},"393":{"position":[[863,9],[1439,9]]},"398":{"position":[[92,11],[339,13],[1861,10],[2275,10]]},"402":{"position":[[1813,9]]},"404":{"position":[[444,9]]},"420":{"position":[[70,9],[339,9]]},"442":{"position":[[1638,9]]}}}],["devcontain",{"_index":1989,"t":{"339":{"position":[[111,13],[399,12]]},"341":{"position":[[150,12],[278,12],[337,13]]}}}],["develop",{"_index":660,"t":{"63":{"position":[[206,9]]},"66":{"position":[[644,9]]},"68":{"position":[[1352,11],[1384,12]]},"102":{"position":[[340,9],[604,9]]},"190":{"position":[[675,9],[716,9],[3487,9]]},"222":{"position":[[1484,9]]},"339":{"position":[[0,11]]},"341":{"position":[[48,11],[167,11]]},"351":{"position":[[7,11],[39,11]]},"378":{"position":[[243,12]]},"380":{"position":[[12,9]]},"383":{"position":[[422,11]]},"466":{"position":[[26,11]]}}}],["devic",{"_index":840,"t":{"88":{"position":[[65,6],[186,7]]},"108":{"position":[[14,6],[461,6],[729,8],[743,7],[1589,7],[1778,6]]},"110":{"position":[[44,6],[305,8],[416,8]]},"122":{"position":[[1838,7],[1913,7]]},"188":{"position":[[1963,7],[2034,7]]},"218":{"position":[[424,6]]},"220":{"position":[[110,6]]},"414":{"position":[[100,7],[581,6]]},"416":{"position":[[41,6]]}}}],["device/receiv",{"_index":1436,"t":{"218":{"position":[[18,16]]}}}],["device/us",{"_index":795,"t":{"83":{"position":[[35,11]]},"349":{"position":[[444,11]]}}}],["device_info=chxoeku0tmpjek5ewtbprgd3tlrbmk16qxpndz09ejbs8z0ggjbs8z0g",{"_index":777,"t":{"77":{"position":[[2967,69]]},"79":{"position":[[1359,69]]}}}],["devicesallow",{"_index":1114,"t":{"122":{"position":[[2416,15],[3027,15]]},"188":{"position":[[2468,15],[3014,15]]}}}],["devicesblock",{"_index":1115,"t":{"122":{"position":[[2445,15],[3058,15]]},"188":{"position":[[2499,15],[3045,15]]}}}],["devot",{"_index":1751,"t":{"265":{"position":[[1296,6]]},"269":{"position":[[200,6]]}}}],["diagnos",{"_index":1028,"t":{"108":{"position":[[3187,10],[3209,8],[3365,8]]},"300":{"position":[[189,8]]},"414":{"position":[[393,8]]}}}],["dictat",{"_index":1920,"t":{"294":{"position":[[79,7]]}}}],["did/handl",{"_index":1362,"t":{"204":{"position":[[638,10]]}}}],["did:plc",{"_index":698,"t":{"73":{"position":[[94,11]]}}}],["did:web",{"_index":699,"t":{"73":{"position":[[109,11]]}}}],["diff",{"_index":1629,"t":{"244":{"position":[[13,4],[501,4],[615,4],[750,4]]},"300":{"position":[[433,4]]}}}],["differ",{"_index":608,"t":{"61":{"position":[[230,9],[1187,9]]},"68":{"position":[[312,9],[1265,9]]},"130":{"position":[[250,10]]},"134":{"position":[[269,9]]},"138":{"position":[[405,10]]},"142":{"position":[[291,10]]},"148":{"position":[[584,9]]},"158":{"position":[[134,10]]},"186":{"position":[[67,10]]},"202":{"position":[[67,11]]},"226":{"position":[[164,9],[645,9]]},"232":{"position":[[1092,9]]},"238":{"position":[[79,9],[718,9]]},"311":{"position":[[363,9]]},"347":{"position":[[80,9]]},"366":{"position":[[12,10]]},"368":{"position":[[2599,9]]},"370":{"position":[[179,9]]},"414":{"position":[[218,11]]}}}],["dir=/home/youruser/multi",{"_index":2094,"t":{"362":{"position":[[856,24]]}}}],["direct",{"_index":2500,"t":{"434":{"position":[[2360,10]]},"436":{"position":[[843,10]]},"440":{"position":[[60,10]]}}}],["directli",{"_index":1207,"t":{"170":{"position":[[531,8]]},"188":{"position":[[318,8]]},"448":{"position":[[1394,8]]}}}],["directori",{"_index":152,"t":{"13":{"position":[[1182,9],[2003,9],[2154,9],[2437,9],[2842,9],[3668,9],[3779,9]]},"23":{"position":[[682,9],[1439,9],[2647,9],[2860,10]]},"339":{"position":[[245,9]]},"360":{"position":[[223,9],[390,9]]},"362":{"position":[[244,12],[707,9]]},"368":{"position":[[1638,9],[3262,9]]},"370":{"position":[[236,9],[267,9]]},"374":{"position":[[66,9]]},"430":{"position":[[240,9]]},"434":{"position":[[3553,9]]},"444":{"position":[[144,9]]}}}],["dirti",{"_index":1540,"t":{"226":{"position":[[386,5]]}}}],["disabl",{"_index":60,"t":{"9":{"position":[[324,8],[1118,7]]},"27":{"position":[[172,9],[267,9],[277,7]]}}}],["disable_web=tru",{"_index":431,"t":{"27":{"position":[[303,16]]}}}],["disablediscoveri",{"_index":1248,"t":{"176":{"position":[[275,19],[541,19]]}}}],["disableweb",{"_index":216,"t":{"13":{"position":[[4079,13]]},"27":{"position":[[366,13]]}}}],["disallow",{"_index":1107,"t":{"122":{"position":[[1766,8],[1924,8],[2099,8]]},"164":{"position":[[15,8]]},"188":{"position":[[1895,8],[2045,8],[2212,8]]}}}],["discov",{"_index":978,"t":{"108":{"position":[[826,10]]},"130":{"position":[[78,10]]},"154":{"position":[[85,10]]},"182":{"position":[[223,10]]},"198":{"position":[[302,10]]},"228":{"position":[[365,9],[510,10]]},"232":{"position":[[161,10]]},"393":{"position":[[821,12]]},"398":{"position":[[2019,8],[2379,12],[2462,10],[2721,10],[2959,10],[3043,11],[3180,11],[3241,10],[3576,11],[3800,10]]}}}],["discovered/scrobbl",{"_index":2527,"t":{"444":{"position":[[533,20]]}}}],["discoveri",{"_index":603,"t":{"61":{"position":[[116,9],[1493,9]]},"68":{"position":[[116,9]]},"108":{"position":[[854,10]]},"182":{"position":[[91,9]]},"198":{"position":[[88,9]]},"398":{"position":[[2215,10]]}}}],["display",{"_index":1490,"t":{"222":{"position":[[2362,9],[3247,10],[5410,7]]},"434":{"position":[[3490,10]]},"442":{"position":[[1044,9]]},"444":{"position":[[508,7]]}}}],["dissemin",{"_index":2365,"t":{"398":{"position":[[3344,12]]}}}],["distribut",{"_index":994,"t":{"108":{"position":[[1145,13]]}}}],["distro",{"_index":2466,"t":{"422":{"position":[[73,7]]}}}],["diverg",{"_index":2006,"t":{"343":{"position":[[468,9]]}}}],["dn",{"_index":988,"t":{"108":{"position":[[1090,3]]},"368":{"position":[[1359,3]]}}}],["doauthent",{"_index":2044,"t":{"347":{"position":[[2993,16]]},"391":{"position":[[2323,16]]}}}],["dobuildinitdata",{"_index":2023,"t":{"347":{"position":[[1012,15]]},"391":{"position":[[747,18]]}}}],["doc",{"_index":158,"t":{"13":{"position":[[1368,4],[3052,4]]},"17":{"position":[[1839,4]]},"35":{"position":[[767,4]]},"63":{"position":[[83,4]]},"182":{"position":[[332,5]]},"184":{"position":[[54,4]]},"188":{"position":[[505,5]]},"198":{"position":[[411,5]]},"200":{"position":[[54,4]]},"238":{"position":[[754,4]]},"246":{"position":[[40,4]]},"383":{"position":[[434,5]]},"434":{"position":[[687,5],[3013,4]]},"442":{"position":[[1920,4]]},"446":{"position":[[86,4],[116,4]]}}}],["docheckconnect",{"_index":2034,"t":{"347":{"position":[[1745,17]]},"391":{"position":[[1701,20]]}}}],["docker",{"_index":133,"t":{"13":{"position":[[652,6],[672,6],[759,6],[774,6],[1312,6],[2085,6],[2984,6],[3713,6]]},"17":{"position":[[785,6]]},"21":{"position":[[388,6]]},"23":{"position":[[608,6],[1365,6],[3160,6],[3182,6]]},"53":{"position":[[105,6],[304,6]]},"108":{"position":[[1004,6],[1297,6],[1480,6]]},"170":{"position":[[469,6],[681,6],[728,6],[1137,6]]},"190":{"position":[[2339,6],[2727,6]]},"244":{"position":[[578,6]]},"256":{"position":[[520,6]]},"278":{"position":[[1417,6]]},"368":{"position":[[252,6],[337,6],[727,6],[765,6],[826,6],[864,6],[1330,6],[1574,6],[1584,6],[1780,6],[1787,6],[1822,7],[1830,6],[1901,6],[1917,6],[2054,6],[2245,6],[2252,6],[2267,6],[2295,6],[2346,6],[2362,6],[2779,6],[2786,6],[2801,6],[2874,6],[2890,6],[3078,8],[3087,7],[3160,6],[3293,6],[3628,6]]},"370":{"position":[[49,6],[149,6],[285,6],[331,6],[338,6],[362,6],[693,6],[852,6],[918,6]]},"430":{"position":[[66,6],[77,6],[257,6]]},"432":{"position":[[69,6]]},"434":{"position":[[267,6],[864,6],[1838,6],[2177,6],[2225,6],[2643,6],[3591,6]]},"436":{"position":[[483,6],[985,6],[1128,6],[1270,6],[1408,6]]},"438":{"position":[[216,6]]},"440":{"position":[[202,6],[345,6],[487,6],[625,6]]},"442":{"position":[[289,6],[488,6],[741,6],[1121,6],[2027,6]]},"444":{"position":[[161,6],[230,6]]},"446":{"position":[[18,6]]},"448":{"position":[[1190,6]]},"471":{"position":[[513,6]]},"473":{"position":[[0,6],[7,6],[22,6],[70,6],[108,6],[144,6],[264,6],[284,6]]}}}],["docker.io/foxxmd/multi",{"_index":2106,"t":{"368":{"position":[[139,22]]}}}],["dockerhub",{"_index":2105,"t":{"368":{"position":[[97,9]]}}}],["docs.rocksky.app",{"_index":656,"t":{"63":{"position":[[91,16]]}}}],["docs:instal",{"_index":2157,"t":{"374":{"position":[[221,12]]}}}],["docsit",{"_index":2081,"t":{"362":{"position":[[236,7],[446,7]]}}}],["docsite/packag",{"_index":2089,"t":{"362":{"position":[[502,15]]}}}],["document",{"_index":861,"t":{"94":{"position":[[84,13]]},"343":{"position":[[13,9]]},"349":{"position":[[718,13]]},"366":{"position":[[61,8]]},"378":{"position":[[5,8],[209,8]]},"402":{"position":[[1660,13]]},"418":{"position":[[92,14]]},"428":{"position":[[31,8]]},"458":{"position":[[21,13]]},"460":{"position":[[22,13]]}}}],["doesn't",{"_index":718,"t":{"75":{"position":[[454,7]]}}}],["domain",{"_index":669,"t":{"66":{"position":[[227,7]]},"73":{"position":[[281,6],[318,7]]},"148":{"position":[[783,6]]},"190":{"position":[[1410,6],[1843,7],[1890,6],[2505,6],[3457,6]]},"204":{"position":[[134,6]]},"210":{"position":[[479,6]]},"222":{"position":[[2026,7],[3535,6]]},"402":{"position":[[1841,6]]}}}],["domain.tld",{"_index":1412,"t":{"210":{"position":[[350,13]]}}}],["domain/ip:port",{"_index":1439,"t":{"218":{"position":[[299,14]]}}}],["don't",{"_index":66,"t":{"9":{"position":[[421,5]]},"70":{"position":[[42,5]]},"172":{"position":[[137,5]]},"287":{"position":[[1982,5]]},"294":{"position":[[462,5]]}}}],["done",{"_index":366,"t":{"23":{"position":[[645,5],[1402,5]]},"35":{"position":[[137,4]]},"45":{"position":[[392,4]]},"53":{"position":[[46,4]]},"61":{"position":[[621,4]]},"68":{"position":[[703,4]]},"124":{"position":[[107,4]]},"315":{"position":[[27,4],[143,4]]},"398":{"position":[[2136,4]]},"442":{"position":[[230,4],[1308,4]]},"444":{"position":[[258,5]]}}}],["dottransform",{"_index":1595,"t":{"236":{"position":[[1216,17],[1623,16]]}}}],["doubl",{"_index":938,"t":{"102":{"position":[[740,6]]}}}],["down",{"_index":817,"t":{"86":{"position":[[57,4]]},"420":{"position":[[1136,4]]}}}],["downstream",{"_index":1547,"t":{"226":{"position":[[844,10]]},"228":{"position":[[765,10]]},"232":{"position":[[462,10],[1253,10]]}}}],["drastic",{"_index":1809,"t":{"282":{"position":[[1254,11]]}}}],["dream",{"_index":1625,"t":{"242":{"position":[[589,8],[641,8],[767,8],[819,8]]}}}],["drink",{"_index":2444,"t":{"420":{"position":[[1898,8]]}}}],["driver",{"_index":402,"t":{"23":{"position":[[3338,7]]}}}],["drop",{"_index":2163,"t":{"374":{"position":[[508,4]]}}}],["due",{"_index":990,"t":{"108":{"position":[[1105,3]]},"206":{"position":[[2100,3]]},"210":{"position":[[415,3]]},"222":{"position":[[241,3],[4812,3]]},"226":{"position":[[318,3]]},"240":{"position":[[530,3]]},"265":{"position":[[961,3]]},"267":{"position":[[358,3]]},"347":{"position":[[227,3]]},"420":{"position":[[2248,3]]}}}],["dumpvlcmetadata",{"_index":1402,"t":{"206":{"position":[[2462,18]]}}}],["duplic",{"_index":384,"t":{"23":{"position":[[1940,9]]},"106":{"position":[[550,11]]},"226":{"position":[[698,9],[874,9]]},"398":{"position":[[2494,9],[4056,11]]},"420":{"position":[[885,9]]},"448":{"position":[[1747,11]]}}}],["durat",{"_index":223,"t":{"13":{"position":[[4218,11]]},"86":{"position":[[832,8]]},"92":{"position":[[187,10],[453,11]]},"96":{"position":[[138,8]]},"112":{"position":[[1454,8]]},"190":{"position":[[427,8]]},"218":{"position":[[204,8]]},"238":{"position":[[506,11],[561,8]]},"242":{"position":[[1058,8]]},"282":{"position":[[154,8],[426,8]]},"349":{"position":[[213,9]]},"389":{"position":[[726,9],[851,9]]},"393":{"position":[[1410,8]]}}}],["dure",{"_index":1164,"t":{"150":{"position":[[80,6]]},"222":{"position":[[2817,6]]},"230":{"position":[[139,6]]},"287":{"position":[[2003,6]]},"347":{"position":[[2065,6]]},"374":{"position":[[285,6]]}}}],["e",{"_index":135,"t":{"13":{"position":[[684,1],[714,1]]},"368":{"position":[[2817,1]]},"370":{"position":[[397,1],[451,1],[488,1],[514,1],[542,1],[576,1],[601,1],[616,1],[728,1],[743,1],[758,1]]},"391":{"position":[[1218,3],[1287,4],[2031,3],[2043,2],[2494,3],[2621,2]]},"393":{"position":[[2552,3],[2564,2]]},"396":{"position":[[1058,3],[1136,4]]}}}],["e0cce74f",{"_index":1663,"t":{"244":{"position":[[1181,8]]}}}],["e4xwktm7jxm607x8el1fcda30eu14dzb64h3j",{"_index":1259,"t":{"186":{"position":[[549,40],[815,40]]}}}],["e90b20526808373353afad7fb98a201198c0c3e0555bea19f182df3388af7b17",{"_index":462,"t":{"31":{"position":[[1732,69]]}}}],["each",{"_index":161,"t":{"13":{"position":[[1483,4],[2299,4],[2376,4],[3166,4]]},"15":{"position":[[214,4]]},"21":{"position":[[448,4]]},"31":{"position":[[317,4]]},"61":{"position":[[418,4]]},"68":{"position":[[500,4]]},"75":{"position":[[73,4],[113,4]]},"94":{"position":[[70,4],[471,4]]},"96":{"position":[[1156,4]]},"112":{"position":[[919,4]]},"204":{"position":[[760,4]]},"234":{"position":[[0,4],[456,4],[536,4]]},"236":{"position":[[105,4]]},"238":{"position":[[0,4],[697,4],[732,4],[809,5],[836,4]]},"242":{"position":[[39,4],[153,4]]},"244":{"position":[[333,4]]},"252":{"position":[[0,4]]},"256":{"position":[[138,4],[299,4]]},"265":{"position":[[749,4]]},"267":{"position":[[146,4]]},"276":{"position":[[227,4],[932,4]]},"278":{"position":[[1029,4],[1190,4]]},"285":{"position":[[0,4]]},"287":{"position":[[1152,4],[1299,4]]},"289":{"position":[[634,4],[2964,4]]},"300":{"position":[[460,4]]},"311":{"position":[[393,4]]},"319":{"position":[[0,4]]},"347":{"position":[[434,4]]},"436":{"position":[[857,4]]},"440":{"position":[[74,4]]}}}],["earli",{"_index":1606,"t":{"240":{"position":[[79,6]]}}}],["earlier",{"_index":1573,"t":{"232":{"position":[[612,7]]},"420":{"position":[[1114,7]]},"434":{"position":[[2489,8]]},"442":{"position":[[792,8],[1172,8],[2078,8]]},"444":{"position":[[192,7]]}}}],["eas",{"_index":2538,"t":{"448":{"position":[[1730,4]]}}}],["easi",{"_index":1758,"t":{"265":{"position":[[1580,4]]},"287":{"position":[[258,4]]},"448":{"position":[[1136,4]]}}}],["easili",{"_index":2540,"t":{"448":{"position":[[1869,6]]}}}],["ec42e09d5ae0ee0f0816ca151008412a",{"_index":197,"t":{"13":{"position":[[2674,35],[4568,35]]},"17":{"position":[[1079,35]]},"43":{"position":[[583,35],[933,35]]},"140":{"position":[[423,35],[773,35]]},"192":{"position":[[377,35],[729,35]]}}}],["echo",{"_index":1291,"t":{"190":{"position":[[1364,4],[1369,4],[1864,4],[2691,5],[3438,4],[3884,4]]}}}],["echo.multi",{"_index":1292,"t":{"190":{"position":[[1379,10]]}}}],["echo:36",{"_index":1306,"t":{"190":{"position":[[2630,7],[2785,7],[3411,7]]}}}],["edit",{"_index":1385,"t":{"206":{"position":[[899,7]]},"222":{"position":[[3157,4]]},"265":{"position":[[790,6]]},"267":{"position":[[187,6]]}}}],["editor",{"_index":1734,"t":{"265":{"position":[[741,7]]},"267":{"position":[[138,7]]},"424":{"position":[[165,6]]}}}],["editor/valid",{"_index":524,"t":{"37":{"position":[[469,16],[779,16]]},"43":{"position":[[727,16],[1097,16]]},"51":{"position":[[882,16],[1207,16]]},"55":{"position":[[382,16],[663,16]]},"59":{"position":[[511,16],[848,16]]},"66":{"position":[[898,16],[1185,16]]},"73":{"position":[[1019,16],[1290,16]]},"98":{"position":[[607,16],[893,16]]},"104":{"position":[[403,16],[725,16]]},"110":{"position":[[846,16],[1113,16]]},"114":{"position":[[262,16],[480,16]]},"120":{"position":[[494,16],[749,16]]},"122":{"position":[[2733,16],[3375,16]]},"128":{"position":[[441,16],[716,16]]},"130":{"position":[[888,16],[1198,16]]},"136":{"position":[[450,16],[661,16]]},"140":{"position":[[567,16],[937,16]]},"144":{"position":[[525,16],[850,16]]},"152":{"position":[[529,16],[740,16]]},"156":{"position":[[549,16],[886,16]]},"160":{"position":[[476,16],[757,16]]},"168":{"position":[[264,16],[537,16]]},"172":{"position":[[538,16],[785,16]]},"176":{"position":[[354,16],[637,16]]},"180":{"position":[[381,16],[633,16]]},"186":{"position":[[673,16],[960,16]]},"188":{"position":[[2747,16],[3311,16]]},"192":{"position":[[530,16],[903,16]]},"196":{"position":[[437,16],[751,16]]},"204":{"position":[[1981,16],[2316,16]]},"208":{"position":[[306,16],[540,16]]},"216":{"position":[[529,16],[776,16]]},"220":{"position":[[286,16],[504,16]]},"224":{"position":[[675,16],[1053,16]]}}}],["effect",{"_index":2422,"t":{"420":{"position":[[458,6]]}}}],["effort",{"_index":1752,"t":{"265":{"position":[[1303,6]]},"269":{"position":[[207,6]]}}}],["eleph",{"_index":1623,"t":{"242":{"position":[[506,9],[559,9],[684,9],[737,9],[1220,8],[1335,10],[1465,9],[1630,10]]},"322":{"position":[[102,9],[322,10]]}}}],["elimin",{"_index":959,"t":{"106":{"position":[[536,9]]},"289":{"position":[[318,9]]},"296":{"position":[[381,9],[522,10]]}}}],["elsewher",{"_index":316,"t":{"17":{"position":[[1906,9]]}}}],["email",{"_index":1762,"t":{"272":{"position":[[112,5]]},"436":{"position":[[548,5]]},"438":{"position":[[281,5]]}}}],["emit",{"_index":2363,"t":{"398":{"position":[[3287,4],[3633,4],[3729,5]]}}}],["emitt",{"_index":2228,"t":{"385":{"position":[[688,8],[757,9]]}}}],["empti",{"_index":765,"t":{"77":{"position":[[2223,6],[2459,6]]},"90":{"position":[[313,5]]},"222":{"position":[[2053,5],[4969,5]]},"287":{"position":[[1532,5]]},"315":{"position":[[477,5]]},"319":{"position":[[450,5]]},"362":{"position":[[205,5]]}}}],["emul",{"_index":2308,"t":{"393":{"position":[[246,8]]}}}],["enabl",{"_index":54,"t":{"9":{"position":[[169,7],[313,7],[1129,6]]},"13":{"position":[[2569,9],[3515,7],[4426,9],[4692,9]]},"25":{"position":[[40,6],[154,8]]},"43":{"position":[[476,9],[826,9]]},"51":{"position":[[115,6],[678,9],[982,9]]},"55":{"position":[[221,9],[482,9]]},"59":{"position":[[297,9],[608,9]]},"96":{"position":[[292,7]]},"98":{"position":[[401,9],[685,9]]},"104":{"position":[[178,9],[481,9]]},"108":{"position":[[3393,6],[3437,6]]},"110":{"position":[[191,6]]},"112":{"position":[[1835,9]]},"114":{"position":[[147,9],[344,9]]},"116":{"position":[[91,8]]},"120":{"position":[[197,8],[262,8],[352,9],[587,9]]},"122":{"position":[[2174,9],[2812,9]]},"124":{"position":[[86,8]]},"128":{"position":[[275,9],[532,9]]},"132":{"position":[[12,7]]},"136":{"position":[[354,9],[540,9]]},"140":{"position":[[316,9],[666,9]]},"144":{"position":[[321,9],[625,9]]},"146":{"position":[[12,7]]},"152":{"position":[[431,9],[618,9]]},"156":{"position":[[335,9],[646,9]]},"160":{"position":[[315,9],[576,9]]},"162":{"position":[[301,7]]},"168":{"position":[[104,9],[357,9]]},"172":{"position":[[401,9],[629,9]]},"176":{"position":[[161,9],[427,9]]},"178":{"position":[[88,6],[359,8]]},"180":{"position":[[225,9],[475,9]]},"188":{"position":[[2295,9],[2841,9]]},"190":{"position":[[55,7],[1458,8]]},"192":{"position":[[272,9],[624,9]]},"196":{"position":[[240,9],[532,9]]},"206":{"position":[[63,6],[278,6],[1618,9],[2413,9]]},"208":{"position":[[162,9],[379,9]]},"216":{"position":[[112,6]]},"220":{"position":[[184,9],[379,9]]},"222":{"position":[[1045,9],[2592,9],[3821,9]]},"224":{"position":[[412,9],[769,9]]},"230":{"position":[[403,9]]},"244":{"position":[[233,7]]},"256":{"position":[[253,8]]},"278":{"position":[[1144,8]]},"282":{"position":[[6353,6]]},"289":{"position":[[2437,6],[2490,7],[2553,7],[2616,7]]},"300":{"position":[[141,6],[292,6],[472,6]]},"414":{"position":[[424,6]]},"426":{"position":[[65,6],[219,6]]},"434":{"position":[[2375,8]]},"436":{"position":[[751,6],[802,7],[869,6]]},"440":{"position":[[19,7],[86,6]]}}}],["encount",{"_index":1026,"t":{"108":{"position":[[3152,11]]},"240":{"position":[[364,10]]},"374":{"position":[[308,9]]}}}],["end",{"_index":650,"t":{"61":{"position":[[1739,3]]},"190":{"position":[[161,4]]},"192":{"position":[[194,3]]},"212":{"position":[[92,3]]},"222":{"position":[[3620,3]]},"240":{"position":[[74,4]]},"289":{"position":[[498,6]]},"393":{"position":[[206,4]]},"430":{"position":[[100,3]]}}}],["endless",{"_index":1680,"t":{"248":{"position":[[744,8],[878,8]]},"282":{"position":[[3030,8],[4497,8],[4845,8],[5447,8],[5667,8]]},"294":{"position":[[647,8],[845,8]]}}}],["endors",{"_index":1446,"t":{"222":{"position":[[71,8]]}}}],["endpoint",{"_index":435,"t":{"29":{"position":[[64,8]]},"31":{"position":[[1507,9],[1714,9],[1823,9]]},"33":{"position":[[3,8]]},"39":{"position":[[207,10]]},"57":{"position":[[224,10]]},"83":{"position":[[433,10],[517,10]]},"112":{"position":[[1990,9]]},"134":{"position":[[237,8]]},"136":{"position":[[112,8]]},"138":{"position":[[272,10]]},"148":{"position":[[552,8]]},"150":{"position":[[224,9]]},"152":{"position":[[110,8]]},"154":{"position":[[323,10]]},"194":{"position":[[108,8],[451,10]]},"337":{"position":[[153,9]]},"345":{"position":[[332,10]]},"347":{"position":[[3191,8],[3339,8]]},"368":{"position":[[2189,11]]},"380":{"position":[[231,8],[325,9],[426,8],[509,8]]},"398":{"position":[[1409,9]]},"402":{"position":[[128,8],[1714,8]]},"434":{"position":[[1670,8],[1713,8],[1784,8]]},"448":{"position":[[237,10],[274,10],[778,8]]}}}],["endpointlfm",{"_index":1149,"t":{"136":{"position":[[594,13]]}}}],["endpointlz",{"_index":778,"t":{"77":{"position":[[3058,13]]},"152":{"position":[[674,12]]}}}],["enforc",{"_index":1912,"t":{"289":{"position":[[2689,9]]},"343":{"position":[[345,8]]},"345":{"position":[[73,8]]}}}],["english",{"_index":1890,"t":{"289":{"position":[[1469,7],[1904,8],[2057,7]]}}}],["enhanc",{"_index":381,"t":{"23":{"position":[[1871,7]]},"226":{"position":[[47,7]]},"234":{"position":[[87,9]]},"256":{"position":[[955,8]]},"278":{"position":[[1995,8]]},"300":{"position":[[98,8],[247,12]]},"446":{"position":[[385,12]]}}}],["enhance/correct",{"_index":2531,"t":{"448":{"position":[[584,15]]}}}],["enough",{"_index":1553,"t":{"228":{"position":[[149,6]]},"265":{"position":[[103,6]]},"282":{"position":[[6836,8]]},"287":{"position":[[1641,6]]},"292":{"position":[[182,6]]},"393":{"position":[[1476,6],[2719,6]]}}}],["ensur",{"_index":512,"t":{"35":{"position":[[1471,6]]},"124":{"position":[[197,6]]},"289":{"position":[[356,6],[409,6],[2139,7]]},"347":{"position":[[1856,6],[2527,6]]},"402":{"position":[[2242,6]]},"404":{"position":[[0,6]]},"406":{"position":[[199,6]]},"442":{"position":[[2179,6]]},"448":{"position":[[2012,6]]}}}],["enter",{"_index":1522,"t":{"222":{"position":[[5248,5]]},"406":{"position":[[285,8]]}}}],["entir",{"_index":1803,"t":{"282":{"position":[[214,6]]},"337":{"position":[[27,8]]},"402":{"position":[[2304,8]]}}}],["entri",{"_index":262,"t":{"15":{"position":[[219,5]]},"86":{"position":[[1313,5]]}}}],["env",{"_index":62,"t":{"9":{"position":[[348,3]]},"13":{"position":[[56,5],[296,3],[452,3],[1850,4]]},"17":{"position":[[1184,3],[1366,4],[1674,3],[1796,3]]},"21":{"position":[[180,3]]},"23":{"position":[[842,3],[1599,3],[2223,3],[2577,3],[2711,3],[3558,3]]},"25":{"position":[[527,3]]},"27":{"position":[[299,3]]},"37":{"position":[[0,3],[13,3]]},"41":{"position":[[368,3]]},"43":{"position":[[0,3],[13,3]]},"47":{"position":[[368,3]]},"49":{"position":[[92,3]]},"51":{"position":[[0,3],[13,3]]},"55":{"position":[[0,3],[13,3]]},"59":{"position":[[0,3],[13,3]]},"66":{"position":[[419,3],[432,3]]},"73":{"position":[[557,3],[570,3]]},"90":{"position":[[460,3]]},"92":{"position":[[668,5]]},"98":{"position":[[0,3]]},"104":{"position":[[0,3]]},"110":{"position":[[0,3],[246,4]]},"114":{"position":[[0,3]]},"120":{"position":[[0,3],[13,3]]},"122":{"position":[[1198,3]]},"128":{"position":[[0,3],[13,3]]},"130":{"position":[[308,3],[387,3],[400,3],[436,3],[516,4]]},"136":{"position":[[0,3],[13,3],[214,4]]},"140":{"position":[[0,3],[13,3],[49,3],[133,4]]},"144":{"position":[[0,3],[13,3],[49,3],[135,4]]},"148":{"position":[[426,4]]},"152":{"position":[[0,3],[13,3],[212,4]]},"156":{"position":[[0,3],[13,3],[49,3],[143,4]]},"158":{"position":[[192,3]]},"160":{"position":[[0,3],[13,3],[49,3],[131,4]]},"168":{"position":[[0,3],[13,3],[32,3]]},"170":{"position":[[1000,4],[1720,5]]},"172":{"position":[[0,3],[13,3]]},"176":{"position":[[0,3],[13,3]]},"180":{"position":[[0,3],[13,3]]},"186":{"position":[[125,3],[189,3],[202,3],[238,3],[322,4]]},"188":{"position":[[470,5],[1546,3],[1559,3]]},"190":{"position":[[1731,4],[2169,4],[2863,3],[4033,4]]},"192":{"position":[[0,3],[13,3]]},"196":{"position":[[0,3],[13,3]]},"202":{"position":[[126,3]]},"204":{"position":[[1449,3],[1462,3],[1498,3],[1582,4]]},"208":{"position":[[0,3],[13,3]]},"216":{"position":[[0,3],[13,3],[154,4]]},"220":{"position":[[0,3],[13,3]]},"222":{"position":[[1019,4],[2565,5],[3422,4]]},"224":{"position":[[0,3],[13,3]]},"256":{"position":[[64,3],[111,3],[320,3],[433,4],[539,3]]},"265":{"position":[[1523,3],[1600,3]]},"278":{"position":[[95,3],[177,3],[997,3],[1211,3],[1325,4],[1436,3]]},"305":{"position":[[76,3]]},"366":{"position":[[31,3]]},"370":{"position":[[353,3]]},"374":{"position":[[714,3]]},"387":{"position":[[560,4],[920,6]]},"420":{"position":[[1626,5]]},"434":{"position":[[1797,3],[2051,4]]},"448":{"position":[[1163,4]]}}}],["env/fil",{"_index":1071,"t":{"116":{"position":[[311,8]]},"124":{"position":[[279,8]]}}}],["environ",{"_index":143,"t":{"13":{"position":[[850,12]]},"17":{"position":[[766,11]]},"27":{"position":[[129,12]]},"53":{"position":[[193,11]]},"170":{"position":[[1157,12]]},"256":{"position":[[695,12]]},"278":{"position":[[1592,12]]},"368":{"position":[[445,12],[2942,12]]},"370":{"position":[[1026,12]]},"432":{"position":[[224,12]]},"434":{"position":[[240,11],[837,11],[1811,11],[2205,11],[2616,11]]},"436":{"position":[[456,11],[958,11],[1101,11],[1243,11],[1381,11]]},"438":{"position":[[189,11]]},"440":{"position":[[175,11],[318,11],[460,11],[598,11]]},"442":{"position":[[377,11],[714,11],[1094,11],[2000,11]]}}}],["environment",{"_index":107,"t":{"13":{"position":[[42,13],[328,13],[1220,13],[2880,13]]},"17":{"position":[[70,13],[434,13],[712,13],[1418,13],[1553,13]]},"23":{"position":[[850,13],[1607,13],[2231,13],[2727,13],[3574,13]]},"37":{"position":[[29,13]]},"43":{"position":[[29,13]]},"51":{"position":[[29,13]]},"55":{"position":[[29,13]]},"59":{"position":[[29,13]]},"66":{"position":[[448,13]]},"73":{"position":[[586,13]]},"98":{"position":[[13,13]]},"104":{"position":[[13,13]]},"110":{"position":[[108,13]]},"114":{"position":[[13,13]]},"120":{"position":[[29,13]]},"122":{"position":[[1211,13]]},"128":{"position":[[29,13]]},"136":{"position":[[29,13]]},"152":{"position":[[29,13]]},"172":{"position":[[29,13]]},"176":{"position":[[29,13]]},"180":{"position":[[29,13]]},"188":{"position":[[1575,13]]},"192":{"position":[[29,13]]},"196":{"position":[[29,13]]},"208":{"position":[[29,13]]},"216":{"position":[[29,13]]},"220":{"position":[[29,13]]},"224":{"position":[[29,13]]},"368":{"position":[[3052,13],[3359,13]]},"374":{"position":[[1348,13]]},"402":{"position":[[1501,13]]},"432":{"position":[[406,13]]}}}],["eol",{"_index":2173,"t":{"376":{"position":[[150,4]]}}}],["ep",{"_index":1850,"t":{"287":{"position":[[322,4],[811,3]]},"292":{"position":[[496,2],[554,6],[909,2],[967,6]]},"305":{"position":[[364,6]]},"309":{"position":[[461,6]]}}}],["equal",{"_index":901,"t":{"98":{"position":[[326,5]]}}}],["equival",{"_index":1750,"t":{"265":{"position":[[1190,10]]},"269":{"position":[[94,10]]}}}],["error",{"_index":247,"t":{"13":{"position":[[4961,8],[5185,8]]},"17":{"position":[[1405,5]]},"29":{"position":[[117,7]]},"31":{"position":[[148,5],[785,5],[982,8],[1138,5],[1380,8]]},"33":{"position":[[181,5]]},"77":{"position":[[122,6],[276,5],[651,5]]},"108":{"position":[[223,6],[3145,6]]},"222":{"position":[[1240,6],[5091,6]]},"240":{"position":[[378,5]]},"347":{"position":[[2657,6],[2809,5]]},"374":{"position":[[278,6],[321,5]]},"391":{"position":[[2530,5],[2567,5],[2592,5]]},"406":{"position":[[11,6],[74,6]]},"409":{"position":[[158,5],[193,5],[225,5],[239,6],[415,6]]}}}],["error('error",{"_index":2344,"t":{"396":{"position":[[1074,12]]}}}],["error(`'baseurl",{"_index":2291,"t":{"391":{"position":[[1105,16]]}}}],["error(`'token",{"_index":2289,"t":{"391":{"position":[[952,14]]}}}],["error(`could",{"_index":2294,"t":{"391":{"position":[[1234,12]]}}}],["error/network",{"_index":2014,"t":{"347":{"position":[[237,13]]}}}],["essenti",{"_index":2454,"t":{"420":{"position":[[2148,9]]}}}],["etc",{"_index":300,"t":{"17":{"position":[[1351,6]]},"27":{"position":[[248,7]]},"61":{"position":[[531,6]]},"68":{"position":[[613,6]]},"81":{"position":[[177,6]]},"236":{"position":[[436,7]]},"238":{"position":[[667,7]]},"248":{"position":[[544,7]]},"250":{"position":[[842,6]]},"256":{"position":[[469,6]]},"278":{"position":[[1361,6]]},"287":{"position":[[715,6],[815,6],[931,6],[1025,6]]},"298":{"position":[[166,6]]},"345":{"position":[[343,6]]},"349":{"position":[[257,6],[483,6]]},"380":{"position":[[623,6]]},"414":{"position":[[156,7]]},"420":{"position":[[2777,7]]},"452":{"position":[[230,6]]}}}],["evalu",{"_index":1326,"t":{"190":{"position":[[3825,8]]}}}],["even",{"_index":619,"t":{"61":{"position":[[538,4]]},"68":{"position":[[620,4]]},"265":{"position":[[318,4]]},"282":{"position":[[481,4],[720,4]]}}}],["event",{"_index":438,"t":{"31":{"position":[[70,7]]},"347":{"position":[[212,5]]},"398":{"position":[[1309,6],[1620,6],[1655,6],[3738,5]]}}}],["eventemitt",{"_index":2229,"t":{"385":{"position":[[697,13]]}}}],["eventu",{"_index":1313,"t":{"190":{"position":[[3027,11]]}}}],["everyone'",{"_index":726,"t":{"75":{"position":[[796,10]]}}}],["everyth",{"_index":397,"t":{"23":{"position":[[3243,10]]},"33":{"position":[[136,10]]},"75":{"position":[[528,10],[876,10]]},"122":{"position":[[2314,10]]},"289":{"position":[[885,10],[979,10]]},"448":{"position":[[1438,10]]}}}],["ex",{"_index":331,"t":{"21":{"position":[[476,2]]},"23":{"position":[[3734,3]]},"35":{"position":[[359,2],[617,2]]},"49":{"position":[[225,3]]},"51":{"position":[[577,2]]},"110":{"position":[[336,2],[527,2]]},"210":{"position":[[164,2]]},"218":{"position":[[533,2]]},"222":{"position":[[3125,3]]},"248":{"position":[[308,2],[606,2]]},"287":{"position":[[1367,2],[1456,2]]},"289":{"position":[[847,2],[939,2]]},"317":{"position":[[726,2]]},"332":{"position":[[159,2]]},"345":{"position":[[493,2]]},"368":{"position":[[1054,3]]},"402":{"position":[[2058,2]]},"404":{"position":[[595,2]]},"442":{"position":[[1530,2],[1784,2]]}}}],["exact",{"_index":1355,"t":{"204":{"position":[[288,5]]}}}],["exactli",{"_index":1489,"t":{"222":{"position":[[2334,7],[3062,7],[3271,7]]},"448":{"position":[[1581,7]]}}}],["exampl",{"_index":8,"t":{"2":{"position":[[112,8]]},"13":{"position":[[640,7],[1914,7],[2112,8],[2211,7],[2233,8],[2429,7],[2512,7],[3615,7],[3739,7],[3836,7],[3858,8],[3981,7],[4026,7]]},"17":{"position":[[138,8],[470,7]]},"21":{"position":[[468,7]]},"23":{"position":[[802,8],[1559,8],[2183,8],[2719,7],[2917,7],[3566,7],[3765,7]]},"31":{"position":[[336,7],[801,7],[1154,7],[1534,7]]},"35":{"position":[[958,9],[977,8],[1017,7]]},"37":{"position":[[452,7],[762,7]]},"41":{"position":[[238,7]]},"43":{"position":[[710,7],[1080,7]]},"47":{"position":[[238,7]]},"51":{"position":[[865,7],[1190,7]]},"53":{"position":[[97,7]]},"55":{"position":[[365,7],[646,7]]},"59":{"position":[[494,7],[831,7]]},"66":{"position":[[881,7],[1168,7]]},"73":{"position":[[1002,7],[1273,7]]},"81":{"position":[[114,8]]},"90":{"position":[[592,8]]},"96":{"position":[[698,9]]},"98":{"position":[[590,7],[876,7]]},"104":{"position":[[386,7],[708,7]]},"106":{"position":[[271,7]]},"108":{"position":[[2265,7],[2797,7],[3426,7],[3456,7]]},"110":{"position":[[629,7],[829,7],[863,7],[1096,7]]},"112":{"position":[[1794,7]]},"114":{"position":[[94,7],[245,7],[279,7],[463,7]]},"118":{"position":[[620,8],[629,8]]},"120":{"position":[[477,7],[732,7]]},"122":{"position":[[2716,7],[3358,7]]},"126":{"position":[[612,8],[621,8]]},"128":{"position":[[424,7],[699,7]]},"130":{"position":[[871,7],[1181,7]]},"136":{"position":[[433,7],[644,7]]},"140":{"position":[[550,7],[920,7]]},"144":{"position":[[508,7],[833,7]]},"152":{"position":[[512,7],[723,7]]},"156":{"position":[[532,7],[869,7]]},"160":{"position":[[459,7],[740,7]]},"162":{"position":[[921,8],[930,8]]},"164":{"position":[[342,7]]},"166":{"position":[[345,7]]},"168":{"position":[[247,7],[520,7]]},"172":{"position":[[521,7],[768,7]]},"176":{"position":[[337,7],[620,7]]},"180":{"position":[[364,7],[616,7]]},"186":{"position":[[656,7],[943,7]]},"188":{"position":[[686,8],[2730,7],[3294,7]]},"190":{"position":[[1503,8]]},"192":{"position":[[513,7],[886,7]]},"196":{"position":[[420,7],[734,7]]},"204":{"position":[[772,8],[1964,7],[2299,7]]},"206":{"position":[[1535,7],[1543,7]]},"208":{"position":[[289,7],[523,7]]},"212":{"position":[[153,7]]},"216":{"position":[[512,7],[759,7]]},"220":{"position":[[269,7],[487,7]]},"224":{"position":[[658,7],[1036,7]]},"232":{"position":[[737,8]]},"234":{"position":[[130,8]]},"236":{"position":[[397,9],[444,7],[1124,7],[1959,7]]},"240":{"position":[[895,7],[1176,7]]},"242":{"position":[[1161,7],[1365,7]]},"244":{"position":[[472,7]]},"246":{"position":[[4,8]]},"248":{"position":[[650,7]]},"250":{"position":[[1396,7]]},"254":{"position":[[230,7]]},"256":{"position":[[405,7],[507,7],[581,7]]},"259":{"position":[[0,7]]},"261":{"position":[[0,7]]},"263":{"position":[[149,7]]},"272":{"position":[[745,7]]},"274":{"position":[[116,8]]},"276":{"position":[[358,7],[943,7]]},"278":{"position":[[1296,8],[1404,7],[1478,7]]},"282":{"position":[[518,7],[546,8],[1976,8],[2222,8],[2536,8],[2894,8],[3010,8],[3495,8],[3895,8],[4478,7],[4970,8],[5428,7],[5760,8],[6865,8]]},"289":{"position":[[1401,7]]},"294":{"position":[[525,8]]},"298":{"position":[[374,7]]},"300":{"position":[[530,7]]},"303":{"position":[[0,7]]},"305":{"position":[[88,7]]},"307":{"position":[[277,7]]},"309":{"position":[[185,7]]},"311":{"position":[[406,7]]},"313":{"position":[[215,7]]},"315":{"position":[[170,7],[562,7]]},"322":{"position":[[40,7]]},"324":{"position":[[60,7]]},"326":{"position":[[0,7]]},"328":{"position":[[0,7]]},"330":{"position":[[0,7]]},"332":{"position":[[656,7]]},"347":{"position":[[1070,8],[1805,8],[3052,8]]},"366":{"position":[[44,8]]},"368":{"position":[[244,7],[1772,7],[2237,7],[2771,7]]},"370":{"position":[[64,7],[76,7]]},"374":{"position":[[704,9]]},"383":{"position":[[691,8],[812,8]]},"402":{"position":[[1630,8]]},"416":{"position":[[188,7],[337,7]]},"432":{"position":[[439,8]]},"436":{"position":[[1602,7]]},"440":{"position":[[819,7]]},"442":{"position":[[281,7],[1964,8]]},"446":{"position":[[285,8],[362,7]]},"452":{"position":[[166,8]]},"454":{"position":[[112,8]]}}}],["example.com",{"_index":1160,"t":{"148":{"position":[[790,13]]}}}],["except",{"_index":1575,"t":{"232":{"position":[[695,7]]},"282":{"position":[[2757,6]]},"296":{"position":[[197,6]]},"347":{"position":[[673,9],[2766,9],[2890,9]]},"368":{"position":[[3616,11]]}}}],["exclud",{"_index":1871,"t":{"287":{"position":[[1252,9],[1462,7]]}}}],["execstart=npm",{"_index":2482,"t":{"424":{"position":[[371,13]]}}}],["execut",{"_index":1807,"t":{"282":{"position":[[1083,8]]}}}],["exhaust",{"_index":643,"t":{"61":{"position":[[1528,10]]},"108":{"position":[[494,10]]},"248":{"position":[[221,10]]},"296":{"position":[[320,13]]}}}],["exist",{"_index":36,"t":{"7":{"position":[[235,6]]},"17":{"position":[[1787,8]]},"35":{"position":[[288,9]]},"108":{"position":[[568,8]]},"190":{"position":[[639,8]]},"222":{"position":[[1531,9]]},"232":{"position":[[1494,11],[1533,10]]},"238":{"position":[[1188,8]]},"265":{"position":[[375,8]]},"282":{"position":[[2500,8]]},"326":{"position":[[71,11]]},"360":{"position":[[332,8]]},"398":{"position":[[1474,8]]},"409":{"position":[[100,6]]},"436":{"position":[[127,8]]},"442":{"position":[[1459,9]]}}}],["exit",{"_index":2407,"t":{"409":{"position":[[172,6]]}}}],["expand",{"_index":934,"t":{"102":{"position":[[648,6]]}}}],["expect",{"_index":1837,"t":{"282":{"position":[[6721,6]]},"292":{"position":[[333,6]]},"300":{"position":[[132,8]]},"420":{"position":[[3069,8]]}}}],["experi",{"_index":948,"t":{"106":{"position":[[127,10]]},"108":{"position":[[200,10],[283,10]]},"222":{"position":[[1926,10]]},"420":{"position":[[1239,10]]}}}],["experiment",{"_index":966,"t":{"108":{"position":[[178,13]]}}}],["explain",{"_index":2462,"t":{"420":{"position":[[3057,7]]}}}],["explan",{"_index":1450,"t":{"222":{"position":[[383,12]]}}}],["explicit",{"_index":1934,"t":{"296":{"position":[[115,8]]}}}],["explicitli",{"_index":59,"t":{"9":{"position":[[302,10]]},"21":{"position":[[326,10]]},"41":{"position":[[518,10]]},"47":{"position":[[512,10]]},"94":{"position":[[574,10]]},"96":{"position":[[675,10],[1240,10],[1927,10]]},"108":{"position":[[2050,10]]},"112":{"position":[[1003,10]]},"118":{"position":[[366,10]]},"126":{"position":[[362,10]]},"162":{"position":[[719,10]]},"188":{"position":[[582,10]]},"218":{"position":[[492,10]]},"287":{"position":[[1223,11],[1373,10]]},"368":{"position":[[957,10],[2531,10]]}}}],["explor",{"_index":208,"t":{"13":{"position":[[3924,7]]},"37":{"position":[[425,7],[735,7]]},"43":{"position":[[683,7],[1053,7]]},"51":{"position":[[838,7],[1163,7]]},"55":{"position":[[338,7],[619,7]]},"59":{"position":[[467,7],[804,7]]},"66":{"position":[[854,7],[1141,7]]},"73":{"position":[[975,7],[1246,7]]},"98":{"position":[[563,7],[849,7]]},"104":{"position":[[359,7],[681,7]]},"110":{"position":[[802,7],[1069,7]]},"114":{"position":[[218,7],[436,7]]},"120":{"position":[[450,7],[705,7]]},"122":{"position":[[2689,7],[3331,7]]},"128":{"position":[[397,7],[672,7]]},"130":{"position":[[844,7],[1154,7]]},"136":{"position":[[406,7],[617,7]]},"140":{"position":[[523,7],[893,7]]},"144":{"position":[[481,7],[806,7]]},"152":{"position":[[485,7],[696,7]]},"156":{"position":[[505,7],[842,7]]},"160":{"position":[[432,7],[713,7]]},"168":{"position":[[220,7],[493,7]]},"172":{"position":[[494,7],[741,7]]},"176":{"position":[[310,7],[593,7]]},"180":{"position":[[337,7],[589,7]]},"186":{"position":[[629,7],[916,7]]},"188":{"position":[[2703,7],[3267,7]]},"192":{"position":[[486,7],[859,7]]},"196":{"position":[[393,7],[707,7]]},"204":{"position":[[1937,7],[2272,7]]},"208":{"position":[[262,7],[496,7]]},"216":{"position":[[485,7],[732,7]]},"220":{"position":[[242,7],[460,7]]},"224":{"position":[[631,7],[1009,7]]}}}],["export",{"_index":148,"t":{"13":{"position":[[1026,6]]},"383":{"position":[[458,6],[870,6],[968,6],[1455,6],[1535,6],[1741,6],[1799,6]]},"385":{"position":[[439,6]]},"387":{"position":[[375,6]]},"389":{"position":[[336,6]]},"391":{"position":[[357,6],[1617,6],[2255,6]]},"393":{"position":[[1684,6]]},"396":{"position":[[439,6]]},"398":{"position":[[882,6],[2801,6],[3473,6]]}}}],["expos",{"_index":827,"t":{"86":{"position":[[685,6],[1036,6]]},"170":{"position":[[1343,6]]}}}],["express",{"_index":1391,"t":{"206":{"position":[[1190,12],[1367,10],[1470,12]]},"242":{"position":[[194,11],[906,10]]},"250":{"position":[[409,12]]},"313":{"position":[[39,12]]},"315":{"position":[[57,11]]},"317":{"position":[[21,10],[95,11],[187,10],[234,11],[410,11]]},"319":{"position":[[49,12]]}}}],["expressj",{"_index":1983,"t":{"337":{"position":[[219,10]]}}}],["extend",{"_index":2197,"t":{"383":{"position":[[496,7],[910,7],[1011,7]]},"385":{"position":[[477,7]]},"389":{"position":[[374,7]]},"391":{"position":[[395,7],[1655,7],[2293,7]]},"393":{"position":[[1722,7]]},"396":{"position":[[477,7]]},"398":{"position":[[920,7],[2836,7],[3514,7]]}}}],["extens",{"_index":1175,"t":{"162":{"position":[[291,9]]},"210":{"position":[[34,9],[255,9]]},"214":{"position":[[171,10],[314,10]]},"341":{"position":[[226,10]]},"402":{"position":[[92,9],[2457,9]]},"448":{"position":[[1294,9]]}}}],["extern",{"_index":350,"t":{"23":{"position":[[89,8],[1834,8]]}}}],["extra",{"_index":1375,"t":{"206":{"position":[[246,5]]}}}],["extract",{"_index":1389,"t":{"206":{"position":[[1109,7],[1309,7],[1412,10],[1692,8],[1868,7]]},"234":{"position":[[288,7]]},"236":{"position":[[1366,8]]},"248":{"position":[[52,7],[552,8]]},"250":{"position":[[572,7],[726,7],[807,7],[1112,7],[1361,7],[1498,9]]},"263":{"position":[[34,7]]},"278":{"position":[[679,9]]},"282":{"position":[[3602,9],[3719,7],[3834,10],[3965,9],[4214,7],[4604,8],[4680,8],[5047,9],[5323,7],[5377,7],[5584,8],[5836,9]]},"292":{"position":[[647,10],[1052,9]]},"309":{"position":[[80,10]]}}}],["f12",{"_index":923,"t":{"102":{"position":[[324,3]]}}}],["f243331e",{"_index":2198,"t":{"383":{"position":[[700,8]]}}}],["face",{"_index":1415,"t":{"210":{"position":[[547,6]]}}}],["factori",{"_index":1686,"t":{"248":{"position":[[825,9],[944,9]]},"282":{"position":[[4578,8],[4640,7],[4911,9],[5527,7]]},"294":{"position":[[728,9],[911,9]]}}}],["fail",{"_index":362,"t":{"23":{"position":[[310,6]]},"33":{"position":[[281,7]]},"240":{"position":[[415,5],[769,5],[1037,6],[1345,5]]},"282":{"position":[[7091,6]]},"309":{"position":[[813,5]]},"347":{"position":[[696,6],[2631,6]]},"402":{"position":[[2515,6]]}}}],["failur",{"_index":440,"t":{"31":{"position":[[179,7]]},"347":{"position":[[1627,8],[2749,7],[2787,7],[2969,8]]},"448":{"position":[[1014,7]]}}}],["failure/etc",{"_index":2015,"t":{"347":{"position":[[251,14]]}}}],["fake",{"_index":1195,"t":{"166":{"position":[[207,4]]}}}],["fall",{"_index":1933,"t":{"294":{"position":[[2033,7]]}}}],["fallback",{"_index":1942,"t":{"309":{"position":[[52,8]]},"311":{"position":[[856,8]]}}}],["fals",{"_index":215,"t":{"13":{"position":[[4072,6],[4093,6],[4134,6],[4187,6]]},"94":{"position":[[772,5]]},"96":{"position":[[1438,5]]},"112":{"position":[[1199,5]]},"122":{"position":[[2609,6],[3230,5]]},"176":{"position":[[295,5],[561,5]]},"188":{"position":[[2688,5],[3234,5]]},"224":{"position":[[320,5]]},"238":{"position":[[211,6]]},"252":{"position":[[162,6]]},"263":{"position":[[402,5]]},"276":{"position":[[532,6]]},"282":{"position":[[456,6]]},"298":{"position":[[542,6],[560,6],[576,6],[599,6]]},"307":{"position":[[696,6],[714,6],[730,6],[753,6]]},"347":{"position":[[2149,6],[2251,6],[2617,5],[2910,5]]},"385":{"position":[[921,6]]},"391":{"position":[[536,6]]}}}],["famili",{"_index":1037,"t":{"110":{"position":[[350,6]]},"448":{"position":[[912,8],[1829,6]]}}}],["fan",{"_index":1753,"t":{"265":{"position":[[1335,3]]},"269":{"position":[[239,3]]}}}],["fanci",{"_index":2176,"t":{"380":{"position":[[27,6]]}}}],["faq",{"_index":105,"t":{"11":{"position":[[14,3]]},"222":{"position":[[364,3]]},"446":{"position":[[509,3]]},"464":{"position":[[59,3]]}}}],["fashion",{"_index":1536,"t":{"226":{"position":[[85,7]]}}}],["faster",{"_index":355,"t":{"23":{"position":[[131,7]]},"265":{"position":[[1680,6]]}}}],["favorit",{"_index":1754,"t":{"265":{"position":[[1400,8]]},"269":{"position":[[304,8]]}}}],["feat",{"_index":1676,"t":{"248":{"position":[[534,5],[622,6],[765,6]]},"250":{"position":[[832,5]]},"263":{"position":[[100,6]]},"282":{"position":[[3051,6],[4518,6],[4723,6],[5468,6],[5688,6]]},"294":{"position":[[668,6]]}}}],["featur",{"_index":860,"t":{"94":{"position":[[10,7]]}}}],["fedora",{"_index":2467,"t":{"422":{"position":[[99,7]]}}}],["feedback",{"_index":2434,"t":{"420":{"position":[[1339,8]]}}}],["fetch",{"_index":2017,"t":{"347":{"position":[[357,8]]}}}],["few",{"_index":1509,"t":{"222":{"position":[[4193,3]]},"368":{"position":[[3612,3]]},"414":{"position":[[40,3]]}}}],["ffff:127.0.0.1",{"_index":2372,"t":{"402":{"position":[[493,16],[704,16]]}}}],["ffff:192.168.0.100",{"_index":2387,"t":{"402":{"position":[[1028,20]]}}}],["field",{"_index":275,"t":{"17":{"position":[[316,6],[376,5]]},"206":{"position":[[1298,7],[1391,5],[2123,6],[2185,5]]},"226":{"position":[[519,5]]},"252":{"position":[[97,6]]},"276":{"position":[[330,6]]},"278":{"position":[[797,6],[814,5]]},"282":{"position":[[2353,6],[2421,6],[2743,6],[2867,6],[3376,7],[6183,7]]},"289":{"position":[[1050,5],[1134,6],[2444,5]]},"294":{"position":[[196,6],[298,6],[1169,5],[1258,5],[1534,6],[2006,5]]},"319":{"position":[[412,5],[491,5]]},"412":{"position":[[57,5]]},"414":{"position":[[51,6],[181,6],[360,6]]}}}],["field/env",{"_index":1331,"t":{"190":{"position":[[4189,9]]}}}],["file",{"_index":86,"t":{"9":{"position":[[883,4],[976,4]]},"13":{"position":[[107,5],[139,4],[300,4],[305,4],[434,5],[1161,5],[1413,4],[2304,4],[2381,4],[2822,4],[3634,5]]},"17":{"position":[[11,4],[109,6],[225,5],[347,6],[497,4]]},"23":{"position":[[468,4],[921,4],[1030,7],[1225,4],[1674,4],[1775,7],[2596,4],[2608,4],[2679,4],[2798,4],[2912,4],[2976,7]]},"27":{"position":[[334,4]]},"31":{"position":[[234,4]]},"37":{"position":[[4,4],[212,4]]},"43":{"position":[[4,4],[410,4]]},"51":{"position":[[4,4],[610,4]]},"55":{"position":[[4,4],[154,4]]},"59":{"position":[[4,4],[227,4]]},"66":{"position":[[423,4],[664,4]]},"73":{"position":[[561,4],[801,4]]},"79":{"position":[[80,4]]},"92":{"position":[[361,4]]},"94":{"position":[[644,4]]},"96":{"position":[[1310,4]]},"98":{"position":[[4,4]]},"104":{"position":[[4,4]]},"106":{"position":[[182,5]]},"108":{"position":[[784,4],[2113,4],[2710,4]]},"110":{"position":[[4,4],[89,4]]},"112":{"position":[[1073,4]]},"114":{"position":[[4,4]]},"118":{"position":[[47,4],[661,4]]},"120":{"position":[[4,4],[288,4]]},"122":{"position":[[1202,4]]},"126":{"position":[[45,4],[653,4]]},"128":{"position":[[4,4],[219,4]]},"130":{"position":[[391,4],[584,4],[631,4]]},"136":{"position":[[4,4],[292,4]]},"140":{"position":[[4,4],[201,4],[250,4]]},"144":{"position":[[4,4],[203,4],[253,4]]},"152":{"position":[[4,4],[371,4]]},"156":{"position":[[4,4],[211,4],[265,4]]},"160":{"position":[[4,4],[199,5],[248,4]]},"162":{"position":[[402,4],[849,4],[962,4]]},"168":{"position":[[4,4],[44,4]]},"172":{"position":[[4,4],[344,4]]},"176":{"position":[[4,4],[124,4]]},"180":{"position":[[4,4],[161,4]]},"186":{"position":[[193,4],[390,4],[439,4]]},"188":{"position":[[1550,4],[2236,4]]},"192":{"position":[[4,4],[210,4]]},"194":{"position":[[677,4]]},"196":{"position":[[4,4],[176,4]]},"204":{"position":[[1453,4],[1650,4],[1699,4]]},"206":{"position":[[883,4],[1009,4],[1562,4]]},"208":{"position":[[4,4],[125,4]]},"212":{"position":[[134,4]]},"216":{"position":[[4,4],[335,4]]},"220":{"position":[[4,4],[121,4]]},"224":{"position":[[4,4],[350,4]]},"236":{"position":[[63,4],[762,4],[1473,4],[1661,4],[2277,4]]},"254":{"position":[[252,4]]},"259":{"position":[[318,4]]},"261":{"position":[[217,4]]},"263":{"position":[[250,4]]},"300":{"position":[[552,4]]},"303":{"position":[[188,4]]},"305":{"position":[[501,4]]},"307":{"position":[[523,4]]},"309":{"position":[[598,4]]},"315":{"position":[[584,4]]},"347":{"position":[[394,6],[894,6],[3247,4]]},"366":{"position":[[39,4]]},"368":{"position":[[3300,4],[3564,4]]},"370":{"position":[[357,4]]},"374":{"position":[[718,4]]},"383":{"position":[[142,4]]},"398":{"position":[[1459,6]]},"409":{"position":[[95,4],[318,4]]},"420":{"position":[[2200,4],[2306,5],[2508,4]]},"424":{"position":[[21,4],[198,4]]},"426":{"position":[[9,4]]},"430":{"position":[[276,4]]},"434":{"position":[[3514,4]]},"436":{"position":[[1521,4]]},"440":{"position":[[738,4]]},"444":{"position":[[112,4]]},"446":{"position":[[172,5]]},"462":{"position":[[173,4]]}}}],["file/aio",{"_index":68,"t":{"9":{"position":[[449,8]]},"13":{"position":[[1891,8]]},"49":{"position":[[155,8]]},"90":{"position":[[88,8],[662,8]]},"122":{"position":[[1159,8]]},"130":{"position":[[319,8]]},"138":{"position":[[461,8]]},"142":{"position":[[347,8]]},"158":{"position":[[203,8]]},"186":{"position":[[136,8]]},"202":{"position":[[137,8]]},"305":{"position":[[48,8]]}}}],["filenam",{"_index":1386,"t":{"206":{"position":[[984,8],[1167,8],[1512,8],[1723,9],[1888,8]]}}}],["filenamepattern",{"_index":1396,"t":{"206":{"position":[[1667,19]]}}}],["fill",{"_index":1484,"t":{"222":{"position":[[1983,4]]},"265":{"position":[[161,4]]},"292":{"position":[[208,7]]},"436":{"position":[[84,4]]},"446":{"position":[[444,4]]}}}],["filter",{"_index":842,"t":{"88":{"position":[[120,8]]},"102":{"position":[[456,7]]},"204":{"position":[[59,6],[313,6]]},"287":{"position":[[178,6],[1196,6],[1748,6],[2010,9]]},"289":{"position":[[24,9],[254,10],[270,7],[306,7],[555,8],[587,8]]},"296":{"position":[[20,7],[132,6],[354,9],[512,9]]}}}],["final",{"_index":586,"t":{"53":{"position":[[494,8]]},"118":{"position":[[681,5]]},"126":{"position":[[673,5]]},"162":{"position":[[982,5]]},"190":{"position":[[2280,5]]},"244":{"position":[[164,5],[305,5]]},"278":{"position":[[984,8]]},"287":{"position":[[194,5]]},"289":{"position":[[1222,5],[2350,5],[2947,5],[3007,5]]},"347":{"position":[[915,8]]},"383":{"position":[[1624,8]]},"391":{"position":[[2063,8]]},"393":{"position":[[2821,8]]},"442":{"position":[[681,8]]}}}],["find",{"_index":594,"t":{"57":{"position":[[350,4]]},"90":{"position":[[538,4]]},"102":{"position":[[700,4]]},"154":{"position":[[450,4]]},"188":{"position":[[0,4]]},"206":{"position":[[1966,4]]},"228":{"position":[[184,5]]},"240":{"position":[[1354,4]]},"256":{"position":[[394,4]]},"265":{"position":[[1016,4]]},"267":{"position":[[413,4]]},"278":{"position":[[1285,4]]},"282":{"position":[[5215,5],[5549,5]]},"294":{"position":[[358,4]]},"309":{"position":[[822,4]]},"409":{"position":[[400,4]]},"434":{"position":[[2498,4]]},"462":{"position":[[386,4]]}}}],["fine",{"_index":2010,"t":{"345":{"position":[[400,4]]}}}],["finish",{"_index":1304,"t":{"190":{"position":[[2470,6]]},"222":{"position":[[4554,8]]},"240":{"position":[[304,8]]},"420":{"position":[[2925,6]]}}}],["firefox",{"_index":920,"t":{"102":{"position":[[295,7]]},"122":{"position":[[2432,12],[3045,9]]},"188":{"position":[[2486,9],[3032,9]]},"210":{"position":[[330,7],[422,7]]}}}],["firefox/139.0",{"_index":2379,"t":{"402":{"position":[[588,14],[799,14]]}}}],["firewal",{"_index":2395,"t":{"402":{"position":[[2152,8],[2233,8]]}}}],["first",{"_index":180,"t":{"13":{"position":[[2167,5],[3792,5]]},"206":{"position":[[1487,5]]},"212":{"position":[[577,5]]},"222":{"position":[[1682,5],[1704,5],[2432,5]]},"228":{"position":[[0,6]]},"236":{"position":[[970,5]]},"282":{"position":[[5158,5],[5560,5]]},"289":{"position":[[1688,5]]},"311":{"position":[[1122,5]]},"332":{"position":[[139,5]]},"347":{"position":[[151,5]]},"362":{"position":[[161,6]]},"368":{"position":[[1445,5]]},"385":{"position":[[0,5]]},"391":{"position":[[88,5]]},"402":{"position":[[862,5],[1437,6]]},"406":{"position":[[192,6]]},"412":{"position":[[257,5]]},"462":{"position":[[212,5]]}}}],["firstgotifyserv",{"_index":240,"t":{"13":{"position":[[4826,20]]},"31":{"position":[[426,20]]}}}],["fit",{"_index":2110,"t":{"368":{"position":[[313,3]]}}}],["fix",{"_index":1545,"t":{"226":{"position":[[816,3]]},"402":{"position":[[1291,3]]},"409":{"position":[[435,3]]},"416":{"position":[[316,3],[433,3]]}}}],["flatpak",{"_index":2057,"t":{"355":{"position":[[8,7],[24,7],[40,7]]},"360":{"position":[[97,7],[215,7],[424,7]]},"362":{"position":[[87,7],[117,7],[297,7],[475,7],[623,8],[692,7],[736,7],[781,7]]},"364":{"position":[[98,7]]},"376":{"position":[[90,7],[142,7]]}}}],["flatpak/build",{"_index":2096,"t":{"362":{"position":[[936,13]]}}}],["flatpak/flathub",{"_index":2172,"t":{"376":{"position":[[12,15]]}}}],["flatpak/nodej",{"_index":1005,"t":{"108":{"position":[[1431,14]]}}}],["flatpak/repo",{"_index":2093,"t":{"362":{"position":[[835,12]]}}}],["flatpak/setup.sh",{"_index":2067,"t":{"360":{"position":[[181,17]]}}}],["flatpak/st",{"_index":2095,"t":{"362":{"position":[[891,13]]}}}],["flow",{"_index":548,"t":{"43":{"position":[[388,4]]},"51":{"position":[[474,4]]},"222":{"position":[[4334,5],[4546,4],[5343,4]]},"240":{"position":[[624,4],[786,4],[882,4],[1163,4]]},"282":{"position":[[7114,4]]},"309":{"position":[[117,4]]}}}],["fm.teal",{"_index":683,"t":{"68":{"position":[[942,10]]}}}],["fm.teal.alpha.feed.play",{"_index":1363,"t":{"204":{"position":[[690,23]]}}}],["folder",{"_index":1302,"t":{"190":{"position":[[2266,6]]},"222":{"position":[[4732,7]]},"420":{"position":[[2526,6]]},"432":{"position":[[13,6]]}}}],["follow",{"_index":869,"t":{"94":{"position":[[603,9]]},"96":{"position":[[1269,9]]},"112":{"position":[[1032,9]]},"170":{"position":[[1683,9]]},"174":{"position":[[90,9]]},"184":{"position":[[0,6]]},"190":{"position":[[1235,9]]},"200":{"position":[[0,6]]},"222":{"position":[[1297,6],[4318,6]]},"362":{"position":[[27,6]]},"406":{"position":[[1151,6]]},"420":{"position":[[1375,9]]},"434":{"position":[[136,6],[2349,6],[3352,9]]},"436":{"position":[[832,6]]},"440":{"position":[[49,6]]},"442":{"position":[[943,9]]}}}],["foo",{"_index":1670,"t":{"248":{"position":[[311,3]]},"250":{"position":[[1445,5],[1564,5],[1625,5]]}}}],["foo.com",{"_index":1958,"t":{"317":{"position":[[817,10]]}}}],["foobar",{"_index":1720,"t":{"263":{"position":[[107,7]]}}}],["footerm",{"_index":1960,"t":{"319":{"position":[[276,9],[338,10]]}}}],["forc",{"_index":1020,"t":{"108":{"position":[[2475,7],[2509,6]]},"122":{"position":[[1063,5]]},"282":{"position":[[465,5]]},"362":{"position":[[988,5]]},"416":{"position":[[401,5]]}}}],["forcemediarecognitionon",{"_index":1024,"t":{"108":{"position":[[2677,25],[2988,26]]}}}],["forcesearch",{"_index":1805,"t":{"282":{"position":[[435,11],[750,14]]}}}],["fork",{"_index":393,"t":{"23":{"position":[[3047,4]]}}}],["form",{"_index":405,"t":{"23":{"position":[[3526,5]]},"39":{"position":[[373,4]]},"118":{"position":[[110,6]]},"126":{"position":[[108,6]]},"162":{"position":[[465,6]]}}}],["format",{"_index":1049,"t":{"112":{"position":[[99,6],[474,6]]},"296":{"position":[[91,8]]},"311":{"position":[[73,11]]},"349":{"position":[[165,6]]}}}],["formatplayobj(obj",{"_index":2268,"t":{"389":{"position":[[607,18]]}}}],["formatplayobjectopt",{"_index":2263,"t":{"389":{"position":[[215,24],[640,23]]}}}],["forward",{"_index":1971,"t":{"332":{"position":[[256,7],[532,7]]},"402":{"position":[[2170,11],[2338,10]]},"448":{"position":[[2222,7]]},"450":{"position":[[261,7]]}}}],["found",{"_index":185,"t":{"13":{"position":[[2351,5],[3647,5]]},"17":{"position":[[1445,6]]},"25":{"position":[[80,5]]},"94":{"position":[[462,5]]},"96":{"position":[[1147,5]]},"112":{"position":[[910,5],[1612,5],[2008,5]]},"118":{"position":[[446,5]]},"122":{"position":[[780,5]]},"126":{"position":[[440,5]]},"162":{"position":[[815,5]]},"178":{"position":[[157,5]]},"188":{"position":[[1421,5]]},"226":{"position":[[767,5]]},"236":{"position":[[976,5],[1399,5]]},"250":{"position":[[849,5]]},"274":{"position":[[22,5]]},"280":{"position":[[20,5]]},"282":{"position":[[4768,5],[5164,5],[6217,6]]},"289":{"position":[[1631,5]]},"332":{"position":[[152,6]]},"368":{"position":[[272,5],[512,5]]},"370":{"position":[[1093,5]]},"387":{"position":[[94,6],[181,6]]},"432":{"position":[[291,5]]},"436":{"position":[[739,5]]},"438":{"position":[[472,5]]},"462":{"position":[[90,5]]}}}],["foxx",{"_index":712,"t":{"75":{"position":[[50,7]]},"77":{"position":[[2741,7]]}}}],["foxxairson",{"_index":769,"t":{"77":{"position":[[2680,15]]}}}],["foxxapikey",{"_index":782,"t":{"77":{"position":[[3276,12]]},"79":{"position":[[1670,12]]}}}],["foxxmaloja",{"_index":738,"t":{"77":{"position":[[975,15],[2707,15],[2876,15],[3111,15],[3204,13]]},"79":{"position":[[139,15],[1268,15],[1511,15],[1598,13]]}}}],["foxxmd",{"_index":602,"t":{"59":{"position":[[410,9],[721,9]]},"77":{"position":[[2562,9]]},"79":{"position":[[1117,9]]},"122":{"position":[[2255,9],[2893,9],[2965,9]]},"156":{"position":[[448,9],[759,9]]},"188":{"position":[[1112,7],[1134,10],[1287,8],[2406,9],[2952,9]]},"190":{"position":[[3497,7]]}}}],["foxxmd\",\"someotherus",{"_index":1111,"t":{"122":{"position":[[2357,27]]}}}],["foxxmd,plex_local_user,someus",{"_index":1264,"t":{"188":{"position":[[1197,31]]}}}],["foxxmd/multi",{"_index":142,"t":{"13":{"position":[[827,12]]},"108":{"position":[[1408,12]]},"256":{"position":[[640,12]]},"278":{"position":[[1537,12]]},"368":{"position":[[390,12],[1872,12],[2323,12],[2851,12],[3681,12]]},"370":{"position":[[670,12],[825,12],[971,12]]},"432":{"position":[[169,12]]},"471":{"position":[[562,12]]},"473":{"position":[[40,12]]}}}],["foxxpassword",{"_index":770,"t":{"77":{"position":[[2761,15]]}}}],["foxxspot",{"_index":737,"t":{"77":{"position":[[952,11]]},"79":{"position":[[116,11]]}}}],["foxxspotifyappid",{"_index":739,"t":{"77":{"position":[[1013,19],[1269,19]]},"79":{"position":[[177,19],[312,19]]}}}],["foxxspotifyappsecret",{"_index":740,"t":{"77":{"position":[[1049,23],[1396,23]]},"79":{"position":[[213,22],[348,22]]}}}],["foxxyoutub",{"_index":773,"t":{"77":{"position":[[2850,14]]},"79":{"position":[[1242,14]]}}}],["fqn",{"_index":1411,"t":{"210":{"position":[[345,4]]}}}],["frank",{"_index":1696,"t":{"250":{"position":[[1481,6],[1580,5],[1673,5]]}}}],["fred",{"_index":713,"t":{"75":{"position":[[58,5],[350,4],[477,5],[483,4],[816,4]]}}}],["fred'",{"_index":721,"t":{"75":{"position":[[558,6]]}}}],["fredapikey",{"_index":784,"t":{"77":{"position":[[3394,12]]},"79":{"position":[[1770,12]]}}}],["fredjelli",{"_index":766,"t":{"77":{"position":[[2412,12]]},"79":{"position":[[1054,12]]}}}],["fredmaloja",{"_index":747,"t":{"77":{"position":[[1477,15],[1733,15],[3322,13]]},"79":{"position":[[409,15],[580,15],[1698,13]]}}}],["fredplex",{"_index":755,"t":{"77":{"position":[[1710,11]]},"79":{"position":[[557,11]]}}}],["fredspot",{"_index":746,"t":{"77":{"position":[[1454,11]]},"79":{"position":[[386,11]]}}}],["fredsrefreshtoken",{"_index":751,"t":{"77":{"position":[[1548,20]]},"79":{"position":[[480,20]]}}}],["fredstoken",{"_index":749,"t":{"77":{"position":[[1518,13]]},"79":{"position":[[450,13]]}}}],["fredus",{"_index":759,"t":{"77":{"position":[[1836,12],[2632,12]]},"79":{"position":[[683,12],[1187,12]]}}}],["free",{"_index":1789,"t":{"278":{"position":[[754,4]]},"282":{"position":[[5913,4],[6046,4],[6366,4],[6928,4]]}}}],["freetext",{"_index":1780,"t":{"276":{"position":[[1188,12]]},"278":{"position":[[771,10]]},"282":{"position":[[5923,10],[6986,13]]},"311":{"position":[[934,11]]}}}],["friend",{"_index":2532,"t":{"448":{"position":[[900,7],[1817,7]]}}}],["friendli",{"_index":2544,"t":{"452":{"position":[[273,8]]},"454":{"position":[[194,8]]}}}],["frontend",{"_index":1981,"t":{"337":{"position":[[80,9],[245,9],[259,8]]}}}],["ft",{"_index":1675,"t":{"248":{"position":[[529,4]]},"250":{"position":[[828,3],[1476,4]]}}}],["full",{"_index":663,"t":{"66":{"position":[[52,4],[525,4]]},"73":{"position":[[126,4],[666,4]]},"108":{"position":[[527,4]]},"256":{"position":[[515,4]]},"278":{"position":[[1412,4]]},"347":{"position":[[1087,4]]},"442":{"position":[[1915,4]]}}}],["function",{"_index":52,"t":{"9":{"position":[[131,14]]},"100":{"position":[[176,14]]},"148":{"position":[[916,14]]},"317":{"position":[[940,8]]},"347":{"position":[[411,8]]},"383":{"position":[[1990,8]]},"389":{"position":[[28,8]]},"393":{"position":[[700,9]]},"398":{"position":[[1736,8],[1987,13],[2054,9],[2156,13]]},"434":{"position":[[1462,13]]},"471":{"position":[[200,13]]}}}],["funkwhal",{"_index":168,"t":{"13":{"position":[[1574,12],[3257,12]]}}}],["further",{"_index":2430,"t":{"420":{"position":[[1127,8]]}}}],["futur",{"_index":1471,"t":{"222":{"position":[[1290,6]]}}}],["fuzzydiscoveryignor",{"_index":950,"t":{"106":{"position":[[222,23],[373,23]]}}}],["g",{"_index":2136,"t":{"368":{"position":[[3502,1]]}}}],["garbag",{"_index":1541,"t":{"226":{"position":[[410,7]]}}}],["gather",{"_index":418,"t":{"25":{"position":[[337,9]]}}}],["gaurante",{"_index":1477,"t":{"222":{"position":[[1599,9]]}}}],["gave",{"_index":849,"t":{"90":{"position":[[638,4]]}}}],["gb",{"_index":1866,"t":{"287":{"position":[[1017,3]]}}}],["gecko/20100101",{"_index":2378,"t":{"402":{"position":[[573,14],[784,14]]}}}],["gener",{"_index":118,"t":{"13":{"position":[[249,9],[3989,9]]},"21":{"position":[[32,8]]},"43":{"position":[[360,9]]},"51":{"position":[[446,9]]},"53":{"position":[[474,9]]},"68":{"position":[[1672,9]]},"86":{"position":[[488,9]]},"90":{"position":[[483,9]]},"108":{"position":[[2022,9]]},"130":{"position":[[226,7]]},"148":{"position":[[218,8]]},"158":{"position":[[110,7]]},"186":{"position":[[43,7]]},"202":{"position":[[43,7]]},"214":{"position":[[243,7]]},"222":{"position":[[2412,8]]},"238":{"position":[[815,12]]},"278":{"position":[[4,7]]},"282":{"position":[[6611,10]]},"292":{"position":[[0,10]]},"294":{"position":[[937,8]]},"296":{"position":[[411,10]]},"347":{"position":[[3061,8]]},"355":{"position":[[53,10]]},"360":{"position":[[53,10],[341,9]]},"362":{"position":[[56,8],[130,9],[143,8],[310,9],[347,9],[406,9],[437,8],[488,9],[533,9],[592,9]]},"380":{"position":[[355,9]]},"383":{"position":[[597,9]]},"442":{"position":[[661,9]]}}}],["get",{"_index":1546,"t":{"226":{"position":[[839,4]]},"396":{"position":[[1102,7]]},"406":{"position":[[1023,7]]}}}],["get(`${this.baseurl}/now",{"_index":2325,"t":{"393":{"position":[[1959,25]]}}}],["get(`${this.baseurl}/rec",{"_index":2303,"t":{"391":{"position":[[2389,30]]},"396":{"position":[[775,30]]}}}],["getbackloggedplay",{"_index":2337,"t":{"396":{"position":[[198,18],[654,18]]}}}],["getnowplay",{"_index":1336,"t":{"194":{"position":[[94,13]]}}}],["getrecentlyplay",{"_index":2311,"t":{"393":{"position":[[710,18],[1045,18]]},"398":{"position":[[1690,17],[2196,18]]}}}],["getrecentlyplayed(opt",{"_index":2321,"t":{"393":{"position":[[1768,26]]}}}],["ghcr.io/foxxmd/multi",{"_index":2108,"t":{"368":{"position":[[195,20]]}}}],["gid",{"_index":2133,"t":{"368":{"position":[[3417,3],[3514,3]]}}}],["git",{"_index":271,"t":{"17":{"position":[[264,4]]},"339":{"position":[[255,3]]},"374":{"position":[[76,3]]},"471":{"position":[[501,3]]},"475":{"position":[[63,3],[111,3]]}}}],["github",{"_index":576,"t":{"53":{"position":[[176,6]]},"368":{"position":[[107,6]]},"442":{"position":[[360,6]]},"471":{"position":[[365,6]]}}}],["give",{"_index":31,"t":{"7":{"position":[[168,5]]},"68":{"position":[[1515,5]]},"222":{"position":[[1215,5]]},"250":{"position":[[351,4]]},"289":{"position":[[756,4]]}}}],["given",{"_index":281,"t":{"17":{"position":[[478,5]]},"90":{"position":[[475,5]]},"118":{"position":[[643,5]]},"126":{"position":[[635,5]]},"162":{"position":[[944,5]]},"289":{"position":[[450,5]]},"311":{"position":[[261,5]]},"347":{"position":[[3119,5],[3367,5]]}}}],["global",{"_index":61,"t":{"9":{"position":[[333,8]]},"13":{"position":[[3578,6]]},"41":{"position":[[583,6]]},"47":{"position":[[577,6]]},"92":{"position":[[637,8]]},"236":{"position":[[14,8]]}}}],["go",{"_index":926,"t":{"102":{"position":[[364,2],[620,2]]},"190":{"position":[[2984,2]]},"222":{"position":[[1854,2]]},"383":{"position":[[450,2]]},"432":{"position":[[448,2]]}}}],["goal",{"_index":638,"t":{"61":{"position":[[1370,4]]}}}],["goc",{"_index":1534,"t":{"224":{"position":[[580,9],[937,9]]}}}],["gocspx",{"_index":1495,"t":{"222":{"position":[[2708,7],[3937,7]]}}}],["good",{"_index":1880,"t":{"289":{"position":[[234,4],[2706,4]]},"292":{"position":[[112,4],[177,4]]},"398":{"position":[[3821,4],[3868,4]]}}}],["goodmus",{"_index":1116,"t":{"122":{"position":[[2496,14],[3113,11]]},"188":{"position":[[2554,11],[3100,11]]}}}],["goodterm",{"_index":1954,"t":{"317":{"position":[[535,10],[573,10],[635,8]]}}}],["googl",{"_index":801,"t":{"83":{"position":[[159,6]]},"108":{"position":[[155,6],[647,6],[690,6]]},"122":{"position":[[2461,8],[3076,7]]},"188":{"position":[[2517,7],[3063,7]]},"222":{"position":[[83,7],[156,6],[1778,6],[3167,6],[3779,6],[4149,6],[4819,6]]},"414":{"position":[[4,6],[456,6]]},"448":{"position":[[152,6]]}}}],["gorillaz",{"_index":2451,"t":{"420":{"position":[[2068,8]]}}}],["gotifi",{"_index":241,"t":{"13":{"position":[[4855,9]]},"31":{"position":[[455,9],[560,9],[641,7],[831,9]]},"448":{"position":[[739,8]]}}}],["gotify://192.168.0.101:8070/mytoken",{"_index":461,"t":{"31":{"position":[[1660,40]]}}}],["gotifyconfig",{"_index":446,"t":{"31":{"position":[[680,12]]}}}],["grab",{"_index":2543,"t":{"450":{"position":[[161,5]]}}}],["grace",{"_index":2533,"t":{"448":{"position":[[986,8]]}}}],["granular",{"_index":2505,"t":{"434":{"position":[[3029,8]]}}}],["greater",{"_index":1090,"t":{"122":{"position":[[31,7]]}}}],["green",{"_index":2452,"t":{"420":{"position":[[2081,5]]}}}],["group",{"_index":1393,"t":{"206":{"position":[[1352,6]]},"287":{"position":[[730,5],[830,5]]},"332":{"position":[[336,5]]}}}],["guarante",{"_index":635,"t":{"61":{"position":[[1268,9],[1295,9]]},"398":{"position":[[3919,9]]}}}],["gui",{"_index":1070,"t":{"116":{"position":[[130,4]]},"124":{"position":[[124,4]]}}}],["guid",{"_index":2142,"t":{"370":{"position":[[24,5],[42,6]]},"378":{"position":[[42,5]]},"430":{"position":[[5,5],[111,5]]},"448":{"position":[[1251,5]]},"456":{"position":[[20,5]]},"466":{"position":[[38,6]]}}}],["guidanc",{"_index":853,"t":{"92":{"position":[[293,9]]},"282":{"position":[[1389,8]]}}}],["guy",{"_index":1671,"t":{"248":{"position":[[327,4]]},"332":{"position":[[202,3],[485,3],[589,3],[652,3]]}}}],["gym",{"_index":1624,"t":{"242":{"position":[[516,5],[569,4],[694,5],[747,4],[1229,3],[1346,5],[1475,4],[1641,5]]},"322":{"position":[[112,4],[333,5]]}}}],["handl",{"_index":662,"t":{"66":{"position":[[4,6],[65,7],[302,6],[405,6],[538,7],[815,9],[1081,9]]},"73":{"position":[[139,7],[172,7],[397,6],[543,6],[679,6]]},"186":{"position":[[590,9],[856,9]]},"337":{"position":[[102,7]]},"398":{"position":[[85,6],[161,7],[319,6],[1772,9]]},"448":{"position":[[1022,8],[1072,8],[1621,8]]}}}],["handle(someplay",{"_index":2361,"t":{"398":{"position":[[2861,16],[3539,16]]}}}],["hang",{"_index":725,"t":{"75":{"position":[[731,7]]}}}],["happen",{"_index":2464,"t":{"420":{"position":[[3151,8]]}}}],["hard",{"_index":2419,"t":{"420":{"position":[[280,4]]}}}],["hardend",{"_index":2137,"t":{"368":{"position":[[3539,9]]}}}],["hasn't",{"_index":44,"t":{"7":{"position":[[359,6]]}}}],["have",{"_index":82,"t":{"9":{"position":[[716,6]]},"190":{"position":[[3713,6]]},"398":{"position":[[1224,6],[2654,6]]},"420":{"position":[[468,6]]},"464":{"position":[[0,6]]}}}],["header",{"_index":1457,"t":{"222":{"position":[[765,7]]},"380":{"position":[[378,6]]}}}],["headless",{"_index":1171,"t":{"162":{"position":[[12,8]]}}}],["health",{"_index":464,"t":{"33":{"position":[[31,6],[220,9],[589,7],[695,7]]},"380":{"position":[[224,6]]},"391":{"position":[[1842,7]]}}}],["health?name=mymaloja",{"_index":479,"t":{"33":{"position":[[426,21]]}}}],["health?type=spotifi",{"_index":478,"t":{"33":{"position":[[402,20]]}}}],["healthcheck",{"_index":434,"t":{"29":{"position":[[52,11]]},"448":{"position":[[766,11]]}}}],["heavi",{"_index":754,"t":{"77":{"position":[[1663,5]]}}}],["help",{"_index":972,"t":{"108":{"position":[[365,4],[3360,4]]},"226":{"position":[[861,4],[916,4]]},"300":{"position":[[184,4]]},"406":{"position":[[964,4]]},"420":{"position":[[1284,4]]}}}],["here",{"_index":212,"t":{"13":{"position":[[4014,4]]},"39":{"position":[[331,5]]},"108":{"position":[[1670,6]]},"222":{"position":[[1761,7]]},"234":{"position":[[707,7]]},"282":{"position":[[1625,4]]},"368":{"position":[[518,4]]},"370":{"position":[[1099,4]]},"383":{"position":[[453,4]]},"387":{"position":[[605,4]]},"432":{"position":[[297,4],[451,5]]},"436":{"position":[[745,5]]},"438":{"position":[[478,5]]},"442":{"position":[[157,5]]}}}],["heureist",{"_index":2432,"t":{"420":{"position":[[1306,10]]}}}],["heurist",{"_index":1586,"t":{"234":{"position":[[274,10]]},"248":{"position":[[31,10],[240,11]]}}}],["hidden",{"_index":928,"t":{"102":{"position":[[430,7]]}}}],["high",{"_index":872,"t":{"96":{"position":[[255,4]]},"265":{"position":[[98,4]]},"282":{"position":[[6640,4]]}}}],["higher",{"_index":1846,"t":{"285":{"position":[[259,6]]},"289":{"position":[[2258,7]]},"296":{"position":[[253,6]]},"339":{"position":[[38,6]]}}}],["highli",{"_index":1458,"t":{"222":{"position":[[819,6]]}}}],["highlight",{"_index":1631,"t":{"244":{"position":[[598,11]]},"436":{"position":[[1575,11],[1638,11]]},"440":{"position":[[792,11],[855,11]]}}}],["hint",{"_index":321,"t":{"21":{"position":[[131,6]]},"385":{"position":[[508,5]]}}}],["histor",{"_index":3,"t":{"2":{"position":[[43,10]]},"454":{"position":[[43,10]]}}}],["histori",{"_index":800,"t":{"83":{"position":[[143,7],[346,7],[377,7],[409,7],[452,7],[488,7],[536,7],[566,7],[741,7],[853,7],[890,7],[996,7]]},"86":{"position":[[663,7],[1179,9],[1267,7]]},"102":{"position":[[189,8]]},"106":{"position":[[111,8]]},"130":{"position":[[48,7]]},"138":{"position":[[43,7]]},"142":{"position":[[44,7]]},"154":{"position":[[55,7]]},"190":{"position":[[525,7]]},"222":{"position":[[287,7]]},"224":{"position":[[334,7]]},"393":{"position":[[121,8],[189,8]]},"398":{"position":[[368,7],[518,7]]},"420":{"position":[[19,7],[155,9],[1149,8],[1192,8],[1696,7]]}}}],["hit",{"_index":932,"t":{"102":{"position":[[579,3]]},"222":{"position":[[4384,3]]}}}],["home",{"_index":1036,"t":{"110":{"position":[[344,5]]},"122":{"position":[[2470,7],[3084,5]]},"188":{"position":[[2525,5],[3071,5]]},"424":{"position":[[57,4]]}}}],["home/myuser/ms:/config",{"_index":2151,"t":{"370":{"position":[[646,23]]}}}],["home/youruser/multi",{"_index":2091,"t":{"362":{"position":[[661,20],[905,20]]}}}],["hook",{"_index":1561,"t":{"230":{"position":[[197,4],[299,5]]},"232":{"position":[[726,6],[881,4],[1038,5],[1058,4],[1075,4]]},"234":{"position":[[5,4],[472,4],[530,5]]},"236":{"position":[[216,5],[305,5],[624,4],[703,4],[1953,5],[2139,4],[2218,4]]},"242":{"position":[[16,5]]},"256":{"position":[[233,4]]},"259":{"position":[[180,4],[259,4]]},"276":{"position":[[59,5],[937,5]]},"278":{"position":[[1124,4]]}}}],["host",{"_index":427,"t":{"27":{"position":[[121,7]]},"31":{"position":[[1615,7]]},"51":{"position":[[558,4]]},"108":{"position":[[869,4],[1015,4]]},"170":{"position":[[364,4],[567,4],[869,4]]},"190":{"position":[[3522,5]]},"206":{"position":[[802,4],[964,4]]},"368":{"position":[[743,5],[842,5],[1463,4],[1633,4],[2691,4],[3110,5],[3178,4],[3279,4]]},"370":{"position":[[249,4]]},"380":{"position":[[43,6],[719,6]]},"383":{"position":[[766,4],[801,6]]},"402":{"position":[[1602,4],[1980,4]]},"430":{"position":[[171,4]]},"444":{"position":[[65,4]]},"448":{"position":[[2394,6]]}}}],["host'",{"_index":1205,"t":{"170":{"position":[[443,6],[1496,6]]}}}],["host/ip",{"_index":408,"t":{"23":{"position":[[3703,7]]}}}],["host:port",{"_index":503,"t":{"35":{"position":[[923,10]]}}}],["hostnam",{"_index":1177,"t":{"162":{"position":[[776,8],[874,8]]}}}],["http",{"_index":326,"t":{"21":{"position":[[244,4],[357,5]]},"77":{"position":[[230,4],[605,4]]},"124":{"position":[[192,4]]},"148":{"position":[[819,11]]},"162":{"position":[[286,4],[867,6]]},"190":{"position":[[1114,8],[1343,5],[2624,5],[2674,4],[2779,5],[3405,5]]},"206":{"position":[[39,6],[70,4],[305,4],[384,4],[503,4],[797,4],[836,4],[958,5],[973,4]]},"210":{"position":[[440,5]]},"434":{"position":[[715,5]]}}}],["http://127.0.0.1:5079/callback",{"_index":1312,"t":{"190":{"position":[[2870,30]]}}}],["http://127.0.0.1:5079/callback?code=xxxxxx",{"_index":1314,"t":{"190":{"position":[[3095,45]]}}}],["http://127.0.0.1:9078/callback",{"_index":1301,"t":{"190":{"position":[[2069,30]]}}}],["http://192.168.0.100:4110",{"_index":499,"t":{"35":{"position":[[633,25],[682,25],[1042,25],[1068,25],[1285,25]]},"37":{"position":[[388,27],[679,27]]},"130":{"position":[[807,27],[1098,27]]},"442":{"position":[[1800,25],[1854,25]]}}}],["http://192.168.0.100:4110/apis/listenbrainz",{"_index":509,"t":{"35":{"position":[[1241,43]]}}}],["http://192.168.0.100:4110/apis/listenbrainz/1",{"_index":506,"t":{"35":{"position":[[1094,45],[1311,45]]}}}],["http://192.168.0.100:42010/admin_apikey",{"_index":2516,"t":{"442":{"position":[[584,41]]}}}],["http://192.168.0.100:6969",{"_index":2188,"t":{"380":{"position":[[729,25]]},"383":{"position":[[821,25]]}}}],["http://192.168.0.100:6969/api",{"_index":2189,"t":{"380":{"position":[[782,29]]}}}],["http://192.168.0.100:80/koito",{"_index":510,"t":{"35":{"position":[[1357,29],[1387,29]]}}}],["http://192.168.0.100:80/koito/apis/listenbrainz/1",{"_index":511,"t":{"35":{"position":[[1417,49]]}}}],["http://192.168.0.100:8070",{"_index":442,"t":{"31":{"position":[[472,28],[887,28]]}}}],["http://192.168.0.100:8080",{"_index":460,"t":{"31":{"position":[[1623,28]]}}}],["http://192.168.0.100:9078",{"_index":537,"t":{"41":{"position":[[310,25]]},"47":{"position":[[310,25]]},"434":{"position":[[1129,25],[4017,25]]},"444":{"position":[[381,25]]}}}],["http://192.168.0.100:9078/lastfm/callback",{"_index":539,"t":{"41":{"position":[[452,41]]},"434":{"position":[[3380,41],[3905,43]]},"436":{"position":[[1852,43]]},"440":{"position":[[1069,43]]},"442":{"position":[[971,41]]}}}],["http://192.168.0.100:9078/librefm/callback",{"_index":555,"t":{"47":{"position":[[445,42]]}}}],["http://192.168.0.100:9991",{"_index":452,"t":{"31":{"position":[[1236,28]]}}}],["http://192.168.0.101",{"_index":1440,"t":{"218":{"position":[[556,20]]}}}],["http://192.168.0.101/my/subfold",{"_index":337,"t":{"21":{"position":[[743,33]]}}}],["http://192.168.0.101/yamahaextendedcontrol/v1",{"_index":1441,"t":{"218":{"position":[[577,45]]}}}],["http://192.168.0.101:3456/jsonprc",{"_index":1126,"t":{"126":{"position":[[864,33]]}}}],["http://192.168.0.101:3456/mcws/v1",{"_index":1080,"t":{"118":{"position":[[882,34]]}}}],["http://192.168.0.101:4000/my/subfolder/lastfm/callback",{"_index":344,"t":{"21":{"position":[[1010,54]]}}}],["http://192.168.0.101:80/lastfm/callback",{"_index":340,"t":{"21":{"position":[[873,39]]}}}],["http://192.168.0.101:8096",{"_index":2171,"t":{"374":{"position":[[1069,28]]}}}],["http://192.168.0.101:9078",{"_index":2119,"t":{"368":{"position":[[1088,27]]}}}],["http://192.168.0.101:9078/callback?code=xxxxxx",{"_index":1318,"t":{"190":{"position":[[3255,50]]}}}],["http://192.168.0.101:9078/lastfm/callback",{"_index":334,"t":{"21":{"position":[[634,41]]}}}],["http://192.168.0.101:9078/my/subfolder/lastfm/callback",{"_index":338,"t":{"21":{"position":[[777,54]]}}}],["http://192.168.0.120:32400",{"_index":1275,"t":{"188":{"position":[[2360,29],[2906,29]]}}}],["http://192.168.0.140:9078",{"_index":2399,"t":{"404":{"position":[[510,26]]}}}],["http://192.168.0.140:9078/api/webscrobbl",{"_index":2394,"t":{"402":{"position":[[2103,42]]}}}],["http://192.168.0.220:9078/lastfm/callback",{"_index":2400,"t":{"404":{"position":[[639,41]]}}}],["http://jriver.mydomain.com:52199/mcws/v1",{"_index":1078,"t":{"118":{"position":[[821,41]]}}}],["http://kodi.mydomain.com:8080/jsonrpc",{"_index":1125,"t":{"126":{"position":[[807,37]]}}}],["http://localhost",{"_index":2398,"t":{"404":{"position":[[398,21]]}}}],["http://localhost:32400",{"_index":1267,"t":{"188":{"position":[[1671,22]]}}}],["http://localhost:4040/airson",{"_index":1346,"t":{"196":{"position":[[273,33],[565,33]]}}}],["http://localhost:42010",{"_index":236,"t":{"13":{"position":[[4745,25]]},"55":{"position":[[279,25],[540,25]]},"160":{"position":[[373,25],[634,25]]},"374":{"position":[[1192,25]]}}}],["http://localhost:52199/mcws/v1",{"_index":1074,"t":{"118":{"position":[[187,31],[769,31]]},"120":{"position":[[96,31]]}}}],["http://localhost:8070",{"_index":242,"t":{"13":{"position":[[4872,24]]}}}],["http://localhost:8080",{"_index":1379,"t":{"206":{"position":[[549,21]]}}}],["http://localhost:8080/jsonrpc",{"_index":1122,"t":{"126":{"position":[[185,29],[759,29]]},"128":{"position":[[94,29],[308,32],[565,32]]}}}],["http://localhost:8096",{"_index":767,"t":{"77":{"position":[[2529,24]]},"79":{"position":[[1084,24]]},"122":{"position":[[1315,21],[2222,24],[2860,24]]}}}],["http://localhost:9078",{"_index":322,"t":{"21":{"position":[[149,21]]},"222":{"position":[[3129,22]]},"462":{"position":[[99,21]]}}}],["http://localhost:9078/2.0",{"_index":1139,"t":{"134":{"position":[[97,26]]}}}],["http://localhost:9078/api/lastfm/myslug",{"_index":1140,"t":{"134":{"position":[[327,39]]}}}],["http://localhost:9078/api/webscrobbl",{"_index":1409,"t":{"210":{"position":[[167,38]]},"212":{"position":[[518,38]]},"402":{"position":[[2061,38]]}}}],["http://localhost:9078/api/webscrobbler/usera",{"_index":1426,"t":{"212":{"position":[[387,44]]}}}],["http://localhost:9078/api/webscrobbler/userb",{"_index":1427,"t":{"212":{"position":[[469,44]]}}}],["http://localhost:9078/api/ytmusic/callback?name=myytm",{"_index":1499,"t":{"222":{"position":[[2955,53]]}}}],["http://localhost:9078/callback",{"_index":199,"t":{"13":{"position":[[2725,33],[4619,32]]},"192":{"position":[[154,30],[428,33],[780,33]]}}}],["http://localhost:9078/lastfm/callback",{"_index":286,"t":{"17":{"position":[[656,39],[1130,39]]},"43":{"position":[[208,37],[634,39],[984,39]]},"77":{"position":[[3642,39]]},"79":{"position":[[2008,39]]},"140":{"position":[[474,39],[824,39]]},"404":{"position":[[598,37]]}}}],["http://localhost:9078/librefm/callback",{"_index":563,"t":{"51":{"position":[[291,38],[788,40],[1092,40]]},"144":{"position":[[431,40],[735,40]]}}}],["http://localhost:9991",{"_index":251,"t":{"13":{"position":[[5040,24]]}}}],["http://maloja:port",{"_index":2123,"t":{"368":{"position":[[1404,19]]}}}],["http://my.custom.domain/api/ytmusic/callback?name=myytm",{"_index":1508,"t":{"222":{"position":[[3978,57]]}}}],["http://my.domain.loc",{"_index":335,"t":{"21":{"position":[[676,22]]}}}],["http://my.domain.local:9000/lastfm/callback",{"_index":342,"t":{"21":{"position":[[934,43]]}}}],["http://my.domain.local:9078/lastfm/callback",{"_index":336,"t":{"21":{"position":[[699,43]]}}}],["http://mydomain.com/reverseproxy/cast",{"_index":1442,"t":{"218":{"position":[[623,37],[661,37]]}}}],["http://mydomain.com:80/kodireverse/jsonrpc",{"_index":1128,"t":{"126":{"position":[[934,42]]}}}],["http://myicecast.com/radio",{"_index":1063,"t":{"112":{"position":[[1868,29]]},"114":{"position":[[180,28],[377,28]]}}}],["http://mymalojaserverip/admin_apikey",{"_index":585,"t":{"53":{"position":[[400,38]]}}}],["http://mymultiscrobblerip:9078/1",{"_index":1154,"t":{"148":{"position":[[242,33],[459,33]]},"434":{"position":[[2084,33]]}}}],["http://mymultiscrobblerip:9078/1/submit",{"_index":1153,"t":{"148":{"position":[[102,39]]}}}],["http://mymultiscrobblerip:9078/api/listenbrainz/myslug",{"_index":1159,"t":{"148":{"position":[[642,54]]}}}],["http://some_ip:7000/subfolder/api",{"_index":2025,"t":{"347":{"position":[[1101,33]]}}}],["http://your_jellyin_url/web/index.html#!/apikeys.html",{"_index":1092,"t":{"122":{"position":[[163,55]]}}}],["http://yourmultiscrobblerdomain/health",{"_index":465,"t":{"33":{"position":[[77,38]]}}}],["https://192.168.0.101",{"_index":345,"t":{"21":{"position":[[1065,21]]}}}],["https://192.168.0.101:443/lastfm/callback",{"_index":346,"t":{"21":{"position":[[1087,41]]}}}],["https://airsonic.foxx.exampl",{"_index":771,"t":{"77":{"position":[[2784,31]]}}}],["https://api.listenbrainz.org",{"_index":599,"t":{"59":{"position":[[166,29],[427,30],[738,30]]},"156":{"position":[[465,30],[776,30]]}}}],["https://bsky.app/settings/app",{"_index":693,"t":{"70":{"position":[[77,29]]}}}],["https://developer.spotify.com",{"_index":1285,"t":{"190":{"position":[[599,29]]}}}],["https://echo.multi",{"_index":1327,"t":{"190":{"position":[[3926,18]]}}}],["https://en.wikipedia.org/wiki/list_of_tz_database_time_zon",{"_index":2114,"t":{"368":{"position":[[523,60]]},"370":{"position":[[1104,60]]},"432":{"position":[[302,60]]}}}],["https://github.com/foxxmd/multi",{"_index":1993,"t":{"339":{"position":[[265,31]]},"374":{"position":[[86,31]]}}}],["https://github.com/patrickkfkan/volumio",{"_index":1454,"t":{"222":{"position":[[602,39]]}}}],["https://koito.mydomain.com",{"_index":507,"t":{"35":{"position":[[1140,26],[1167,26]]}}}],["https://koito.mydomain.com/apis/listenbrainz/1",{"_index":508,"t":{"35":{"position":[[1194,46]]}}}],["https://maloja.foxx.exampl",{"_index":781,"t":{"77":{"position":[[3235,30]]},"79":{"position":[[1629,30]]}}}],["https://maloja.fred.exampl",{"_index":783,"t":{"77":{"position":[[3353,30]]},"79":{"position":[[1729,30]]}}}],["https://maloja.mary.exampl",{"_index":785,"t":{"77":{"position":[[3471,30]]},"79":{"position":[[1829,30]]}}}],["https://musicbrainz.org",{"_index":1770,"t":{"272":{"position":[[720,24],[945,23]]}}}],["https://my.cool.libre.com/2.0",{"_index":559,"t":{"49":{"position":[[229,30]]}}}],["https://my.libre.example/2.0",{"_index":567,"t":{"51":{"position":[[580,29]]}}}],["https://my.mb.mirror.domain.com",{"_index":1771,"t":{"272":{"position":[[1037,33]]}}}],["https://scrobbler.mydomain.com",{"_index":1296,"t":{"190":{"position":[[1603,30]]}}}],["https://scrobbler.mydomain.com/callback",{"_index":1298,"t":{"190":{"position":[[1739,39]]}}}],["https://www.google.com/devic",{"_index":1521,"t":{"222":{"position":[[5185,29]]}}}],["https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copi",{"_index":1456,"t":{"222":{"position":[[682,67]]}}}],["icecast",{"_index":804,"t":{"83":{"position":[[208,7]]},"112":{"position":[[24,7],[145,7],[443,7],[613,7],[1286,7],[1621,7],[1770,7],[2017,7]]},"114":{"position":[[82,7],[417,9]]},"448":{"position":[[177,7]]}}}],["icecast.json",{"_index":1057,"t":{"112":{"position":[[1093,12]]}}}],["icecast_url",{"_index":1067,"t":{"114":{"position":[[66,11]]}}}],["ici",{"_index":1064,"t":{"112":{"position":[[1909,7],[2123,3]]}}}],["icon",{"_index":489,"t":{"35":{"position":[[242,5],[330,4]]},"102":{"position":[[417,4]]},"442":{"position":[[1413,5],[1501,4]]}}}],["id",{"_index":547,"t":{"43":{"position":[[348,3]]},"51":{"position":[[434,3]]},"190":{"position":[[4142,3]]},"222":{"position":[[2184,3],[2495,2],[2914,3]]},"224":{"position":[[152,2]]},"278":{"position":[[561,2],[619,3]]},"282":{"position":[[1946,3]]},"294":{"position":[[1219,3],[2049,2]]},"311":{"position":[[117,2],[841,2]]},"349":{"position":[[422,3],[456,2]]},"368":{"position":[[3478,2],[3498,2]]},"404":{"position":[[18,2]]}}}],["id/secret",{"_index":1284,"t":{"190":{"position":[[579,10],[3732,9],[4078,9]]},"434":{"position":[[591,9]]}}}],["id3",{"_index":1387,"t":{"206":{"position":[[1048,3]]},"226":{"position":[[348,3]]}}}],["idea",{"_index":1913,"t":{"289":{"position":[[2711,4]]}}}],["ideal",{"_index":2266,"t":{"389":{"position":[[420,7]]},"420":{"position":[[3295,8]]}}}],["identifi",{"_index":697,"t":{"73":{"position":[[12,10],[412,10],[894,13],[1145,13]]},"188":{"position":[[300,10]]},"204":{"position":[[894,13],[1103,13],[1333,13],[1798,13],[2113,13]]},"234":{"position":[[579,8]]},"272":{"position":[[58,8]]},"278":{"position":[[184,8]]},"294":{"position":[[998,11]]},"383":{"position":[[1110,8],[1653,10],[1685,11]]}}}],["idl",{"_index":1524,"t":{"222":{"position":[[5421,4]]}}}],["ie",{"_index":76,"t":{"9":{"position":[[603,2]]},"13":{"position":[[615,2],[1529,2],[1650,2],[3212,2],[3333,2]]},"33":{"position":[[399,2]]},"122":{"position":[[1312,2]]},"188":{"position":[[1668,2]]},"222":{"position":[[3558,2]]},"226":{"position":[[418,2],[525,2]]},"240":{"position":[[699,2]]},"332":{"position":[[446,2],[546,2],[611,2]]},"347":{"position":[[2319,2],[2664,2]]},"368":{"position":[[62,3]]},"393":{"position":[[2164,2]]},"398":{"position":[[485,2]]},"430":{"position":[[541,3]]},"471":{"position":[[559,2]]}}}],["if/when",{"_index":825,"t":{"86":{"position":[[584,7]]},"244":{"position":[[43,7]]}}}],["ignor",{"_index":1189,"t":{"164":{"position":[[299,8]]},"204":{"position":[[398,8]]},"420":{"position":[[876,8]]},"430":{"position":[[575,6]]}}}],["ignoreinvalidcert",{"_index":1276,"t":{"188":{"position":[[2667,20],[3213,20]]}}}],["ii",{"_index":1640,"t":{"244":{"position":[[811,2]]}}}],["imag",{"_index":141,"t":{"13":{"position":[[820,6]]},"23":{"position":[[3268,6]]},"190":{"position":[[2638,6]]},"256":{"position":[[633,6]]},"278":{"position":[[1530,6]]},"368":{"position":[[15,6],[90,6],[383,6],[3674,6]]},"370":{"position":[[964,6]]},"432":{"position":[[162,6]]},"448":{"position":[[1197,6]]},"471":{"position":[[520,5]]},"473":{"position":[[29,5]]}}}],["immedi",{"_index":1568,"t":{"232":{"position":[[43,11],[281,11]]},"362":{"position":[[1076,12]]},"398":{"position":[[1014,11]]},"406":{"position":[[1085,11]]}}}],["implement",{"_index":815,"t":{"86":{"position":[[12,11]]},"194":{"position":[[49,10],[516,15]]},"347":{"position":[[1002,9],[1735,9],[2983,9]]},"378":{"position":[[149,11]]},"383":{"position":[[1977,10],[2054,10],[2081,10]]},"391":{"position":[[13,9],[97,9],[1431,9],[2080,9]]},"393":{"position":[[214,10],[569,11],[688,9],[3043,11]]},"396":{"position":[[188,9],[923,10]]},"398":{"position":[[1399,9],[1677,12],[1717,9],[1959,10],[2601,14]]},"414":{"position":[[244,15]]}}}],["import",{"_index":348,"t":{"23":{"position":[[50,9]]},"122":{"position":[[514,9]]},"383":{"position":[[227,6],[274,6],[1278,6],[1370,6]]},"385":{"position":[[164,6],[259,6],[305,6]]},"387":{"position":[[301,6]]},"389":{"position":[[179,6],[206,6],[285,6]]},"391":{"position":[[323,6],[1509,6],[1543,6],[2147,6],[2181,6]]},"393":{"position":[[1536,6],[1570,6]]},"396":{"position":[[332,6],[366,6]]},"398":{"position":[[824,6]]},"436":{"position":[[1661,10]]},"440":{"position":[[878,10]]}}}],["importantli",{"_index":1691,"t":{"250":{"position":[[874,12]]},"380":{"position":[[165,11]]}}}],["imposs",{"_index":2415,"t":{"414":{"position":[[606,10]]}}}],["improv",{"_index":2431,"t":{"420":{"position":[[1289,7]]}}}],["inaccur",{"_index":1925,"t":{"294":{"position":[[1287,10]]}}}],["incentiv",{"_index":1742,"t":{"265":{"position":[[917,12]]},"267":{"position":[[314,12]]}}}],["includ",{"_index":263,"t":{"15":{"position":[[245,8]]},"35":{"position":[[871,7]]},"43":{"position":[[282,7]]},"51":{"position":[[366,7]]},"61":{"position":[[778,8]]},"66":{"position":[[73,9],[323,7]]},"68":{"position":[[860,8]]},"73":{"position":[[147,9],[461,7]]},"106":{"position":[[203,7]]},"108":{"position":[[307,7],[3091,7],[3316,7]]},"112":{"position":[[196,7],[1706,7],[1973,7]]},"130":{"position":[[340,7]]},"158":{"position":[[224,7]]},"186":{"position":[[157,7]]},"202":{"position":[[158,7]]},"206":{"position":[[2292,7]]},"222":{"position":[[3652,7]]},"254":{"position":[[405,7]]},"278":{"position":[[154,7]]},"287":{"position":[[1235,8],[1701,8]]},"296":{"position":[[308,7]]},"300":{"position":[[311,7]]},"315":{"position":[[735,7]]},"341":{"position":[[79,8]]},"414":{"position":[[493,7]]},"420":{"position":[[2692,9],[3268,9]]},"422":{"position":[[81,9]]},"471":{"position":[[240,7]]}}}],["incognito/priv",{"_index":1459,"t":{"222":{"position":[[864,17]]},"406":{"position":[[1050,17]]}}}],["incom",{"_index":2345,"t":{"398":{"position":[[107,8]]}}}],["inconsist",{"_index":1449,"t":{"222":{"position":[[311,12]]},"294":{"position":[[1451,12]]},"420":{"position":[[252,12],[383,13],[660,12],[855,12]]}}}],["incorrectli",{"_index":1022,"t":{"108":{"position":[[2610,11]]},"206":{"position":[[1983,11]]},"226":{"position":[[489,11]]},"416":{"position":[[51,11]]}}}],["independ",{"_index":622,"t":{"61":{"position":[[593,12]]},"68":{"position":[[675,12]]},"448":{"position":[[1342,11]]}}}],["index.j",{"_index":2195,"t":{"383":{"position":[[327,13]]}}}],["indi",{"_index":1747,"t":{"265":{"position":[[1039,6]]},"267":{"position":[[436,6]]}}}],["indic",{"_index":862,"t":{"94":{"position":[[317,8]]},"396":{"position":[[248,10]]},"398":{"position":[[598,8]]}}}],["individu",{"_index":51,"t":{"9":{"position":[[108,10],[957,12]]},"77":{"position":[[162,10],[326,10],[514,10],[701,10],[889,10]]},"242":{"position":[[311,10],[1376,10]]},"256":{"position":[[79,10],[343,10]]},"265":{"position":[[1280,11],[1313,10]]},"269":{"position":[[184,11],[217,10]]},"278":{"position":[[110,10],[1234,10]]},"287":{"position":[[69,11]]},"300":{"position":[[499,10]]},"313":{"position":[[148,10],[350,10]]},"315":{"position":[[76,10]]}}}],["info",{"_index":245,"t":{"13":{"position":[[4939,7],[5163,7]]},"31":{"position":[[771,4],[960,7],[1124,4],[1358,7]]},"100":{"position":[[225,4]]},"166":{"position":[[64,4]]},"343":{"position":[[0,4]]},"347":{"position":[[997,4],[1730,4],[2978,4]]},"349":{"position":[[577,4]]},"362":{"position":[[1000,4]]},"368":{"position":[[3116,4]]},"391":{"position":[[1867,4],[1936,4]]},"393":{"position":[[1399,4]]},"396":{"position":[[903,4]]},"398":{"position":[[2415,4]]},"402":{"position":[[380,4],[635,4]]},"442":{"position":[[1885,4]]}}}],["inform",{"_index":4,"t":{"2":{"position":[[54,11]]},"61":{"position":[[1447,11]]},"81":{"position":[[40,11]]},"102":{"position":[[65,12]]},"106":{"position":[[671,11]]},"108":{"position":[[319,11],[3239,11]]},"112":{"position":[[127,11],[348,11]]},"190":{"position":[[4109,11]]},"194":{"position":[[574,11]]},"206":{"position":[[1066,11],[1142,11],[1258,11],[1322,11],[1936,11],[2011,11]]},"265":{"position":[[177,11]]},"287":{"position":[[1648,11]]},"349":{"position":[[78,11]]},"376":{"position":[[124,11]]},"380":{"position":[[531,11],[947,11]]},"393":{"position":[[506,11],[1363,11]]},"396":{"position":[[122,11]]},"402":{"position":[[237,11],[1583,12],[2497,11]]},"414":{"position":[[334,11]]},"442":{"position":[[1054,11]]},"446":{"position":[[466,11]]},"450":{"position":[[172,11]]},"452":{"position":[[40,11]]},"454":{"position":[[54,11]]}}}],["ingest",{"_index":2357,"t":{"398":{"position":[[2628,6]]}}}],["ingress",{"_index":423,"t":{"27":{"position":[[40,7],[89,7],[194,7]]},"83":{"position":[[444,7],[528,7],[882,7]]},"86":{"position":[[175,7]]},"337":{"position":[[205,7]]},"347":{"position":[[1664,7]]},"380":{"position":[[979,7]]},"398":{"position":[[1155,7]]},"402":{"position":[[18,7],[399,9],[424,9],[654,9],[679,9]]}}}],["inherit",{"_index":2003,"t":{"343":{"position":[[290,10]]},"347":{"position":[[11,7]]},"383":{"position":[[1908,10]]},"393":{"position":[[624,8]]}}}],["initi",{"_index":895,"t":{"96":{"position":[[1912,8]]},"112":{"position":[[680,8]]},"236":{"position":[[360,9]]},"347":{"position":[[131,11],[2084,14]]},"475":{"position":[[37,7]]}}}],["initiali",{"_index":2556,"t":{"473":{"position":[[234,8]]}}}],["innaccuraci",{"_index":1922,"t":{"294":{"position":[[273,13]]}}}],["input",{"_index":1438,"t":{"218":{"position":[[70,7]]}}}],["insecur",{"_index":1218,"t":{"170":{"position":[[1318,9]]},"190":{"position":[[1088,8]]}}}],["insensit",{"_index":295,"t":{"17":{"position":[[1231,11]]},"164":{"position":[[329,12]]},"166":{"position":[[332,12]]}}}],["insid",{"_index":1948,"t":{"315":{"position":[[69,6]]},"368":{"position":[[1305,6]]},"393":{"position":[[1038,6]]}}}],["instal",{"_index":147,"t":{"13":{"position":[[1013,12],[1277,12],[1360,7],[2092,13],[2937,12],[3044,7],[3720,13]]},"17":{"position":[[800,13]]},"55":{"position":[[114,12]]},"118":{"position":[[510,12]]},"126":{"position":[[502,12]]},"170":{"position":[[517,13]]},"210":{"position":[[6,10]]},"339":{"position":[[48,9],[155,9],[220,7],[416,7]]},"341":{"position":[[209,9],[391,7]]},"355":{"position":[[0,7],[16,7]]},"362":{"position":[[1014,7],[1066,9]]},"364":{"position":[[16,7]]},"368":{"position":[[2580,10]]},"372":{"position":[[6,12]]},"374":{"position":[[41,7],[205,7]]},"376":{"position":[[28,8]]},"424":{"position":[[406,9]]},"434":{"position":[[2136,13],[2184,13]]},"446":{"position":[[50,7],[73,12]]},"448":{"position":[[1176,7]]},"458":{"position":[[8,12]]},"475":{"position":[[45,12]]}}}],["instanc",{"_index":404,"t":{"23":{"position":[[3502,8]]},"35":{"position":[[607,9]]},"45":{"position":[[131,8],[200,8]]},"49":{"position":[[43,8],[77,8]]},"51":{"position":[[539,8]]},"57":{"position":[[320,8]]},"77":{"position":[[1371,8]]},"122":{"position":[[437,8]]},"154":{"position":[[419,9]]},"188":{"position":[[84,9]]},"190":{"position":[[2536,9],[3221,8]]},"313":{"position":[[159,9]]},"317":{"position":[[494,9]]},"380":{"position":[[692,8]]},"402":{"position":[[1232,8]]},"420":{"position":[[984,9]]},"434":{"position":[[2582,9]]},"442":{"position":[[1774,9]]}}}],["instead",{"_index":303,"t":{"17":{"position":[[1452,8]]},"45":{"position":[[309,8]]},"112":{"position":[[1418,7]]},"118":{"position":[[597,8]]},"126":{"position":[[589,8]]},"166":{"position":[[86,7],[526,7]]},"190":{"position":[[1897,7]]},"194":{"position":[[469,7]]},"232":{"position":[[1270,8]]},"282":{"position":[[2841,7],[4416,8]]},"289":{"position":[[544,7]]},"294":{"position":[[1983,8]]},"305":{"position":[[65,7]]},"332":{"position":[[521,7]]},"391":{"position":[[1881,7]]},"398":{"position":[[1666,7]]},"402":{"position":[[1903,7]]},"434":{"position":[[3181,8]]}}}],["instruct",{"_index":984,"t":{"108":{"position":[[977,12]]},"138":{"position":[[334,12]]},"142":{"position":[[219,12]]},"184":{"position":[[17,12]]},"190":{"position":[[856,12],[2970,13],[3014,12]]},"200":{"position":[[17,12]]},"222":{"position":[[584,12],[1313,12],[1743,12]]},"362":{"position":[[100,12]]},"368":{"position":[[778,12],[877,12]]},"406":{"position":[[1166,12]]},"434":{"position":[[170,12],[667,12],[759,12]]},"436":{"position":[[228,12]]},"444":{"position":[[80,12]]}}}],["integr",{"_index":945,"t":{"106":{"position":[[12,12]]},"108":{"position":[[539,13]]},"162":{"position":[[318,11]]},"222":{"position":[[112,11]]},"412":{"position":[[214,11]]},"414":{"position":[[16,11]]}}}],["intel/amd",{"_index":2101,"t":{"368":{"position":[[40,11]]}}}],["intend",{"_index":1748,"t":{"265":{"position":[[1087,8],[1265,8]]},"269":{"position":[[169,8]]}}}],["intent",{"_index":1929,"t":{"294":{"position":[[1631,11]]}}}],["intention",{"_index":961,"t":{"106":{"position":[[594,13]]}}}],["interact",{"_index":2032,"t":{"347":{"position":[[1514,11],[2278,11],[2722,11]]},"349":{"position":[[676,10]]},"385":{"position":[[861,11]]}}}],["interaction/consider",{"_index":2548,"t":{"471":{"position":[[95,25]]}}}],["intercept",{"_index":1303,"t":{"190":{"position":[[2398,11]]}}}],["interest",{"_index":1745,"t":{"265":{"position":[[977,10]]},"267":{"position":[[374,10]]},"287":{"position":[[120,10]]}}}],["interfac",{"_index":1069,"t":{"116":{"position":[[81,9]]},"124":{"position":[[76,9]]},"170":{"position":[[20,9],[253,9]]},"206":{"position":[[46,9],[75,10],[210,9],[228,10],[252,9],[341,9],[359,10],[508,9],[594,9],[697,9],[2031,10]]},"343":{"position":[[205,10]]},"345":{"position":[[102,10],[156,9]]},"349":{"position":[[534,10]]},"380":{"position":[[117,9]]},"383":{"position":[[28,9],[465,9],[877,9],[975,9],[1164,9],[1195,10],[1967,9]]},"389":{"position":[[441,9],[542,10]]},"402":{"position":[[2027,9]]},"404":{"position":[[186,9],[204,9],[488,9]]},"448":{"position":[[932,9]]}}}],["intern",{"_index":470,"t":{"33":{"position":[[165,8]]},"190":{"position":[[1175,8]]},"265":{"position":[[1050,13]]},"267":{"position":[[447,13]]},"368":{"position":[[1337,8]]},"385":{"position":[[662,9],[747,9]]},"387":{"position":[[1408,9]]},"398":{"position":[[188,11]]},"434":{"position":[[1442,8]]}}}],["internalconfig",{"_index":2224,"t":{"385":{"position":[[314,15],[672,15]]}}}],["internet",{"_index":1417,"t":{"210":{"position":[[627,9]]}}}],["interpol",{"_index":265,"t":{"17":{"position":[[58,11],[1243,13],[1706,13]]}}}],["interpret",{"_index":609,"t":{"61":{"position":[[266,9]]},"68":{"position":[[348,9]]}}}],["interv",{"_index":200,"t":{"13":{"position":[[2759,11]]},"77":{"position":[[1569,11],[1618,8]]},"79":{"position":[[501,11]]},"192":{"position":[[462,11],[814,11]]}}}],["introduc",{"_index":2550,"t":{"471":{"position":[[181,9]]}}}],["intruct",{"_index":571,"t":{"53":{"position":[[70,11]]},"442":{"position":[[254,11]]}}}],["intuit",{"_index":1615,"t":{"240":{"position":[[663,11]]}}}],["invalid",{"_index":1461,"t":{"222":{"position":[[925,11],[1256,12]]},"406":{"position":[[159,11],[811,10],[1008,11]]}}}],["invok",{"_index":2016,"t":{"347":{"position":[[291,7],[1051,6],[1546,7],[1786,6],[3033,6]]}}}],["involv",{"_index":1325,"t":{"190":{"position":[[3772,8]]}}}],["io.github.foxxmd.multiscrobbl",{"_index":2098,"t":{"364":{"position":[[113,31]]}}}],["io.github.foxxmd.multiscrobbler.yml",{"_index":2063,"t":{"357":{"position":[[68,35]]},"362":{"position":[[950,35]]}}}],["ip",{"_index":514,"t":{"35":{"position":[[1590,2]]},"188":{"position":[[362,2]]},"190":{"position":[[1184,3]]},"368":{"position":[[2681,2],[2718,2]]},"370":{"position":[[189,2]]},"402":{"position":[[1827,2]]},"430":{"position":[[197,2]]},"442":{"position":[[2298,2]]}}}],["ipv4/v6",{"_index":1238,"t":{"174":{"position":[[167,7]]}}}],["isn't",{"_index":632,"t":{"61":{"position":[[1177,5]]},"68":{"position":[[1255,5]]},"265":{"position":[[884,5]]},"267":{"position":[[281,5]]}}}],["iso2",{"_index":1865,"t":{"287":{"position":[[978,4]]}}}],["iso8601",{"_index":2273,"t":{"389":{"position":[[888,7]]}}}],["isrc",{"_index":1786,"t":{"278":{"position":[[623,4],[1703,4]]},"282":{"position":[[1645,8],[1787,4],[1829,4],[1834,6],[1875,4],[2032,4],[2052,8]]},"292":{"position":[[1107,8]]},"294":{"position":[[1010,5]]},"305":{"position":[[451,8]]},"311":{"position":[[53,4],[1114,4],[1150,8]]}}}],["isrc\",\"bas",{"_index":1943,"t":{"309":{"position":[[549,16]]}}}],["isrc+bas",{"_index":1785,"t":{"278":{"position":[[499,10]]}}}],["issu",{"_index":106,"t":{"11":{"position":[[34,6]]},"25":{"position":[[211,5]]},"33":{"position":[[530,6]]},"106":{"position":[[143,5]]},"108":{"position":[[270,5],[347,5],[381,6],[3198,7],[3379,6]]},"194":{"position":[[156,6]]},"206":{"position":[[2250,5]]},"222":{"position":[[482,6]]},"300":{"position":[[202,6],[279,5],[338,5]]},"374":{"position":[[675,5]]},"402":{"position":[[1317,5],[1407,6]]},"414":{"position":[[408,6],[633,6]]},"418":{"position":[[20,5]]},"420":{"position":[[1224,7],[1269,6],[1354,6],[2676,5],[3253,5],[3339,6]]},"464":{"position":[[7,6],[82,6]]}}}],["it'",{"_index":614,"t":{"61":{"position":[[400,5]]},"68":{"position":[[482,5]]},"90":{"position":[[657,4]]},"102":{"position":[[425,4]]},"190":{"position":[[3631,4]]},"232":{"position":[[769,4]]},"238":{"position":[[982,4]]},"289":{"position":[[596,4],[1801,4],[2699,4]]},"294":{"position":[[326,4],[1708,4]]}}}],["itself",{"_index":206,"t":{"13":{"position":[[3600,7]]},"236":{"position":[[390,6]]}}}],["i’m",{"_index":2438,"t":{"420":{"position":[[1802,3]]}}}],["japanes",{"_index":1902,"t":{"289":{"position":[[1882,9]]}}}],["javascript",{"_index":1487,"t":{"222":{"position":[[2271,10]]},"448":{"position":[[2,10]]}}}],["javascript'",{"_index":1959,"t":{"317":{"position":[[917,12]]}}}],["jellyfin",{"_index":727,"t":{"75":{"position":[[838,8]]},"77":{"position":[[2392,11]]},"81":{"position":[[136,9]]},"83":{"position":[[240,8]]},"122":{"position":[[14,8],[84,8],[428,8],[482,8],[789,8],[1033,8],[1296,8],[1663,9],[1753,9],[3311,10]]},"256":{"position":[[563,8],[881,8],[978,8]]},"278":{"position":[[1460,8],[1927,8],[2018,8]]},"294":{"position":[[1122,9]]},"307":{"position":[[514,8]]},"309":{"position":[[589,8]]},"370":{"position":[[94,8]]},"374":{"position":[[941,11]]},"398":{"position":[[1207,9],[1603,9]]},"430":{"position":[[317,9]]},"434":{"position":[[96,8],[147,8],[370,8],[504,8]]},"436":{"position":[[896,8]]},"440":{"position":[[113,8]]},"448":{"position":[[185,8]]},"452":{"position":[[188,9]]}}}],["jellyfin.json",{"_index":844,"t":{"90":{"position":[[183,13]]},"307":{"position":[[536,13]]},"309":{"position":[[611,13]]}}}],["jellyfin/plex",{"_index":2033,"t":{"347":{"position":[[1678,13]]},"380":{"position":[[999,13]]}}}],["jellyfin_apikey",{"_index":1103,"t":{"122":{"position":[[1393,15]]},"368":{"position":[[587,16]]}}}],["jellyfin_apikey=c9fae8756fbf481ebd9c5bb56b",{"_index":1708,"t":{"256":{"position":[[744,42]]},"278":{"position":[[1814,42]]},"434":{"position":[[384,42]]}}}],["jellyfin_apikey=c9fae8756fbf481ebd9c5bb56bd6540c",{"_index":2147,"t":{"370":{"position":[[399,50],[1167,48]]},"374":{"position":[[723,48]]}}}],["jellyfin_devices_allow",{"_index":1108,"t":{"122":{"position":[[1788,22]]}}}],["jellyfin_devices_block",{"_index":1109,"t":{"122":{"position":[[1863,22]]}}}],["jellyfin_libraries_allow",{"_index":1096,"t":{"122":{"position":[[855,24],[1948,24]]}}}],["jellyfin_libraries_block",{"_index":1110,"t":{"122":{"position":[[2034,24]]}}}],["jellyfin_password",{"_index":1104,"t":{"122":{"position":[[1491,17]]}}}],["jellyfin_transforms=musicbrainz",{"_index":1797,"t":{"278":{"position":[[1945,31]]},"436":{"position":[[1047,31]]},"440":{"position":[[264,31]]}}}],["jellyfin_transforms=n",{"_index":1710,"t":{"256":{"position":[[812,26]]}}}],["jellyfin_url",{"_index":1101,"t":{"122":{"position":[[1264,12]]},"368":{"position":[[607,13]]}}}],["jellyfin_url=192.168.0.101:8096",{"_index":2148,"t":{"370":{"position":[[453,33],[1218,31]]},"374":{"position":[[772,31]]}}}],["jellyfin_url=192.168.0.110:8096",{"_index":1707,"t":{"256":{"position":[[710,31]]},"278":{"position":[[1780,31]]},"434":{"position":[[329,31]]}}}],["jellyfin_us",{"_index":1102,"t":{"122":{"position":[[1337,13]]},"368":{"position":[[624,14]]}}}],["jellyfin_user=myus",{"_index":1709,"t":{"256":{"position":[[789,20]]},"278":{"position":[[1859,20]]},"370":{"position":[[490,22],[1252,20]]},"374":{"position":[[804,20]]},"434":{"position":[[464,20]]}}}],["jellyfin_users_allow",{"_index":1093,"t":{"122":{"position":[[652,21],[1599,20]]}}}],["jellyfin_users_block",{"_index":1106,"t":{"122":{"position":[[1689,20]]}}}],["join",{"_index":1827,"t":{"282":{"position":[[4265,8]]}}}],["joiner",{"_index":1674,"t":{"248":{"position":[[514,6],[591,6]]},"263":{"position":[[73,7]]}}}],["journey",{"_index":1550,"t":{"228":{"position":[[100,7]]}}}],["jq0t1mbbkl",{"_index":493,"t":{"35":{"position":[[400,10]]},"442":{"position":[[1571,10]]}}}],["jriver",{"_index":805,"t":{"83":{"position":[[273,6]]},"116":{"position":[[49,6],[123,6]]},"118":{"position":[[27,7],[388,6],[730,7]]},"120":{"position":[[143,6],[687,8]]},"448":{"position":[[194,6]]}}}],["jriver.mydomain.com",{"_index":1077,"t":{"118":{"position":[[801,19]]}}}],["jriver_password",{"_index":1084,"t":{"120":{"position":[[223,15]]}}}],["jriver_url",{"_index":1082,"t":{"120":{"position":[[81,10]]}}}],["jriver_usernam",{"_index":1083,"t":{"120":{"position":[[157,15]]}}}],["json",{"_index":111,"t":{"13":{"position":[[95,4],[127,4],[2074,6]]},"17":{"position":[[104,4],[342,4],[914,4],[1293,5]]},"33":{"position":[[478,4]]},"41":{"position":[[429,4]]},"47":{"position":[[422,4]]},"61":{"position":[[411,6],[752,4]]},"68":{"position":[[493,6],[834,4]]},"391":{"position":[[2539,4]]},"409":{"position":[[291,4]]},"448":{"position":[[1171,4]]}}}],["jsonlint",{"_index":2410,"t":{"409":{"position":[[388,8]]}}}],["jtrnwqwd__xmjf8st3jc",{"_index":756,"t":{"77":{"position":[[1768,23],[1938,23],[2295,23]]},"79":{"position":[[615,23],[769,23],[929,23]]}}}],["keep",{"_index":266,"t":{"17":{"position":[[150,4]]},"39":{"position":[[398,4]]},"86":{"position":[[905,5]]},"222":{"position":[[1567,4]]},"232":{"position":[[565,4]]},"263":{"position":[[127,4]]},"282":{"position":[[6629,4]]},"289":{"position":[[2719,4]]},"393":{"position":[[298,4]]},"398":{"position":[[2235,5]]},"406":{"position":[[721,4]]},"448":{"position":[[1912,4],[2296,4]]}}}],["key",{"_index":293,"t":{"17":{"position":[[1217,4]]},"31":{"position":[[1724,7]]},"35":{"position":[[171,3],[255,4],[273,3],[311,3],[355,3]]},"37":{"position":[[102,3]]},"39":{"position":[[507,3]]},"43":{"position":[[105,3]]},"45":{"position":[[259,4]]},"51":{"position":[[213,3]]},"53":{"position":[[388,4],[452,3],[484,3],[537,3]]},"55":{"position":[[150,3]]},"63":{"position":[[244,3]]},"66":{"position":[[618,3],[767,6],[1033,6]]},"122":{"position":[[53,3],[158,4],[251,3],[306,3],[376,3],[1420,3]]},"186":{"position":[[542,6],[808,6]]},"206":{"position":[[907,4]]},"256":{"position":[[324,5]]},"278":{"position":[[1215,5]]},"345":{"position":[[326,5]]},"434":{"position":[[205,4],[433,3],[3466,3]]},"442":{"position":[[572,4],[639,3],[671,3],[1342,3],[1426,4],[1444,3],[1482,3],[1526,3]]}}}],["key/secret",{"_index":553,"t":{"45":{"position":[[341,10]]}}}],["keys/environment",{"_index":312,"t":{"17":{"position":[[1720,18]]}}}],["keyword",{"_index":1359,"t":{"204":{"position":[[502,7]]}}}],["kfa",{"_index":1519,"t":{"222":{"position":[[5125,3]]}}}],["kind",{"_index":828,"t":{"86":{"position":[[697,4]]},"210":{"position":[[762,4]]},"296":{"position":[[82,5]]}}}],["kitchensink",{"_index":181,"t":{"13":{"position":[[2199,11],[3824,11]]},"446":{"position":[[350,11]]}}}],["know",{"_index":629,"t":{"61":{"position":[[985,5]]},"66":{"position":[[292,4]]},"68":{"position":[[1063,5]]},"73":{"position":[[387,4]]},"79":{"position":[[66,5]]},"108":{"position":[[1804,4]]},"282":{"position":[[6291,4]]},"294":{"position":[[1049,4]]},"298":{"position":[[62,4]]},"385":{"position":[[524,4]]},"398":{"position":[[2986,4]]},"448":{"position":[[1573,7]]}}}],["knower",{"_index":2437,"t":{"420":{"position":[[1793,6]]}}}],["known",{"_index":624,"t":{"61":{"position":[[826,5]]},"68":{"position":[[908,5]]},"194":{"position":[[150,5]]},"313":{"position":[[203,5]]},"347":{"position":[[3185,5]]}}}],["kodi",{"_index":806,"t":{"83":{"position":[[304,4]]},"124":{"position":[[49,4],[119,4]]},"126":{"position":[[27,5],[384,4],[722,5]]},"128":{"position":[[139,4],[656,6]]},"448":{"position":[[201,4]]}}}],["kodi.mydomain.com",{"_index":1124,"t":{"126":{"position":[[789,17]]}}}],["kodi_password",{"_index":1131,"t":{"128":{"position":[[185,13]]}}}],["kodi_url",{"_index":1129,"t":{"128":{"position":[[81,8]]}}}],["kodi_usernam",{"_index":1130,"t":{"128":{"position":[[151,13]]}}}],["koito",{"_index":16,"t":{"4":{"position":[[53,5]]},"35":{"position":[[54,5],[77,5],[100,5],[185,5],[429,5],[486,5],[535,5],[708,5],[761,5],[802,5],[898,5],[1483,5],[1546,5]]},"37":{"position":[[116,5],[150,5],[199,5],[259,6],[550,6],[718,7]]},"83":{"position":[[333,5]]},"86":{"position":[[1111,6]]},"130":{"position":[[23,5],[147,5],[170,5],[193,5],[463,5],[510,5],[612,5],[678,6],[969,6],[1137,7]]},"298":{"position":[[310,7]]},"307":{"position":[[204,7]]},"430":{"position":[[435,5]]},"442":{"position":[[178,5],[1271,5],[1356,5],[1600,5],[1653,5],[1702,5],[2191,5],[2254,5]]},"448":{"position":[[90,6],[206,5],[525,5]]}}}],["koito_allowed_host",{"_index":513,"t":{"35":{"position":[[1563,19]]},"442":{"position":[[2271,19]]}}}],["koito_token",{"_index":515,"t":{"37":{"position":[[82,11]]}}}],["koito_token=mytoken",{"_index":2521,"t":{"442":{"position":[[2117,19]]}}}],["koito_url",{"_index":500,"t":{"35":{"position":[[662,9],[986,9]]},"37":{"position":[[165,9]]}}}],["koito_url=myurl",{"_index":2523,"t":{"442":{"position":[[2159,15]]}}}],["koito_us",{"_index":496,"t":{"35":{"position":[[459,11]]},"37":{"position":[[130,10]]}}}],["koito_user=myus",{"_index":2522,"t":{"442":{"position":[[2139,17]]}}}],["label",{"_index":1095,"t":{"122":{"position":[[818,8]]},"188":{"position":[[1454,8]]}}}],["languag",{"_index":1731,"t":{"265":{"position":[[707,10]]},"267":{"position":[[104,10]]}}}],["larg",{"_index":1749,"t":{"265":{"position":[[1107,5]]},"269":{"position":[[11,5]]},"292":{"position":[[355,5]]}}}],["largest",{"_index":1756,"t":{"265":{"position":[[1486,7]]},"269":{"position":[[390,7]]}}}],["last",{"_index":1371,"t":{"204":{"position":[[1191,9]]},"244":{"position":[[192,4]]},"292":{"position":[[1072,4]]},"420":{"position":[[1760,4]]},"473":{"position":[[186,4]]}}}],["last.fm",{"_index":10,"t":{"2":{"position":[[133,8]]},"4":{"position":[[17,7]]},"17":{"position":[[176,7],[489,7]]},"39":{"position":[[92,7],[181,8],[199,7],[234,7],[261,7]]},"61":{"position":[[1208,7]]},"68":{"position":[[1286,7]]},"75":{"position":[[304,7]]},"83":{"position":[[362,7],[425,7]]},"86":{"position":[[1122,7]]},"132":{"position":[[97,7],[139,8],[157,7],[220,7],[246,7]]},"134":{"position":[[76,7],[148,7],[229,7]]},"138":{"position":[[26,7],[157,7],[246,8],[264,7],[379,7]]},"140":{"position":[[76,7],[125,7],[229,7]]},"204":{"position":[[1019,8],[1916,9],[2231,9]]},"294":{"position":[[516,8],[546,7],[1432,7],[1440,7],[1675,7],[1805,7]]},"311":{"position":[[0,7],[186,8]]},"393":{"position":[[152,7]]},"398":{"position":[[296,8],[548,9]]},"412":{"position":[[28,7],[86,7],[206,7]]},"430":{"position":[[351,7]]},"434":{"position":[[128,7],[3078,7],[3235,7],[3256,7],[3335,8],[3695,7],[4077,7]]},"436":{"position":[[928,7]]},"440":{"position":[[145,7]]},"442":{"position":[[170,7],[926,8]]},"448":{"position":[[63,8],[212,7],[229,7],[531,7],[2171,7],[2419,7]]},"454":{"position":[[133,8]]},"462":{"position":[[267,7]]}}}],["last.fm'",{"_index":852,"t":{"92":{"position":[[274,9]]}}}],["last.fm/libre.fm",{"_index":526,"t":{"39":{"position":[[58,16]]},"41":{"position":[[412,16]]},"138":{"position":[[130,17]]}}}],["last.fm/listenbrainz",{"_index":2542,"t":{"448":{"position":[[2105,21]]}}}],["lastfm",{"_index":320,"t":{"21":{"position":[[97,6],[479,6],[576,6]]},"43":{"position":[[1035,8]]},"77":{"position":[[3540,9]]},"140":{"position":[[875,8]]},"244":{"position":[[684,7]]},"430":{"position":[[412,7]]}}}],["lastfm.json",{"_index":282,"t":{"17":{"position":[[510,11],[946,11]]},"230":{"position":[[367,11]]},"232":{"position":[[1338,11]]},"311":{"position":[[622,11]]},"319":{"position":[[62,11]]},"434":{"position":[[3525,11]]},"436":{"position":[[1509,11]]},"440":{"position":[[726,11]]}}}],["lastfm/callback",{"_index":543,"t":{"43":{"position":[[290,15]]}}}],["lastfm_api_key",{"_index":540,"t":{"43":{"position":[[82,14]]}}}],["lastfm_api_key=myapikey",{"_index":2517,"t":{"442":{"position":[[1211,23]]}}}],["lastfm_redirect_uri",{"_index":538,"t":{"41":{"position":[[372,20]]},"43":{"position":[[185,19]]}}}],["lastfm_secret",{"_index":541,"t":{"43":{"position":[[131,13]]}}}],["lastfm_secret=myapisecret",{"_index":2518,"t":{"442":{"position":[[1237,25]]}}}],["lastfm_sess",{"_index":545,"t":{"43":{"position":[[322,14]]}}}],["later",{"_index":1574,"t":{"232":{"position":[[672,5],[898,5]]},"434":{"position":[[1067,6],[3955,6]]}}}],["latest",{"_index":2557,"t":{"475":{"position":[[96,6]]}}}],["launch",{"_index":1999,"t":{"341":{"position":[[98,6]]}}}],["lead",{"_index":1831,"t":{"282":{"position":[[6233,4]]}}}],["learn",{"_index":1257,"t":{"182":{"position":[[264,5]]},"198":{"position":[[343,5]]},"446":{"position":[[121,5],[294,5]]}}}],["leav",{"_index":304,"t":{"17":{"position":[[1469,5]]},"222":{"position":[[2251,5],[2387,5]]}}}],["left",{"_index":488,"t":{"35":{"position":[[237,4]]},"206":{"position":[[136,4]]},"442":{"position":[[1408,4]]}}}],["legaci",{"_index":551,"t":{"45":{"position":[[219,6]]}}}],["length",{"_index":857,"t":{"92":{"position":[[595,6]]},"96":{"position":[[62,6]]},"112":{"position":[[1316,7]]},"190":{"position":[[258,6]]},"218":{"position":[[140,7]]},"238":{"position":[[570,7]]}}}],["less",{"_index":974,"t":{"108":{"position":[[489,4]]},"294":{"position":[[1385,4]]},"393":{"position":[[1434,4]]}}}],["let'",{"_index":1548,"t":{"228":{"position":[[7,5]]}}}],["level",{"_index":306,"t":{"17":{"position":[[1516,6]]},"27":{"position":[[351,5]]},"31":{"position":[[261,5]]},"236":{"position":[[79,5]]},"240":{"position":[[543,5]]},"292":{"position":[[227,5]]}}}],["leverag",{"_index":1815,"t":{"282":{"position":[[2487,8]]}}}],["lfm",{"_index":1142,"t":{"136":{"position":[[108,3],[278,3]]}}}],["lfm/lz",{"_index":2127,"t":{"368":{"position":[[2182,6]]}}}],["lfm_slug",{"_index":1144,"t":{"136":{"position":[[219,8]]}}}],["lfmendpoint_en",{"_index":1141,"t":{"136":{"position":[[82,18]]}}}],["librari",{"_index":723,"t":{"75":{"position":[[631,7],[670,7],[769,7]]},"116":{"position":[[207,10]]},"122":{"position":[[798,9],[2000,9],[2086,9]]},"188":{"position":[[1346,9],[1435,9],[2117,9],[2199,9]]},"222":{"position":[[1476,7]]},"406":{"position":[[583,7]]},"420":{"position":[[2997,7]]},"434":{"position":[[2967,7]]}}}],["librariesallow",{"_index":762,"t":{"77":{"position":[[2114,17],[2349,17]]},"79":{"position":[[851,17],[983,17]]},"122":{"position":[[837,14],[2478,17],[3093,17]]},"188":{"position":[[1473,14],[2534,17],[3080,17]]}}}],["librariesblock",{"_index":1117,"t":{"122":{"position":[[2511,17],[3128,17]]},"188":{"position":[[2569,17],[3115,17]]}}}],["libre.fm",{"_index":15,"t":{"4":{"position":[[27,8]]},"45":{"position":[[58,8],[84,8],[122,8],[191,8],[295,8]]},"47":{"position":[[413,8]]},"49":{"position":[[34,8]]},"51":{"position":[[122,9],[530,8]]},"83":{"position":[[393,8]]},"142":{"position":[[26,8],[131,9],[150,8],[264,8]]},"144":{"position":[[76,8],[126,8],[231,8]]},"448":{"position":[[220,8],[539,8]]}}}],["librefm",{"_index":570,"t":{"51":{"position":[[1144,9]]},"144":{"position":[[787,9]]}}}],["librefm/callback",{"_index":564,"t":{"51":{"position":[[374,16]]}}}],["librefm_api_key",{"_index":561,"t":{"51":{"position":[[172,15]]}}}],["librefm_en",{"_index":560,"t":{"51":{"position":[[82,14]]}}}],["librefm_redirect_uri",{"_index":554,"t":{"47":{"position":[[372,21]]},"51":{"position":[[267,20]]}}}],["librefm_secret",{"_index":562,"t":{"51":{"position":[[217,14]]}}}],["librefm_sess",{"_index":565,"t":{"51":{"position":[[407,15]]}}}],["librefm_urlbas",{"_index":556,"t":{"49":{"position":[[96,15]]},"51":{"position":[[496,15]]}}}],["licens",{"_index":1741,"t":{"265":{"position":[[904,9]]},"267":{"position":[[301,9]]}}}],["lifecycl",{"_index":1537,"t":{"226":{"position":[[201,10]]},"228":{"position":[[23,9]]},"230":{"position":[[220,9]]},"232":{"position":[[627,9],[685,9]]}}}],["limit",{"_index":843,"t":{"90":{"position":[[3,5]]},"108":{"position":[[1073,11]]},"222":{"position":[[893,5]]},"248":{"position":[[147,7]]},"272":{"position":[[14,9]]},"406":{"position":[[969,5]]},"412":{"position":[[10,10]]}}}],["line",{"_index":1382,"t":{"206":{"position":[[763,4],[953,4]]},"416":{"position":[[164,5]]}}}],["link",{"_index":865,"t":{"94":{"position":[[433,4]]},"96":{"position":[[1118,4]]},"112":{"position":[[881,4]]},"222":{"position":[[5160,4],[5460,4]]},"238":{"position":[[660,6]]},"406":{"position":[[514,4]]},"462":{"position":[[406,4]]}}}],["lint",{"_index":2000,"t":{"341":{"position":[[241,7]]}}}],["linux",{"_index":985,"t":{"108":{"position":[[990,5],[1139,5]]},"170":{"position":[[70,5],[106,5]]},"368":{"position":[[737,5],[836,5],[3104,5],[3172,5]]},"370":{"position":[[304,5]]},"402":{"position":[[549,5],[760,5]]},"422":{"position":[[67,5]]},"444":{"position":[[59,5]]},"448":{"position":[[331,6]]}}}],["list",{"_index":98,"t":{"9":{"position":[[1175,4],[1266,4]]},"61":{"position":[[880,4]]},"68":{"position":[[958,4]]},"86":{"position":[[1326,5]]},"108":{"position":[[2238,4],[2740,4]]},"110":{"position":[[330,5],[441,4],[521,5],[624,4]]},"122":{"position":[[1639,4],[1729,4],[1830,4],[1905,4],[1992,4],[2078,4]]},"164":{"position":[[193,4]]},"166":{"position":[[231,5]]},"172":{"position":[[202,4],[279,4]]},"188":{"position":[[593,4],[1780,4],[1862,4],[1955,4],[2026,4],[2109,4],[2191,4]]},"194":{"position":[[731,4]]},"204":{"position":[[33,5],[216,4]]},"216":{"position":[[241,4],[330,4]]},"248":{"position":[[232,4]]},"250":{"position":[[66,4],[182,4],[211,4],[378,4],[473,4],[519,4],[1272,5],[1311,4]]},"278":{"position":[[309,4]]},"282":{"position":[[382,4],[1618,6]]},"347":{"position":[[312,7]]},"380":{"position":[[440,5]]},"383":{"position":[[1181,4],[1671,4]]},"393":{"position":[[2515,4]]},"396":{"position":[[871,4]]},"398":{"position":[[2970,4],[4040,4]]},"420":{"position":[[165,4],[232,4],[598,4],[641,4],[750,4],[847,4],[1770,5]]},"434":{"position":[[2814,4]]},"452":{"position":[[364,4]]}}}],["listen",{"_index":822,"t":{"86":{"position":[[292,9],[634,9],[653,9],[715,9],[823,8],[1257,9]]},"92":{"position":[[30,9],[115,10],[143,8],[208,8],[486,8],[552,8]]},"94":{"position":[[182,9]]},"96":{"position":[[124,9],[1660,8]]},"98":{"position":[[292,9],[312,9]]},"102":{"position":[[179,9]]},"106":{"position":[[101,9]]},"112":{"position":[[553,9],[1440,9]]},"148":{"position":[[142,7]]},"162":{"position":[[244,6]]},"170":{"position":[[171,9],[238,6],[1520,9]]},"218":{"position":[[190,9]]},"222":{"position":[[277,9]]},"226":{"position":[[618,6]]},"228":{"position":[[132,8],[499,6]]},"282":{"position":[[6506,6],[6801,8]]},"337":{"position":[[168,6]]},"349":{"position":[[63,6],[264,6]]},"393":{"position":[[332,9],[2702,8]]},"398":{"position":[[3405,6]]},"420":{"position":[[1001,6],[2728,9],[2836,9],[2874,9],[2934,8]]},"430":{"position":[[363,9]]},"434":{"position":[[76,9]]},"442":{"position":[[77,9]]},"448":{"position":[[39,8],[1674,6]]},"452":{"position":[[88,8]]}}}],["listen:6644,reuseaddr,fork",{"_index":1228,"t":{"170":{"position":[[1610,26]]}}}],["listenbrainz",{"_index":11,"t":{"2":{"position":[[142,15]]},"4":{"position":[[38,12]]},"57":{"position":[[55,12],[85,12],[181,12],[211,12],[265,12]]},"59":{"position":[[780,14]]},"61":{"position":[[1219,13]]},"68":{"position":[[1297,13]]},"75":{"position":[[956,12]]},"83":{"position":[[468,12],[504,12]]},"86":{"position":[[1097,13]]},"146":{"position":[[97,12],[144,13],[167,12],[235,12],[266,12]]},"148":{"position":[[76,12],[174,12],[539,12],[707,12],[752,12]]},"150":{"position":[[5,12]]},"154":{"position":[[23,12],[154,12],[184,12],[280,12],[310,12],[364,12]]},"156":{"position":[[76,12],[130,12],[239,12],[818,14]]},"194":{"position":[[384,12],[438,12]]},"294":{"position":[[1142,12]]},"298":{"position":[[326,13]]},"393":{"position":[[135,12]]},"398":{"position":[[282,13],[533,14]]},"402":{"position":[[115,12]]},"434":{"position":[[1357,13],[1629,12],[1657,12],[1700,12],[2384,12],[2426,12]]},"448":{"position":[[72,13],[248,12],[261,12],[548,12],[2194,12]]},"454":{"position":[[142,15]]}}}],["listenbrainz.baseurl",{"_index":1157,"t":{"148":{"position":[[405,20]]},"434":{"position":[[2030,20]]}}}],["listenbrainzfoxx",{"_index":779,"t":{"77":{"position":[[3080,19]]},"79":{"position":[[1480,19]]}}}],["liter",{"_index":1950,"t":{"317":{"position":[[69,8]]}}}],["live",{"_index":523,"t":{"37":{"position":[[464,4],[774,4]]},"43":{"position":[[722,4],[1092,4]]},"51":{"position":[[877,4],[1202,4]]},"55":{"position":[[377,4],[658,4]]},"59":{"position":[[506,4],[843,4]]},"66":{"position":[[893,4],[1180,4]]},"73":{"position":[[1014,4],[1285,4]]},"96":{"position":[[1613,4]]},"98":{"position":[[602,4],[888,4]]},"104":{"position":[[398,4],[720,4]]},"110":{"position":[[841,4],[1108,4]]},"114":{"position":[[257,4],[475,4]]},"120":{"position":[[489,4],[744,4]]},"122":{"position":[[2728,4],[3370,4]]},"128":{"position":[[436,4],[711,4]]},"130":{"position":[[883,4],[1193,4]]},"136":{"position":[[445,4],[656,4]]},"140":{"position":[[562,4],[932,4]]},"144":{"position":[[520,4],[845,4]]},"152":{"position":[[524,4],[735,4]]},"156":{"position":[[544,4],[881,4]]},"160":{"position":[[471,4],[752,4]]},"168":{"position":[[259,4],[532,4]]},"172":{"position":[[533,4],[780,4]]},"176":{"position":[[349,4],[632,4]]},"180":{"position":[[376,4],[628,4]]},"186":{"position":[[668,4],[955,4]]},"188":{"position":[[2742,4],[3306,4]]},"192":{"position":[[525,4],[898,4]]},"196":{"position":[[432,4],[746,4]]},"204":{"position":[[1976,4],[2311,4]]},"208":{"position":[[301,4],[535,4]]},"216":{"position":[[524,4],[771,4]]},"220":{"position":[[281,4],[499,4]]},"224":{"position":[[670,4],[1048,4]]}}}],["live|remast",{"_index":1963,"t":{"322":{"position":[[180,15]]}}}],["load",{"_index":574,"t":{"53":{"position":[[157,10]]},"272":{"position":[[547,4]]},"442":{"position":[[341,10]]}}}],["local",{"_index":155,"t":{"13":{"position":[[1271,5],[2931,5]]},"23":{"position":[[3346,5]]},"170":{"position":[[463,5],[511,5],[780,5]]},"188":{"position":[[244,5],[259,5],[356,5],[629,5],[799,5],[1005,5],[1304,5]]},"190":{"position":[[1356,7],[2228,5]]},"210":{"position":[[670,5]]},"339":{"position":[[91,7]]},"448":{"position":[[1219,7]]}}}],["local/nod",{"_index":146,"t":{"13":{"position":[[1002,10]]}}}],["localhost",{"_index":1075,"t":{"118":{"position":[[575,9]]},"126":{"position":[[567,9]]},"162":{"position":[[885,9]]},"168":{"position":[[137,12],[390,12]]},"190":{"position":[[1161,9]]},"210":{"position":[[364,10]]},"402":{"position":[[1914,9]]},"404":{"position":[[563,9]]},"430":{"position":[[545,10],[654,10]]}}}],["localhost:6600",{"_index":1242,"t":{"176":{"position":[[93,14]]}}}],["localhost:8080",{"_index":1404,"t":{"208":{"position":[[93,14],[212,17],[429,17]]}}}],["locat",{"_index":151,"t":{"13":{"position":[[1167,7],[1980,7],[2827,7]]},"61":{"position":[[832,8]]},"68":{"position":[[914,8]]},"190":{"position":[[2286,8]]},"218":{"position":[[434,7]]},"360":{"position":[[155,7]]},"370":{"position":[[166,7]]},"448":{"position":[[2401,9]]}}}],["lock.json",{"_index":2084,"t":{"362":{"position":[[332,9],[518,9]]}}}],["log",{"_index":305,"t":{"17":{"position":[[1496,3]]},"21":{"position":[[123,7]]},"25":{"position":[[107,3],[242,4],[347,4]]},"102":{"position":[[204,7]]},"108":{"position":[[3107,4],[3304,7],[3324,3]]},"206":{"position":[[1837,4],[2280,7],[2317,4],[2354,7]]},"222":{"position":[[2852,3],[5034,6],[5356,3]]},"224":{"position":[[326,3]]},"244":{"position":[[7,3],[121,4],[126,6],[266,6],[454,6],[585,4]]},"300":{"position":[[148,7],[299,7],[323,4],[479,6],[659,6]]},"345":{"position":[[507,7]]},"347":{"position":[[638,3]]},"402":{"position":[[233,3],[313,4],[882,4],[1164,4],[1428,8],[1458,7],[2419,5],[2474,4]]},"409":{"position":[[39,5]]},"414":{"position":[[439,7],[501,4],[559,6]]},"416":{"position":[[105,4]]},"418":{"position":[[43,7]]},"420":{"position":[[1688,3],[2205,8],[2234,4],[2283,3],[2296,4],[2498,4],[2521,4],[3225,4],[3278,4],[3319,5]]},"444":{"position":[[596,3]]},"448":{"position":[[981,4]]},"462":{"position":[[38,5]]}}}],["logauthupdatechang",{"_index":1468,"t":{"222":{"position":[[1159,23],[2749,23],[4052,23]]}}}],["logdiff",{"_index":1469,"t":{"222":{"position":[[1189,10],[2779,10],[4082,10]]},"224":{"position":[[606,10],[963,10]]},"420":{"position":[[1491,7],[1592,10],[2427,10]]}}}],["logfilenamepattern",{"_index":1400,"t":{"206":{"position":[[1897,22]]}}}],["logfilterfailur",{"_index":219,"t":{"13":{"position":[[4141,19]]},"122":{"position":[[2652,19],[3272,19]]},"188":{"position":[[2638,19],[3184,19]]}}}],["logic",{"_index":1982,"t":{"337":{"position":[[128,6]]}}}],["login",{"_index":916,"t":{"102":{"position":[[59,5]]},"188":{"position":[[387,7]]},"190":{"position":[[590,5]]},"222":{"position":[[1769,5]]},"422":{"position":[[185,6]]},"426":{"position":[[248,5]]}}}],["logpayload",{"_index":218,"t":{"13":{"position":[[4120,13]]},"108":{"position":[[3556,13]]},"122":{"position":[[2632,13],[3252,13]]},"188":{"position":[[2618,13],[3164,13]]}}}],["logplayerst",{"_index":221,"t":{"13":{"position":[[4169,17]]}}}],["logtofil",{"_index":2455,"t":{"420":{"position":[[2334,9],[2444,12]]}}}],["long",{"_index":1552,"t":{"228":{"position":[[144,4]]},"393":{"position":[[1381,4],[1471,4],[2714,4]]}}}],["longer",{"_index":1288,"t":{"190":{"position":[[1074,6],[1207,6]]},"222":{"position":[[1386,6]]},"376":{"position":[[44,6]]}}}],["look",{"_index":272,"t":{"17":{"position":[[290,4]]},"73":{"position":[[432,4]]},"206":{"position":[[1738,4]]},"230":{"position":[[44,5]]},"256":{"position":[[438,4]]},"278":{"position":[[1330,4]]},"282":{"position":[[5144,5]]},"385":{"position":[[556,5]]},"396":{"position":[[886,5]]},"402":{"position":[[321,5]]},"434":{"position":[[67,4]]}}}],["lookup",{"_index":1361,"t":{"204":{"position":[[626,6]]}}}],["lose",{"_index":43,"t":{"7":{"position":[[338,4]]}}}],["lost",{"_index":2125,"t":{"368":{"position":[[1736,4]]}}}],["lower",{"_index":1879,"t":{"289":{"position":[[183,5]]}}}],["ltj",{"_index":1641,"t":{"244":{"position":[[843,3]]}}}],["lua",{"_index":1377,"t":{"206":{"position":[[373,3],[380,3]]}}}],["lz",{"_index":596,"t":{"59":{"position":[[116,2],[144,2],[217,2]]},"152":{"position":[[107,2],[230,2],[358,2]]}}}],["lz_token",{"_index":595,"t":{"59":{"position":[[82,8]]}}}],["lz_url",{"_index":598,"t":{"59":{"position":[[156,6]]}}}],["lz_user",{"_index":597,"t":{"59":{"position":[[127,7]]}}}],["lze_slug",{"_index":1167,"t":{"152":{"position":[[299,8]]}}}],["lze_token",{"_index":1166,"t":{"152":{"position":[[217,9]]},"434":{"position":[[2479,9]]}}}],["lze_token=mycooltoken",{"_index":2497,"t":{"434":{"position":[[1900,21]]}}}],["lze_transforms=musicbrainz",{"_index":2514,"t":{"436":{"position":[[1332,26]]},"440":{"position":[[549,26]]}}}],["lzendpoint_en",{"_index":1165,"t":{"152":{"position":[[82,17]]}}}],["machin",{"_index":980,"t":{"108":{"position":[[874,7],[1020,7]]},"118":{"position":[[538,7]]},"126":{"position":[[530,7]]},"190":{"position":[[1987,7],[2368,7],[2577,7]]},"368":{"position":[[1006,7],[2609,7],[2696,8]]},"370":{"position":[[254,7]]},"393":{"position":[[233,7],[558,7],[968,7],[2607,7]]},"398":{"position":[[52,7],[682,7],[1576,7]]},"402":{"position":[[1788,7],[2189,7],[2389,8]]},"404":{"position":[[336,7]]},"430":{"position":[[176,7],[494,7]]}}}],["made",{"_index":1580,"t":{"232":{"position":[[1301,4]]},"234":{"position":[[13,4]]},"287":{"position":[[1120,4]]},"347":{"position":[[2504,4]]}}}],["magic",{"_index":1010,"t":{"108":{"position":[[1794,9]]}}}],["main",{"_index":1349,"t":{"202":{"position":[[62,4]]},"206":{"position":[[223,4],[354,4]]},"368":{"position":[[753,4],[852,4]]}}}],["mainstream",{"_index":1727,"t":{"265":{"position":[[587,10],[944,10]]},"267":{"position":[[341,10]]}}}],["major",{"_index":993,"t":{"108":{"position":[[1133,5]]},"112":{"position":[[168,8]]},"287":{"position":[[1759,8]]},"294":{"position":[[267,5]]},"393":{"position":[[4,8]]},"471":{"position":[[140,8]]}}}],["major/minor",{"_index":2549,"t":{"471":{"position":[[152,11]]}}}],["majorli",{"_index":2012,"t":{"345":{"position":[[468,7]]}}}],["make",{"_index":353,"t":{"23":{"position":[[113,4]]},"33":{"position":[[308,4]]},"77":{"position":[[264,4],[639,4],[2213,6],[2235,4],[2449,6],[2471,4]]},"86":{"position":[[197,5]]},"102":{"position":[[116,4]]},"118":{"position":[[404,4]]},"126":{"position":[[398,4]]},"150":{"position":[[136,4]]},"162":{"position":[[762,4]]},"170":{"position":[[976,4],[1543,4]]},"188":{"position":[[25,4]]},"222":{"position":[[4370,4],[4418,4]]},"282":{"position":[[690,4],[822,6]]},"347":{"position":[[1814,4],[3165,4]]},"362":{"position":[[168,4]]},"402":{"position":[[2313,4]]},"420":{"position":[[271,5]]},"434":{"position":[[1981,6],[2323,6],[2523,4],[3445,4]]}}}],["maloja",{"_index":9,"t":{"2":{"position":[[125,7]]},"4":{"position":[[61,6]]},"13":{"position":[[626,6],[1662,6],[3345,6],[4682,9]]},"53":{"position":[[8,6],[57,6],[511,6]]},"55":{"position":[[601,8]]},"75":{"position":[[99,6]]},"77":{"position":[[3186,9],[3304,9],[3422,9]]},"83":{"position":[[552,6]]},"158":{"position":[[28,6],[52,6],[76,6]]},"160":{"position":[[76,6],[124,6],[228,6],[695,8]]},"256":{"position":[[574,6],[939,6]]},"278":{"position":[[1471,6],[1979,6]]},"368":{"position":[[1295,6],[1389,6]]},"370":{"position":[[110,6]]},"374":{"position":[[1145,9]]},"430":{"position":[[420,7]]},"442":{"position":[[163,6],[192,6],[241,6]]},"448":{"position":[[55,7],[285,6],[561,6]]},"454":{"position":[[125,7]]}}}],["maloja'",{"_index":572,"t":{"53":{"position":[[88,8]]},"442":{"position":[[272,8]]}}}],["maloja.json",{"_index":191,"t":{"13":{"position":[[2493,11]]}}}],["maloja_api_key",{"_index":589,"t":{"55":{"position":[[127,14]]},"368":{"position":[[676,15]]}}}],["maloja_api_key=1234",{"_index":145,"t":{"13":{"position":[[964,19]]},"370":{"position":[[578,21],[1349,19]]}}}],["maloja_api_key=myapikey",{"_index":1712,"t":{"256":{"position":[[989,23]]},"278":{"position":[[2069,23]]},"442":{"position":[[871,23]]}}}],["maloja_force_password=change_m",{"_index":578,"t":{"53":{"position":[[213,31]]},"442":{"position":[[397,31]]}}}],["maloja_url",{"_index":588,"t":{"55":{"position":[[82,10]]}}}],["maloja_url=\"http://domain.tld",{"_index":2168,"t":{"374":{"position":[[825,30]]}}}],["maloja_url=http://192.168.0.100:42010",{"_index":1711,"t":{"256":{"position":[[899,37]]},"278":{"position":[[2029,37]]},"442":{"position":[[831,37]]}}}],["maloja_url=http://domain.tld",{"_index":2150,"t":{"370":{"position":[[544,30]]}}}],["maloja_url=http://domain.tld:42010",{"_index":144,"t":{"13":{"position":[[927,34]]},"370":{"position":[[1312,34]]}}}],["maloja_url=http://maloja:42010",{"_index":2115,"t":{"368":{"position":[[642,30]]}}}],["malojadata",{"_index":579,"t":{"53":{"position":[[291,12]]},"442":{"position":[[475,12]]}}}],["malojadata/dock",{"_index":573,"t":{"53":{"position":[[125,19]]},"442":{"position":[[309,19]]}}}],["manag",{"_index":1991,"t":{"339":{"position":[[144,6]]},"422":{"position":[[30,7]]},"428":{"position":[[85,9]]},"448":{"position":[[1767,6]]}}}],["mani",{"_index":160,"t":{"13":{"position":[[1453,4],[1475,4],[3136,4],[3158,4]]},"106":{"position":[[87,4]]},"108":{"position":[[1177,4]]},"162":{"position":[[67,4]]},"226":{"position":[[159,4]]},"265":{"position":[[764,4]]},"267":{"position":[[161,4]]},"282":{"position":[[1277,4],[6456,4]]},"380":{"position":[[131,4]]},"420":{"position":[[2255,4]]},"436":{"position":[[332,4]]},"438":{"position":[[65,4]]},"448":{"position":[[122,4],[512,4],[1698,4]]}}}],["manual",{"_index":887,"t":{"96":{"position":[[1046,9],[1903,8]]},"108":{"position":[[758,8]]},"110":{"position":[[18,8]]},"112":{"position":[[809,9],[1946,8]]},"190":{"position":[[2461,8]]},"362":{"position":[[47,8]]}}}],["map",{"_index":448,"t":{"31":{"position":[[791,9],[1144,9]]},"368":{"position":[[2077,3]]}}}],["mari",{"_index":714,"t":{"75":{"position":[[68,4],[287,4],[548,4]]},"77":{"position":[[2045,4]]}}}],["mark",{"_index":1840,"t":{"282":{"position":[[7081,6]]}}}],["maryapikey",{"_index":786,"t":{"77":{"position":[[3512,12],[3589,13]]},"79":{"position":[[1870,12],[1955,13]]}}}],["marylfm",{"_index":787,"t":{"77":{"position":[[3558,10]]},"79":{"position":[[1924,10]]}}}],["marymaloja",{"_index":745,"t":{"77":{"position":[[1231,15],[1903,15],[3440,13]]},"79":{"position":[[274,15],[734,15],[1798,13]]}}}],["maryplex",{"_index":760,"t":{"77":{"position":[[1880,11]]},"79":{"position":[[711,11]]}}}],["marysecret",{"_index":788,"t":{"77":{"position":[[3613,13]]},"79":{"position":[[1979,13]]}}}],["maryspot",{"_index":744,"t":{"77":{"position":[[1208,11]]},"79":{"position":[[251,11]]}}}],["maryus",{"_index":761,"t":{"77":{"position":[[2006,13]]},"79":{"position":[[837,13]]}}}],["match",{"_index":117,"t":{"13":{"position":[[218,5]]},"17":{"position":[[382,8],[1632,8]]},"61":{"position":[[1599,7],[1746,8]]},"118":{"position":[[430,7]]},"126":{"position":[[424,7]]},"162":{"position":[[801,5]]},"164":{"position":[[219,7]]},"204":{"position":[[294,9]]},"206":{"position":[[1378,8],[1502,7]]},"212":{"position":[[64,7],[560,7]]},"226":{"position":[[96,8]]},"234":{"position":[[363,5]]},"240":{"position":[[1361,5]]},"242":{"position":[[243,5],[550,8],[632,8],[728,8],[810,8],[892,5],[969,5],[1457,7]]},"250":{"position":[[456,7]]},"265":{"position":[[22,7],[83,5],[140,5]]},"274":{"position":[[31,8]]},"278":{"position":[[831,5],[848,5]]},"280":{"position":[[146,8],[310,7],[356,5]]},"282":{"position":[[967,7],[1192,6],[1312,6],[1337,7],[6114,5],[6569,7],[6650,7],[6750,6]]},"285":{"position":[[5,5],[186,8],[234,7]]},"287":{"position":[[222,5],[493,6],[1203,7],[1776,7],[1806,8],[1997,5]]},"289":{"position":[[6,7],[48,7],[140,5],[194,7],[210,6],[332,8],[373,5],[1065,7],[1240,5],[1263,7],[1342,5],[2356,6],[3164,7]]},"292":{"position":[[130,8],[154,5],[295,5]]},"294":{"position":[[126,9],[367,8],[424,5],[1408,8],[1481,8],[1759,7]]},"296":{"position":[[156,5],[267,5],[395,8],[441,5],[537,7]]},"298":{"position":[[31,5],[218,7]]},"300":{"position":[[32,7],[75,5]]},"307":{"position":[[150,5],[229,5]]},"309":{"position":[[177,7],[829,5]]},"311":{"position":[[133,7],[1176,7]]},"317":{"position":[[59,7],[203,7],[227,6],[366,5],[484,5],[690,7]]},"322":{"position":[[94,7]]},"436":{"position":[[39,5],[690,7]]},"438":{"position":[[423,7]]},"448":{"position":[[1958,5]]},"471":{"position":[[536,5]]}}}],["match/correct",{"_index":1928,"t":{"294":{"position":[[1591,13]]}}}],["match/record",{"_index":1915,"t":{"289":{"position":[[2983,16]]}}}],["matches/releas",{"_index":1878,"t":{"289":{"position":[[91,16]]}}}],["max",{"_index":742,"t":{"77":{"position":[[1133,3]]}}}],["maxpollretri",{"_index":227,"t":{"13":{"position":[[4251,17]]},"77":{"position":[[45,17]]}}}],["maxrequestretri",{"_index":229,"t":{"13":{"position":[[4272,20],[4342,20]]},"77":{"position":[[180,20],[555,20],[1089,20]]}}}],["mayb",{"_index":1941,"t":{"307":{"position":[[462,5]]},"311":{"position":[[593,5]]}}}],["mb_contact",{"_index":1782,"t":{"278":{"position":[[166,10]]}}}],["mb_contact=contact@mydomain.com",{"_index":1783,"t":{"278":{"position":[[211,31],[1607,31]]}}}],["mb_contact=mycoolname@emailprovider.com",{"_index":2511,"t":{"436":{"position":[[611,39]]},"438":{"position":[[344,39]]}}}],["mb_preset",{"_index":1784,"t":{"278":{"position":[[275,10]]}}}],["mb_presets=default,sensible,n",{"_index":1796,"t":{"278":{"position":[[1743,34]]}}}],["mb_presets=sensible,n",{"_index":2512,"t":{"436":{"position":[[700,26]]},"438":{"position":[[433,26]]}}}],["mbid",{"_index":1603,"t":{"238":{"position":[[644,7]]},"265":{"position":[[515,5]]},"276":{"position":[[786,5]]},"282":{"position":[[95,5],[594,5],[2069,4],[2142,4],[2190,5],[2288,4],[2509,6],[2669,5],[2817,5]]},"294":{"position":[[1702,5],[1788,4]]},"298":{"position":[[243,5]]},"307":{"position":[[811,5]]},"311":{"position":[[23,5]]}}}],["mbidrecord",{"_index":1787,"t":{"278":{"position":[[630,13]]},"282":{"position":[[1654,16],[2074,15],[2308,17]]},"294":{"position":[[1016,13],[1883,13]]}}}],["mc_password",{"_index":1255,"t":{"180":{"position":[[145,11]]}}}],["mc_url",{"_index":1254,"t":{"180":{"position":[[82,6]]}}}],["mcast_url",{"_index":1443,"t":{"220":{"position":[[82,9]]}}}],["mdn",{"_index":979,"t":{"108":{"position":[[843,5],[849,4],[934,4]]}}}],["mean",{"_index":125,"t":{"13":{"position":[[408,5]]},"61":{"position":[[1120,7]]},"68":{"position":[[1198,7]]},"118":{"position":[[306,5]]},"126":{"position":[[302,5]]},"162":{"position":[[659,5]]},"222":{"position":[[96,5]]},"250":{"position":[[1201,5]]},"282":{"position":[[6086,5]]},"294":{"position":[[225,5]]},"402":{"position":[[38,5],[1299,5]]},"409":{"position":[[281,5]]}}}],["mechan",{"_index":2351,"t":{"398":{"position":[[1241,9]]}}}],["media",{"_index":963,"t":{"108":{"position":[[8,5],[1559,5],[1617,5],[1739,5],[1818,5],[1936,5],[1988,5],[2000,5],[2032,5],[2189,5],[2451,5],[2483,5],[2525,5],[2565,5],[2632,5],[2878,5],[2968,5],[3038,5]]},"116":{"position":[[155,5],[179,5]]},"118":{"position":[[479,5]]},"122":{"position":[[774,5],[1027,5],[1102,5]]},"170":{"position":[[157,5],[297,5]]},"188":{"position":[[1415,5]]},"380":{"position":[[60,5]]},"416":{"position":[[77,5],[138,5],[216,5],[294,5],[363,5],[407,5]]}}}],["meet",{"_index":836,"t":{"86":{"position":[[988,5]]}}}],["memori",{"_index":357,"t":{"23":{"position":[[188,6],[2038,7]]}}}],["memorysourc",{"_index":2222,"t":{"385":{"position":[[266,12],[378,12],[485,12]]},"389":{"position":[[382,12]]},"391":{"position":[[403,12],[1663,12],[2301,12]]},"393":{"position":[[584,12],[949,12],[1025,12],[1730,12]]},"396":{"position":[[485,12]]},"398":{"position":[[928,12],[1584,12]]}}}],["memorysource.j",{"_index":2223,"t":{"385":{"position":[[284,20]]}}}],["mendhak/http",{"_index":1305,"t":{"190":{"position":[[2611,12],[2766,12],[3392,12]]}}}],["mention",{"_index":1123,"t":{"126":{"position":[[477,9]]}}}],["menu",{"_index":1373,"t":{"206":{"position":[[102,4]]}}}],["messag",{"_index":447,"t":{"31":{"position":[[737,7],[1090,7]]},"33":{"position":[[496,8]]},"391":{"position":[[2607,7]]}}}],["met",{"_index":894,"t":{"96":{"position":[[1816,4]]},"285":{"position":[[179,3]]}}}],["meta",{"_index":1602,"t":{"238":{"position":[[588,7],[639,4]]},"242":{"position":[[1067,4]]},"244":{"position":[[985,4]]},"276":{"position":[[753,7]]},"298":{"position":[[255,4],[606,7]]},"307":{"position":[[257,4],[760,7]]},"389":{"position":[[935,5]]}}}],["metadata",{"_index":380,"t":{"23":{"position":[[1843,10],[2372,11],[3798,11]]},"61":{"position":[[1479,8]]},"108":{"position":[[1652,8]]},"112":{"position":[[6,8],[204,8],[263,8],[1629,8],[1778,8],[2025,8]]},"178":{"position":[[99,8],[343,8]]},"180":{"position":[[129,8]]},"206":{"position":[[2271,8],[2345,8]]},"265":{"position":[[534,9]]},"307":{"position":[[797,8]]},"349":{"position":[[271,8]]},"418":{"position":[[34,8]]}}}],["metdata",{"_index":639,"t":{"61":{"position":[[1402,7]]}}}],["method",{"_index":124,"t":{"13":{"position":[[401,6]]},"86":{"position":[[100,7]]},"100":{"position":[[36,7],[146,7]]},"102":{"position":[[240,7]]},"170":{"position":[[1308,6]]},"190":{"position":[[1245,7],[1869,6]]},"222":{"position":[[523,7],[4896,6]]},"278":{"position":[[583,7]]},"282":{"position":[[915,8],[990,8],[1023,7],[1071,7],[1103,7],[1164,6],[1203,7],[1418,7],[1457,7],[1587,8],[1708,7],[1803,7],[1821,7],[7029,7]]},"294":{"position":[[99,7],[968,7],[1181,7],[1270,7],[1934,7],[2018,7],[2058,8]]},"360":{"position":[[140,6]]},"368":{"position":[[1811,6]]},"383":{"position":[[2101,7]]},"420":{"position":[[496,6]]},"434":{"position":[[721,6]]},"446":{"position":[[58,7]]}}}],["metric",{"_index":850,"t":{"92":{"position":[[56,7]]}}}],["million",{"_index":1729,"t":{"265":{"position":[[640,8],[658,8],[678,8]]},"267":{"position":[[37,8],[55,8],[75,8]]}}}],["mind",{"_index":1571,"t":{"232":{"position":[[573,4]]},"448":{"position":[[1568,4]]}}}],["mini",{"_index":1035,"t":{"110":{"position":[[339,4]]}}}],["minim",{"_index":1589,"t":{"234":{"position":[[547,9]]},"393":{"position":[[3033,9]]}}}],["minimum",{"_index":1844,"t":{"285":{"position":[[152,7]]},"345":{"position":[[58,7]]}}}],["minut",{"_index":27,"t":{"7":{"position":[[128,7]]},"92":{"position":[[223,7]]},"222":{"position":[[4197,7]]},"420":{"position":[[3308,7]]}}}],["mirror",{"_index":1918,"t":{"292":{"position":[[311,6]]},"434":{"position":[[3098,6]]}}}],["miss",{"_index":301,"t":{"17":{"position":[[1358,7],[1545,7]]},"118":{"position":[[246,7]]},"126":{"position":[[242,7]]},"162":{"position":[[599,7]]},"222":{"position":[[338,6]]},"265":{"position":[[169,7]]},"282":{"position":[[262,7],[624,7],[792,7]]},"396":{"position":[[36,8]]},"436":{"position":[[92,7]]},"446":{"position":[[452,7]]}}}],["mistak",{"_index":1947,"t":{"313":{"position":[[337,8]]}}}],["mit",{"_index":2547,"t":{"468":{"position":[[0,3]]}}}],["mix",{"_index":116,"t":{"13":{"position":[[210,3]]},"122":{"position":[[962,5]]},"190":{"position":[[195,7]]},"244":{"position":[[828,4]]}}}],["mixcloud",{"_index":1197,"t":{"166":{"position":[[388,11]]}}}],["mkdir",{"_index":2471,"t":{"424":{"position":[[70,5]]}}}],["mobil",{"_index":2459,"t":{"420":{"position":[[2751,7]]},"448":{"position":[[1311,6]]}}}],["mode",{"_index":412,"t":{"25":{"position":[[17,4],[285,4],[323,4],[418,4]]},"108":{"position":[[3450,5]]},"278":{"position":[[716,4],[1735,5]]},"282":{"position":[[3845,4],[4104,5],[4153,4],[4473,4],[5139,4],[5423,4]]},"292":{"position":[[677,4]]},"300":{"position":[[176,4]]},"387":{"position":[[927,5]]}}}],["modif",{"_index":1210,"t":{"170":{"position":[[750,13]]},"232":{"position":[[1283,13]]},"240":{"position":[[205,12]]},"254":{"position":[[210,12]]},"300":{"position":[[393,12],[510,12]]},"315":{"position":[[542,12]]},"322":{"position":[[27,12]]}}}],["modifi",{"_index":949,"t":{"106":{"position":[[149,6]]},"170":{"position":[[1081,6]]},"190":{"position":[[298,8]]},"206":{"position":[[858,6]]},"230":{"position":[[234,6]]},"232":{"position":[[26,6],[91,6],[186,6],[264,6],[329,6],[421,6],[556,8],[583,9],[749,6],[844,6],[945,8],[969,6],[1219,9],[1246,6],[1457,6],[1522,6]]},"234":{"position":[[100,9]]},"250":{"position":[[490,9]]},"263":{"position":[[418,6]]},"307":{"position":[[44,8]]},"368":{"position":[[297,9]]},"374":{"position":[[445,6],[1324,8]]},"387":{"position":[[191,6]]},"434":{"position":[[2198,6]]},"436":{"position":[[1498,6]]},"440":{"position":[[715,6]]}}}],["modify/replac",{"_index":1946,"t":{"313":{"position":[[72,14]]}}}],["modul",{"_index":1372,"t":{"206":{"position":[[56,6],[262,7]]}}}],["monitor",{"_index":49,"t":{"9":{"position":[[62,10]]},"29":{"position":[[85,7]]},"33":{"position":[[16,10]]},"35":{"position":[[14,7]]},"39":{"position":[[15,7]]},"45":{"position":[[15,7]]},"57":{"position":[[15,7]]},"61":{"position":[[14,7]]},"68":{"position":[[14,7]]},"86":{"position":[[284,7],[1244,8]]},"88":{"position":[[156,7]]},"92":{"position":[[14,8]]},"108":{"position":[[102,7]]},"110":{"position":[[203,10]]},"130":{"position":[[12,8]]},"132":{"position":[[177,7]]},"138":{"position":[[12,8]]},"142":{"position":[[12,8]]},"146":{"position":[[192,7]]},"154":{"position":[[12,8]]},"182":{"position":[[158,8]]},"198":{"position":[[237,8]]},"218":{"position":[[0,7]]},"222":{"position":[[248,10],[5474,11]]},"385":{"position":[[978,9]]},"393":{"position":[[27,8],[382,10]]},"430":{"position":[[297,10]]},"434":{"position":[[55,8],[1252,10],[4149,10]]},"444":{"position":[[304,7]]},"448":{"position":[[686,7]]},"450":{"position":[[78,8]]}}}],["monitoring/webhook",{"_index":204,"t":{"13":{"position":[[3424,19]]}}}],["monitorwhenl",{"_index":889,"t":{"96":{"position":[[1640,16]]},"98":{"position":[[503,18],[787,18]]}}}],["monitorwhenlisten",{"_index":892,"t":{"96":{"position":[[1699,21]]},"98":{"position":[[528,23],[812,23]]}}}],["monoloth",{"_index":1690,"t":{"250":{"position":[[426,10]]}}}],["mopidi",{"_index":807,"t":{"83":{"position":[[582,6]]},"162":{"position":[[0,6],[197,6],[279,6],[375,6],[741,6],[828,6],[1031,7]]},"164":{"position":[[82,6],[434,6]]},"166":{"position":[[33,6]]},"168":{"position":[[475,8]]},"448":{"position":[[292,6]]}}}],["mopidy.conf",{"_index":1178,"t":{"162":{"position":[[854,12]]}}}],["mopidy.mydomain.com",{"_index":1180,"t":{"162":{"position":[[1100,19]]}}}],["mopidy.mydomain.com:80/mopw",{"_index":1183,"t":{"162":{"position":[[1215,28]]}}}],["more",{"_index":169,"t":{"13":{"position":[[1596,4],[1741,4],[3279,4]]},"92":{"position":[[163,5],[234,5],[516,4],[575,4]]},"102":{"position":[[407,4]]},"106":{"position":[[666,4]]},"122":{"position":[[945,4]]},"182":{"position":[[270,4]]},"194":{"position":[[543,4],[569,4]]},"198":{"position":[[349,4]]},"222":{"position":[[407,4]]},"230":{"position":[[254,4]]},"234":{"position":[[31,4]]},"242":{"position":[[1005,4]]},"250":{"position":[[1320,4]]},"265":{"position":[[577,4],[769,4],[1001,4],[1139,4],[1222,4],[1360,4]]},"267":{"position":[[166,4],[398,4]]},"269":{"position":[[43,4],[126,4],[264,4]]},"272":{"position":[[477,4]]},"278":{"position":[[344,4]]},"289":{"position":[[2208,4],[2374,4],[2760,4]]},"292":{"position":[[278,4]]},"294":{"position":[[386,4],[1253,4],[1282,4],[1343,4]]},"311":{"position":[[868,4]]},"332":{"position":[[385,4]]},"349":{"position":[[697,4]]},"370":{"position":[[888,4]]},"374":{"position":[[685,4]]},"376":{"position":[[119,4]]},"393":{"position":[[1426,4]]},"414":{"position":[[329,4]]},"434":{"position":[[3024,4],[3140,4]]},"442":{"position":[[1880,4]]},"446":{"position":[[4,4],[182,4]]},"448":{"position":[[1494,4]]},"450":{"position":[[37,4],[61,4]]}}}],["mount",{"_index":365,"t":{"23":{"position":[[561,5],[597,7],[1318,5],[1354,7]]},"170":{"position":[[916,5]]},"337":{"position":[[135,6]]}}}],["move",{"_index":2085,"t":{"362":{"position":[[342,4],[528,4]]},"420":{"position":[[1837,5],[1927,5],[2027,5],[2110,5]]}}}],["movi",{"_index":2417,"t":{"416":{"position":[[355,7]]}}}],["mozilla/5.0",{"_index":2374,"t":{"402":{"position":[[531,11],[742,11]]}}}],["mpd",{"_index":808,"t":{"83":{"position":[[613,3]]},"172":{"position":[[449,5],[677,5]]},"174":{"position":[[21,3],[117,3]]},"176":{"position":[[578,5]]},"448":{"position":[[299,3]]}}}],["mpd_password",{"_index":1243,"t":{"176":{"position":[[108,12]]}}}],["mpd_url",{"_index":1241,"t":{"176":{"position":[[82,7]]}}}],["mpri",{"_index":1202,"t":{"170":{"position":[[0,5],[211,6],[357,6],[376,5],[575,5],[877,6]]},"172":{"position":[[102,5],[724,7]]},"448":{"position":[[325,5]]}}}],["mpris_blacklist",{"_index":1232,"t":{"172":{"position":[[167,15]]}}}],["mpris_en",{"_index":1231,"t":{"172":{"position":[[82,12]]}}}],["mpris_whitelist",{"_index":1233,"t":{"172":{"position":[[244,15]]}}}],["ms",{"_index":113,"t":{"13":{"position":[[144,2],[314,2],[414,2],[515,2],[569,2],[1133,2],[2780,2],[3597,2]]},"21":{"position":[[277,2]]},"23":{"position":[[2689,2]]},"35":{"position":[[996,2]]},"86":{"position":[[187,2],[270,2],[329,2],[571,2]]},"94":{"position":[[329,2]]},"96":{"position":[[358,2],[424,2],[727,2],[1750,2]]},"106":{"position":[[456,2]]},"108":{"position":[[1570,2],[1917,2],[2499,2],[3262,2]]},"174":{"position":[[0,2]]},"178":{"position":[[222,2],[394,2],[447,2]]},"188":{"position":[[404,2]]},"190":{"position":[[112,2],[436,2],[1353,2]]},"206":{"position":[[0,2],[681,3],[1450,2],[1856,2]]},"210":{"position":[[708,2]]},"214":{"position":[[0,2]]},"222":{"position":[[1212,2],[2375,3],[2429,2],[2810,2],[3094,2],[3240,2],[3379,2],[4241,3],[4563,2],[4686,2],[5348,2]]},"244":{"position":[[0,2]]},"250":{"position":[[311,3]]},"282":{"position":[[7,2],[26,2]]},"287":{"position":[[147,2]]},"347":{"position":[[148,2],[1461,2],[1557,2],[1952,2],[2171,2]]},"349":{"position":[[46,2]]},"357":{"position":[[40,2]]},"362":{"position":[[268,2]]},"364":{"position":[[77,2]]},"368":{"position":[[976,2],[1072,2],[2146,2],[2591,2],[3529,2]]},"376":{"position":[[82,2]]},"378":{"position":[[87,2]]},"380":{"position":[[841,2],[898,2],[1065,3]]},"383":{"position":[[87,2]]},"385":{"position":[[937,2]]},"387":{"position":[[5,2]]},"393":{"position":[[24,2],[211,2],[2854,2]]},"396":{"position":[[57,2],[558,2]]},"398":{"position":[[610,2],[1001,2],[1289,2],[1328,2]]},"406":{"position":[[591,2],[1148,2],[1249,2]]},"414":{"position":[[480,3]]},"416":{"position":[[102,2]]},"418":{"position":[[58,2]]},"420":{"position":[[4,2],[1682,2],[2482,2]]},"450":{"position":[[75,2],[158,2]]}}}],["ms'",{"_index":1281,"t":{"190":{"position":[[350,4]]},"214":{"position":[[205,4]]},"222":{"position":[[426,4],[3311,4]]},"234":{"position":[[260,4]]},"406":{"position":[[524,4]]},"420":{"position":[[1297,4]]}}}],["msdata",{"_index":2524,"t":{"444":{"position":[[221,8]]}}}],["msdata/config/lastfm.json",{"_index":2507,"t":{"434":{"position":[[3725,27]]},"436":{"position":[[1672,27]]},"440":{"position":[[889,27]]}}}],["msdata/dock",{"_index":2489,"t":{"432":{"position":[[107,15]]},"434":{"position":[[299,15],[896,15],[1870,15],[2675,15]]},"436":{"position":[[515,15],[1017,15],[1160,15],[1302,15],[1440,15]]},"438":{"position":[[248,15]]},"440":{"position":[[234,15],[377,15],[519,15],[657,15]]},"442":{"position":[[801,15],[1181,15],[2087,15]]}}}],["mtg8v6xa2nc",{"_index":2441,"t":{"420":{"position":[[1864,13]]}}}],["much",{"_index":1737,"t":{"265":{"position":[[819,4],[996,4],[1355,4]]},"267":{"position":[[216,4],[393,4]]},"269":{"position":[[259,4]]}}}],["multi",{"_index":19,"t":{"7":{"position":[[3,5]]},"9":{"position":[[0,5],[223,5]]},"13":{"position":[[803,5]]},"17":{"position":[[38,5],[269,5],[919,5],[1371,5],[1814,5],[1919,5]]},"19":{"position":[[21,5]]},"23":{"position":[[0,5],[409,5],[3089,5],[3144,5],[3211,5],[3460,5]]},"29":{"position":[[0,5]]},"31":{"position":[[693,5],[1046,5],[1449,5]]},"35":{"position":[[591,5],[821,5],[1526,5],[1597,5]]},"39":{"position":[[161,5]]},"41":{"position":[[64,5],[211,5],[267,5]]},"47":{"position":[[64,5],[211,5],[267,5]]},"57":{"position":[[159,5]]},"61":{"position":[[689,5]]},"66":{"position":[[21,5],[342,5]]},"68":{"position":[[771,5],[1685,5]]},"73":{"position":[[33,5],[480,5]]},"77":{"position":[[1355,5]]},"83":{"position":[[29,5]]},"86":{"position":[[27,5],[389,5],[442,5],[889,5],[1228,5]]},"90":{"position":[[509,5]]},"94":{"position":[[139,5],[238,5]]},"96":{"position":[[181,5],[1504,5]]},"102":{"position":[[78,5]]},"108":{"position":[[82,5],[890,5]]},"112":{"position":[[287,5],[495,5],[1327,5],[2074,5]]},"116":{"position":[[13,5]]},"118":{"position":[[254,5],[691,5]]},"122":{"position":[[61,5],[269,5],[547,5],[739,5],[992,5],[1069,5]]},"124":{"position":[[13,5]]},"126":{"position":[[250,5],[683,5]]},"130":{"position":[[486,5]]},"132":{"position":[[20,5]]},"134":{"position":[[48,5]]},"138":{"position":[[226,5]]},"140":{"position":[[101,5]]},"144":{"position":[[102,5]]},"146":{"position":[[20,5]]},"148":{"position":[[48,5],[342,5],[861,5],[995,5]]},"150":{"position":[[186,5]]},"154":{"position":[[258,5]]},"156":{"position":[[106,5]]},"160":{"position":[[100,5]]},"162":{"position":[[145,5],[607,5],[992,5]]},"164":{"position":[[162,5],[398,5]]},"166":{"position":[[146,5],[237,5],[505,5]]},"170":{"position":[[218,5],[405,5],[479,5],[696,5],[831,5],[1702,5]]},"186":{"position":[[290,5]]},"188":{"position":[[121,5],[1380,5]]},"190":{"position":[[485,5],[1016,5],[1326,5],[1539,5],[1694,5],[1797,5],[1923,5],[2132,5],[2234,5],[2304,5],[2520,5],[2826,5],[2930,5],[3205,5],[3471,5],[3996,5],[4240,5]]},"204":{"position":[[1550,5]]},"206":{"position":[[1078,5],[2046,5]]},"210":{"position":[[560,5]]},"218":{"position":[[247,5],[329,5]]},"222":{"position":[[4945,5]]},"226":{"position":[[0,5],[183,5],[896,5]]},"228":{"position":[[50,5]]},"232":{"position":[[811,5]]},"250":{"position":[[156,5]]},"252":{"position":[[415,5]]},"254":{"position":[[80,5]]},"256":{"position":[[616,5],[679,5]]},"265":{"position":[[115,5],[1538,5]]},"272":{"position":[[514,5],[658,5]]},"278":{"position":[[1513,5],[1576,5]]},"282":{"position":[[924,5],[1749,5],[1908,5],[2152,5],[3181,5],[3389,5],[3688,5]]},"300":{"position":[[40,5]]},"315":{"position":[[437,5]]},"332":{"position":[[45,5]]},"337":{"position":[[0,5]]},"339":{"position":[[316,5]]},"368":{"position":[[366,5],[429,5],[1473,5],[1946,5],[2391,5],[2919,5],[3657,5]]},"370":{"position":[[380,5],[711,5],[947,5],[1010,5]]},"372":{"position":[[47,5]]},"374":{"position":[[137,5]]},"393":{"position":[[3078,5]]},"402":{"position":[[49,5],[148,5],[179,5],[212,5],[1216,5],[1271,5],[1470,5],[1745,5],[1858,5],[2041,5],[2197,5]]},"404":{"position":[[166,5],[293,5]]},"406":{"position":[[21,5],[927,5],[1216,5]]},"412":{"position":[[150,5],[275,5]]},"414":{"position":[[277,5]]},"420":{"position":[[40,5],[289,5],[414,5],[552,5]]},"424":{"position":[[30,5],[216,5]]},"426":{"position":[[72,5],[119,5],[190,5]]},"428":{"position":[[51,5]]},"430":{"position":[[44,5],[281,5],[382,5],[453,5]]},"432":{"position":[[24,5],[145,5],[208,5]]},"434":{"position":[[39,5],[1089,5],[1215,5],[1605,5],[1732,5],[1959,5],[2887,5],[3216,5],[3977,5],[4112,5]]},"436":{"position":[[0,5]]},"442":{"position":[[43,5],[776,5],[1156,5],[1758,5],[2062,5],[2234,5],[2305,5]]},"444":{"position":[[28,5],[264,5],[606,5]]},"446":{"position":[[150,5]]},"448":{"position":[[1365,5],[2130,5]]},"471":{"position":[[11,5],[457,5]]},"473":{"position":[[92,5],[128,5],[162,5],[247,5]]},"475":{"position":[[132,5]]}}}],["multipl",{"_index":81,"t":{"9":{"position":[[699,8]]},"13":{"position":[[1653,8],[3336,8]]},"31":{"position":[[277,8]]},"134":{"position":[[220,8]]},"148":{"position":[[530,8]]},"194":{"position":[[163,8],[586,9]]},"206":{"position":[[1461,8]]},"212":{"position":[[22,8]]},"236":{"position":[[1015,8]]},"272":{"position":[[756,8]]},"282":{"position":[[981,8],[3727,8]]},"289":{"position":[[1656,8],[2014,8]]},"292":{"position":[[720,8]]},"294":{"position":[[476,8]]},"300":{"position":[[384,8]]},"434":{"position":[[1495,8]]},"436":{"position":[[814,8]]},"440":{"position":[[31,8]]},"448":{"position":[[864,8]]}}}],["multipli",{"_index":733,"t":{"77":{"position":[[401,10],[429,10],[776,10],[804,10]]}}}],["music",{"_index":483,"t":{"33":{"position":[[678,6]]},"61":{"position":[[97,5]]},"75":{"position":[[247,5],[916,5]]},"81":{"position":[[88,5],[160,6]]},"83":{"position":[[617,6],[983,5]]},"108":{"position":[[134,5],[429,5],[2666,6]]},"122":{"position":[[830,6]]},"162":{"position":[[21,5],[56,5]]},"170":{"position":[[53,5]]},"182":{"position":[[72,5]]},"188":{"position":[[1466,6]]},"204":{"position":[[148,5],[445,5]]},"218":{"position":[[39,5]]},"222":{"position":[[30,5],[188,5],[4978,5],[5384,5]]},"226":{"position":[[365,5]]},"265":{"position":[[384,5],[839,5],[955,5]]},"267":{"position":[[236,5],[352,5]]},"282":{"position":[[6412,5],[6496,5]]},"292":{"position":[[361,5],[745,5]]},"298":{"position":[[77,5]]},"393":{"position":[[81,5],[115,5],[183,5],[273,5]]},"398":{"position":[[362,5],[512,5],[572,5]]},"416":{"position":[[95,6]]},"420":{"position":[[1060,6],[2887,5]]},"448":{"position":[[29,5],[303,6],[483,5],[2096,5]]},"452":{"position":[[58,5],[128,5],[151,5],[212,6]]},"454":{"position":[[77,5]]}}}],["musicbrainz",{"_index":382,"t":{"23":{"position":[[1904,12]]},"234":{"position":[[336,11],[388,11]]},"240":{"position":[[1072,14],[1261,11],[1333,11],[1387,14]]},"244":{"position":[[768,11]]},"246":{"position":[[92,11]]},"265":{"position":[[4,11],[54,11],[449,11],[564,12],[607,11],[1178,11],[1654,11]]},"267":{"position":[[4,11]]},"269":{"position":[[82,11]]},"272":{"position":[[24,11],[254,14],[365,11],[407,11],[609,11],[700,11],[823,14],[926,11]]},"274":{"position":[[45,11],[174,14]]},"276":{"position":[[185,14],[486,14],[774,11],[1071,14]]},"278":{"position":[[1890,11]]},"280":{"position":[[200,11],[249,11]]},"282":{"position":[[221,11],[851,11],[955,11],[2380,11],[3209,11],[4447,11],[4814,11],[5284,11],[5636,11],[5951,11],[6097,11]]},"285":{"position":[[23,11]]},"287":{"position":[[1032,11]]},"289":{"position":[[1228,11],[1361,11],[1640,11]]},"292":{"position":[[15,11]]},"294":{"position":[[136,11],[340,11],[758,11]]},"296":{"position":[[230,11]]},"298":{"position":[[19,11],[293,11],[502,14]]},"300":{"position":[[3,11],[218,11],[699,14]]},"303":{"position":[[74,14],[321,14]]},"305":{"position":[[162,14],[634,14]]},"307":{"position":[[138,11],[351,14],[656,14]]},"309":{"position":[[0,11],[165,11],[259,14],[729,11],[801,11],[855,14]]},"311":{"position":[[483,14],[759,14],[1076,14]]},"436":{"position":[[24,11],[210,11],[251,11],[361,11],[405,11],[574,11],[657,11],[758,11],[783,11],[1955,13]]},"438":{"position":[[94,11],[138,11],[307,11],[390,11]]},"440":{"position":[[0,11],[1172,13]]},"446":{"position":[[403,11]]},"448":{"position":[[665,11],[1988,11]]}}}],["musicbrainz'",{"_index":647,"t":{"61":{"position":[[1634,13]]}}}],["musiccast",{"_index":814,"t":{"83":{"position":[[941,9]]},"218":{"position":[[8,9],[99,9],[386,9],[414,9]]},"220":{"position":[[100,9],[439,11]]},"448":{"position":[[465,9]]}}}],["musicservicebasedomain",{"_index":1364,"t":{"204":{"position":[[724,22]]}}}],["musictrack",{"_index":1013,"t":{"108":{"position":[[1962,11]]}}}],["musicvideo",{"_index":1119,"t":{"122":{"position":[[2576,16],[3197,13]]}}}],["musikcub",{"_index":810,"t":{"83":{"position":[[663,9]]},"178":{"position":[[16,9],[166,9]]},"180":{"position":[[212,12],[249,12],[462,12],[499,12]]},"387":{"position":[[684,12],[1274,12]]},"448":{"position":[[347,9]]}}}],["musl",{"_index":991,"t":{"108":{"position":[[1112,4]]}}}],["mutli",{"_index":1392,"t":{"206":{"position":[[1203,5],[2148,5]]}}}],["mvp",{"_index":2355,"t":{"398":{"position":[[2084,3]]}}}],["mx",{"_index":1867,"t":{"287":{"position":[[1021,3]]}}}],["my\",\"optional\",\"tag",{"_index":463,"t":{"31":{"position":[[1841,24]]}}}],["my.domain.local:80",{"_index":339,"t":{"21":{"position":[[854,18]]}}}],["my.domain.local:9000",{"_index":341,"t":{"21":{"position":[[913,20]]}}}],["my.domain.tld/api",{"_index":1503,"t":{"222":{"position":[[3561,20]]}}}],["my_api_key_placedhold",{"_index":2508,"t":{"434":{"position":[[3828,26]]},"436":{"position":[[1775,26]]},"440":{"position":[[992,26]]}}}],["my_apikey",{"_index":283,"t":{"17":{"position":[[597,16]]}}}],["my_apikey=a89cba1569901a0671d5a9875fed4be1",{"_index":288,"t":{"17":{"position":[[814,42]]}}}],["my_env",{"_index":278,"t":{"17":{"position":[[391,10],[463,6]]}}}],["my_password",{"_index":1247,"t":{"176":{"position":[[245,13],[511,13]]},"180":{"position":[[314,13],[564,13]]}}}],["my_secret",{"_index":285,"t":{"17":{"position":[[624,16]]}}}],["my_secret=ec42e09d5ae0ee0f0816ca151008412a",{"_index":289,"t":{"17":{"position":[[857,42]]}}}],["my_secret_placehold",{"_index":2509,"t":{"434":{"position":[[3865,24]]},"436":{"position":[[1812,24]]},"440":{"position":[[1029,24]]}}}],["my_token",{"_index":2182,"t":{"380":{"position":[[399,8]]}}}],["myapprisefriendlynameforlog",{"_index":459,"t":{"31":{"position":[[1583,31]]}}}],["mybasicsourc",{"_index":2360,"t":{"398":{"position":[[2822,13]]}}}],["mybasicsourcesourc",{"_index":2366,"t":{"398":{"position":[[3494,19]]}}}],["mycast",{"_index":1016,"t":{"108":{"position":[[2301,9],[2833,9],[3492,9]]},"110":{"position":[[676,9],[919,9]]}}}],["myconfig",{"_index":233,"t":{"13":{"position":[[4453,13],[4716,11]]},"345":{"position":[[166,8]]},"374":{"position":[[964,13],[1163,11]]}}}],["mydeez",{"_index":953,"t":{"106":{"position":[[303,11]]}}}],["mydomain.com",{"_index":670,"t":{"66":{"position":[[235,12]]},"73":{"position":[[326,12]]}}}],["mydomain.com:80/jriverreverse/mcws/v1",{"_index":1081,"t":{"118":{"position":[[917,38],[956,38]]}}}],["mydomain.com:80/kodireverse/jsonrpc",{"_index":1127,"t":{"126":{"position":[[898,35]]}}}],["mygotifyfriendlynameforlog",{"_index":449,"t":{"31":{"position":[[849,30]]}}}],["mygotifytoken",{"_index":244,"t":{"13":{"position":[[4906,16]]}}}],["myici",{"_index":1062,"t":{"112":{"position":[[1826,8]]},"114":{"position":[[138,8],[335,8]]}}}],["myjellyfin",{"_index":845,"t":{"90":{"position":[[207,13]]},"122":{"position":[[2160,13],[2798,13]]},"307":{"position":[[562,13]]},"309":{"position":[[637,13]]}}}],["myjellyfinsourc",{"_index":2170,"t":{"374":{"position":[[986,19]]}}}],["myjriv",{"_index":1086,"t":{"120":{"position":[[340,11],[575,11]]}}}],["mykodi",{"_index":1133,"t":{"128":{"position":[[265,9],[522,9]]}}}],["mylastfm",{"_index":1564,"t":{"230":{"position":[[391,11]]},"232":{"position":[[1362,11]]},"319":{"position":[[86,11]]}}}],["mylastfmcli",{"_index":91,"t":{"9":{"position":[[1039,17]]},"17":{"position":[[534,17],[970,17]]},"43":{"position":[[458,17],[808,17]]}}}],["mylastfmsourc",{"_index":1151,"t":{"140":{"position":[[298,17],[648,17]]},"434":{"position":[[3765,17]]},"436":{"position":[[1712,17]]},"440":{"position":[[929,17]]}}}],["mylfm",{"_index":1147,"t":{"136":{"position":[[345,8],[531,8]]},"244":{"position":[[694,6]]},"311":{"position":[[646,8]]}}}],["mylibrefmcli",{"_index":569,"t":{"51":{"position":[[659,18],[963,18]]}}}],["mylibrefmsourc",{"_index":1152,"t":{"144":{"position":[[302,18],[606,18]]}}}],["mylz",{"_index":1169,"t":{"152":{"position":[[423,7],[610,7]]}}}],["mymaloja",{"_index":591,"t":{"55":{"position":[[202,9],[463,9]]},"160":{"position":[[296,9],[557,9]]}}}],["mymaloja\",\"koitoa\",\"listenbrainzfoo",{"_index":846,"t":{"90":{"position":[[232,39]]}}}],["mymalojakey",{"_index":238,"t":{"13":{"position":[[4781,13]]},"55":{"position":[[315,13],[576,13]]},"160":{"position":[[409,13],[670,13]]},"374":{"position":[[1228,13]]}}}],["mymb",{"_index":1618,"t":{"240":{"position":[[1095,6],[1410,6]]},"244":{"position":[[780,4]]},"272":{"position":[[277,7],[846,7]]},"274":{"position":[[197,7]]},"276":{"position":[[208,6],[509,6],[1094,7]]},"298":{"position":[[525,7]]},"300":{"position":[[722,7]]},"303":{"position":[[97,7],[344,6]]},"305":{"position":[[185,7],[657,6]]},"307":{"position":[[374,7],[679,7]]},"309":{"position":[[282,7],[878,6]]},"311":{"position":[[506,7],[782,7],[1099,7]]}}}],["mymopidi",{"_index":1201,"t":{"168":{"position":[[92,11],[345,11]]}}}],["mympd",{"_index":1245,"t":{"176":{"position":[[185,8],[451,8]]}}}],["mymultiscrobblertop",{"_index":253,"t":{"13":{"position":[[5074,24]]}}}],["myn",{"_index":1619,"t":{"240":{"position":[[1133,10],[1493,10]]}}}],["mynativetransform",{"_index":1592,"t":{"236":{"position":[[536,22],[912,21],[2051,22],[2427,22]]},"259":{"position":[[92,22],[469,21]]},"261":{"position":[[92,22],[368,21]]}}}],["myntfyfriendlynameforlog",{"_index":250,"t":{"13":{"position":[[5004,28]]},"31":{"position":[[1200,28]]}}}],["myoptionalslug",{"_index":1435,"t":{"216":{"position":[[425,17],[646,17]]}}}],["mypassword",{"_index":1135,"t":{"128":{"position":[[375,12],[632,12]]}}}],["myplexapi",{"_index":1274,"t":{"188":{"position":[[2282,12],[2828,12]]}}}],["myrockskycli",{"_index":678,"t":{"66":{"position":[[713,18],[979,18]]}}}],["myrockskysourc",{"_index":1258,"t":{"186":{"position":[[488,18],[754,18]]}}}],["mysite.com",{"_index":1957,"t":{"317":{"position":[[758,14],[800,14],[854,13]]}}}],["myslug",{"_index":1148,"t":{"136":{"position":[[388,8],[574,8]]}}}],["mysourc",{"_index":2030,"t":{"347":{"position":[[1377,8]]}}}],["myspotifi",{"_index":193,"t":{"13":{"position":[[2556,12]]},"192":{"position":[[259,12],[611,12]]},"311":{"position":[[983,12]]}}}],["myspotify1\",\"myjellyfin2",{"_index":102,"t":{"9":{"position":[[1333,28]]}}}],["myspotifysourc",{"_index":234,"t":{"13":{"position":[[4475,18]]}}}],["mysubson",{"_index":1345,"t":{"196":{"position":[[226,13],[518,13]]},"236":{"position":[[801,13],[1512,13],[2316,13]]},"254":{"position":[[291,13]]},"259":{"position":[[357,13]]},"261":{"position":[[256,13]]},"263":{"position":[[289,13]]},"276":{"position":[[91,13],[392,13],[977,13]]},"298":{"position":[[408,13]]},"300":{"position":[[591,13]]},"303":{"position":[[227,13]]},"305":{"position":[[540,13]]},"315":{"position":[[623,13]]}}}],["myteal",{"_index":704,"t":{"73":{"position":[[849,9],[1100,9]]}}}],["mytealsourc",{"_index":1368,"t":{"204":{"position":[[843,15],[1052,15],[1282,15],[1747,15],[2062,15]]}}}],["myth",{"_index":1630,"t":{"244":{"position":[[367,10]]}}}],["mytoken",{"_index":780,"t":{"77":{"position":[[3146,9]]},"79":{"position":[[1546,10]]},"152":{"position":[[466,9],[653,9]]}}}],["myurl",{"_index":2519,"t":{"442":{"position":[[1837,5]]}}}],["myuser",{"_index":1134,"t":{"128":{"position":[[353,9],[610,9]]},"374":{"position":[[1106,8]]},"442":{"position":[[1630,7]]}}}],["myuser.bsky.soci",{"_index":675,"t":{"66":{"position":[[579,18]]},"73":{"position":[[727,18]]}}}],["myvlc",{"_index":1395,"t":{"206":{"position":[[1609,8],[2404,8]]},"208":{"position":[[186,8],[403,8]]},"236":{"position":[[1695,8]]}}}],["mywebscrobbl",{"_index":1434,"t":{"216":{"position":[[389,17],[610,17]]}}}],["myyamaha",{"_index":1445,"t":{"220":{"position":[[172,11],[367,11]]}}}],["myytm",{"_index":1465,"t":{"222":{"position":[[1069,8],[2616,8],[3845,8]]},"420":{"position":[[1553,8],[1740,6],[2388,8]]}}}],["myytm.log",{"_index":2457,"t":{"420":{"position":[[2547,9]]}}}],["myytmus",{"_index":1532,"t":{"224":{"position":[[399,12],[756,12]]}}}],["n+1",{"_index":2426,"t":{"420":{"position":[[788,3]]}}}],["naiv",{"_index":1826,"t":{"282":{"position":[[4098,5],[4131,5],[5125,5],[5131,7],[5417,5],[5830,5],[5903,7]]}}}],["name",{"_index":12,"t":{"4":{"position":[[0,4]]},"9":{"position":[[829,5],[862,4],[1031,7],[1199,5]]},"13":{"position":[[2312,5],[2548,7],[4467,7],[4708,7],[4818,7],[4996,7]]},"17":{"position":[[457,5],[526,7],[962,7],[1532,5],[1576,5],[1678,4],[1748,5],[1800,5],[1865,4]]},"23":{"position":[[2684,4]]},"31":{"position":[[418,7],[522,7],[581,7],[841,7],[1192,7],[1575,7]]},"33":{"position":[[356,4]]},"37":{"position":[[251,7],[542,7]]},"43":{"position":[[450,7],[800,7]]},"51":{"position":[[651,7],[955,7]]},"55":{"position":[[194,7],[455,7]]},"59":{"position":[[273,7],[584,7]]},"66":{"position":[[705,7],[971,7]]},"73":{"position":[[841,7],[1092,7]]},"77":{"position":[[944,7],[1200,7],[1446,7],[1702,7],[1872,7],[2168,7],[2404,7],[2672,7],[2842,7],[3072,7],[3196,7],[3314,7],[3432,7],[3550,7]]},"79":{"position":[[108,7],[243,7],[378,7],[549,7],[703,7],[889,7],[1046,7],[1234,7],[1472,7],[1590,7],[1690,7],[1790,7],[1916,7]]},"83":{"position":[[0,4]]},"90":{"position":[[126,4],[199,7],[493,5],[549,4],[620,4]]},"98":{"position":[[107,4],[139,4],[417,7],[496,6],[701,7],[780,6]]},"102":{"position":[[500,4],[729,5]]},"104":{"position":[[157,7],[460,7]]},"106":{"position":[[295,7]]},"108":{"position":[[2258,6],[2293,7],[2372,4],[2760,5],[2825,7],[3484,7]]},"110":{"position":[[668,7],[911,7]]},"112":{"position":[[1818,7]]},"114":{"position":[[130,7],[327,7]]},"120":{"position":[[332,7],[567,7]]},"122":{"position":[[264,4],[2152,7],[2790,7]]},"128":{"position":[[257,7],[514,7]]},"130":{"position":[[670,7],[961,7]]},"136":{"position":[[337,7],[523,7]]},"140":{"position":[[290,7],[640,7]]},"144":{"position":[[294,7],[598,7]]},"152":{"position":[[415,7],[602,7]]},"156":{"position":[[311,7],[622,7]]},"160":{"position":[[288,7],[549,7]]},"166":{"position":[[124,5],[218,4]]},"168":{"position":[[84,7],[337,7]]},"172":{"position":[[217,5],[295,5],[383,7],[611,7]]},"176":{"position":[[177,7],[443,7]]},"180":{"position":[[241,7],[491,7]]},"186":{"position":[[480,7],[746,7]]},"188":{"position":[[2274,7],[2820,7]]},"192":{"position":[[251,7],[603,7]]},"196":{"position":[[218,7],[510,7]]},"204":{"position":[[259,4],[835,7],[1044,7],[1274,7],[1739,7],[2054,7]]},"206":{"position":[[1338,5],[1601,7],[2111,4],[2191,4],[2396,7]]},"208":{"position":[[178,7],[395,7]]},"210":{"position":[[218,5]]},"212":{"position":[[183,7],[267,7]]},"214":{"position":[[89,4]]},"216":{"position":[[381,7],[602,7]]},"220":{"position":[[164,7],[359,7]]},"222":{"position":[[1061,7],[2224,4],[2608,7],[3837,7]]},"224":{"position":[[391,7],[748,7]]},"230":{"position":[[383,7]]},"232":{"position":[[1354,7]]},"236":{"position":[[152,4],[166,4],[528,7],[793,7],[904,7],[942,6],[1208,7],[1328,7],[1504,7],[1615,7],[1687,7],[1793,7],[2043,7],[2308,7],[2419,7]]},"240":{"position":[[1087,7],[1125,7],[1402,7],[1485,7]]},"244":{"position":[[359,7]]},"248":{"position":[[389,5],[449,4]]},"254":{"position":[[197,4],[283,7],[413,5]]},"259":{"position":[[84,7],[349,7],[461,7]]},"261":{"position":[[84,7],[248,7],[360,7]]},"263":{"position":[[281,7]]},"272":{"position":[[269,7],[838,7]]},"274":{"position":[[189,7]]},"276":{"position":[[83,7],[200,7],[384,7],[501,7],[969,7],[1086,7]]},"282":{"position":[[3570,4]]},"287":{"position":[[1290,4]]},"289":{"position":[[1490,5],[1507,5],[1744,4],[2184,5],[2201,6]]},"292":{"position":[[265,6]]},"298":{"position":[[400,7],[517,7]]},"300":{"position":[[583,7],[714,7]]},"303":{"position":[[89,7],[219,7],[336,7]]},"305":{"position":[[177,7],[532,7],[649,7]]},"307":{"position":[[366,7],[554,7],[671,7]]},"309":{"position":[[274,7],[629,7],[870,7]]},"311":{"position":[[498,7],[638,7],[774,7],[975,7],[1091,7]]},"313":{"position":[[368,5]]},"315":{"position":[[235,7],[529,4],[615,7],[743,5]]},"319":{"position":[[78,7]]},"345":{"position":[[177,5]]},"368":{"position":[[507,4]]},"370":{"position":[[375,4],[706,4],[1088,4]]},"374":{"position":[[978,7],[1155,7]]},"385":{"position":[[733,5]]},"387":{"position":[[895,5]]},"402":{"position":[[1607,4],[1848,4],[1985,4]]},"420":{"position":[[1545,7],[2380,7],[2533,5],[2579,6]]},"432":{"position":[[286,4]]},"434":{"position":[[3519,5],[3757,7]]},"436":{"position":[[1704,7]]},"440":{"position":[[921,7]]},"452":{"position":[[282,5],[379,5]]},"454":{"position":[[203,5]]},"473":{"position":[[157,4]]}}}],["name=[nameofsourc",{"_index":1506,"t":{"222":{"position":[[3660,19]]}}}],["names/interpol",{"_index":292,"t":{"17":{"position":[[1197,19]]}}}],["name}.json",{"_index":2031,"t":{"347":{"position":[[1386,13]]}}}],["nash",{"_index":1716,"t":{"261":{"position":[[165,4]]}}}],["nativ",{"_index":1585,"t":{"234":{"position":[[242,6],[665,8]]},"236":{"position":[[518,9],[895,8],[982,8],[1198,9],[1318,9],[1606,8],[1784,8],[2033,9],[2410,8]]},"238":{"position":[[185,9]]},"240":{"position":[[1006,6],[1044,6],[1115,9],[1303,7],[1323,6],[1475,9]]},"242":{"position":[[1245,6],[1303,9],[1428,6],[1502,6],[1585,9]]},"246":{"position":[[79,6]]},"248":{"position":[[4,6],[670,6]]},"250":{"position":[[1073,6]]},"252":{"position":[[136,9]]},"254":{"position":[[47,6],[385,9],[431,6]]},"256":{"position":[[849,6]]},"259":{"position":[[74,9],[451,9]]},"261":{"position":[[74,9],[350,9]]},"263":{"position":[[383,9]]},"278":{"position":[[665,6],[709,6],[1727,7]]},"282":{"position":[[4032,8],[4088,6],[4110,6],[4137,6],[4144,8],[4198,6],[4372,6],[4466,6],[5040,6],[5114,8]]},"292":{"position":[[670,6],[1158,8]]},"305":{"position":[[427,8]]},"309":{"position":[[99,6],[137,6],[524,9],[771,7],[791,6],[943,8]]},"311":{"position":[[812,8]]},"374":{"position":[[424,6]]}}}],["navidrom",{"_index":1156,"t":{"148":{"position":[[386,10]]},"194":{"position":[[139,10],[406,11]]},"430":{"position":[[327,10]]},"434":{"position":[[113,9],[1321,9],[1580,9],[2011,10],[2126,9],[2307,9],[2411,10]]},"436":{"position":[[913,9]]},"440":{"position":[[130,9]]},"448":{"position":[[422,10]]},"452":{"position":[[219,10]]}}}],["navidrome'",{"_index":2496,"t":{"434":{"position":[[1430,11]]}}}],["navig",{"_index":486,"t":{"35":{"position":[[208,8]]},"41":{"position":[[195,8],[296,10]]},"47":{"position":[[195,8],[296,10]]},"53":{"position":[[325,8]]},"63":{"position":[[108,8],[182,8]]},"70":{"position":[[65,8]]},"122":{"position":[[108,8]]},"190":{"position":[[691,8],[913,8],[3311,8]]},"206":{"position":[[535,10]]},"222":{"position":[[2117,8]]},"442":{"position":[[509,8],[1379,8]]}}}],["nd_listenbrainz_baseurl",{"_index":1158,"t":{"148":{"position":[[431,24]]},"434":{"position":[[2056,24]]}}}],["nd_listenbrainz_baseurl=http://192.168.0.100:9078/1",{"_index":2499,"t":{"434":{"position":[[2246,52]]}}}],["nearli",{"_index":2414,"t":{"414":{"position":[[599,6]]}}}],["necessari",{"_index":1094,"t":{"122":{"position":[[683,9]]},"190":{"position":[[1002,9]]},"222":{"position":[[1822,10]]},"240":{"position":[[807,9]]},"347":{"position":[[1719,10]]}}}],["necessarili",{"_index":2317,"t":{"393":{"position":[[1327,11]]}}}],["need",{"_index":171,"t":{"13":{"position":[[1727,4],[3410,4]]},"21":{"position":[[414,4]]},"27":{"position":[[14,4]]},"39":{"position":[[227,4]]},"45":{"position":[[149,4],[277,6]]},"57":{"position":[[244,4]]},"61":{"position":[[1788,4]]},"63":{"position":[[9,4]]},"77":{"position":[[1297,4],[2029,4]]},"96":{"position":[[611,4]]},"110":{"position":[[222,7]]},"116":{"position":[[262,4]]},"124":{"position":[[251,4]]},"134":{"position":[[206,4]]},"148":{"position":[[516,4]]},"154":{"position":[[343,4]]},"172":{"position":[[143,4]]},"188":{"position":[[379,4]]},"204":{"position":[[277,4]]},"216":{"position":[[130,7]]},"222":{"position":[[531,5],[3299,4],[4178,4],[4639,4]]},"226":{"position":[[241,4]]},"232":{"position":[[836,4]]},"282":{"position":[[1296,6]]},"300":{"position":[[355,6],[417,4]]},"347":{"position":[[960,6],[2327,5]]},"378":{"position":[[138,4]]},"387":{"position":[[104,4]]},"393":{"position":[[680,4],[1339,4]]},"398":{"position":[[1391,4]]},"402":{"position":[[1805,4]]},"420":{"position":[[112,5]]},"436":{"position":[[287,5]]},"438":{"position":[[20,5]]},"448":{"position":[[1499,4]]},"452":{"position":[[297,6]]},"454":{"position":[[218,6]]},"462":{"position":[[234,4]]}}}],["network",{"_index":618,"t":{"61":{"position":[[522,8]]},"68":{"position":[[604,8]]},"73":{"position":[[780,7]]},"83":{"position":[[5,10]]},"86":{"position":[[203,7]]},"116":{"position":[[161,7],[185,7]]},"118":{"position":[[485,7]]},"170":{"position":[[1362,7],[1418,7]]},"210":{"position":[[676,7]]},"347":{"position":[[366,7],[901,9],[2779,7]]},"368":{"position":[[1221,10],[1282,7],[1346,10],[1999,11],[2037,7],[2569,7]]},"402":{"position":[[1331,8],[2296,7]]},"448":{"position":[[995,7]]}}}],["network/usb/cd",{"_index":1437,"t":{"218":{"position":[[55,14]]}}}],["network/your",{"_index":681,"t":{"68":{"position":[[196,12]]},"198":{"position":[[168,12]]}}}],["never",{"_index":42,"t":{"7":{"position":[[332,5]]},"94":{"position":[[781,5]]},"96":{"position":[[1447,5]]},"112":{"position":[[1208,5]]},"287":{"position":[[1695,5]]}}}],["new",{"_index":490,"t":{"35":{"position":[[269,3]]},"53":{"position":[[448,3]]},"70":{"position":[[176,3]]},"86":{"position":[[1309,3]]},"122":{"position":[[247,3]]},"138":{"position":[[68,3]]},"142":{"position":[[69,3]]},"190":{"position":[[4048,3]]},"222":{"position":[[1333,3],[1842,3],[1952,3]]},"228":{"position":[[192,3],[232,3]]},"232":{"position":[[1468,5],[1563,3]]},"276":{"position":[[1208,3]]},"341":{"position":[[418,3]]},"378":{"position":[[73,3]]},"380":{"position":[[34,3]]},"383":{"position":[[17,3],[138,3],[1160,3],[1897,3]]},"385":{"position":[[18,3]]},"387":{"position":[[1066,3],[1338,3]]},"391":{"position":[[581,3],[948,3],[1101,3],[1230,3],[2588,3]]},"393":{"position":[[2840,3]]},"396":{"position":[[1070,3]]},"398":{"position":[[726,3],[1039,4],[1841,3],[2688,3],[2911,5]]},"402":{"position":[[473,3]]},"406":{"position":[[1193,3]]},"420":{"position":[[357,3],[705,3],[815,3],[2985,3]]},"424":{"position":[[9,3]]},"426":{"position":[[162,3]]},"432":{"position":[[9,3]]},"434":{"position":[[1696,3],[2917,3],[3510,3]]},"442":{"position":[[635,3],[1440,3]]},"450":{"position":[[124,3]]},"471":{"position":[[196,3]]}}}],["newli",{"_index":1491,"t":{"222":{"position":[[2452,5]]},"393":{"position":[[763,7]]}}}],["newplay",{"_index":2333,"t":{"393":{"position":[[2760,8],[2775,8],[2971,9]]}}}],["newsourc",{"_index":2253,"t":{"387":{"position":[[1219,10],[1320,9]]}}}],["next",{"_index":866,"t":{"94":{"position":[[438,4]]},"96":{"position":[[1123,4]]},"112":{"position":[[886,4]]},"240":{"position":[[55,4],[706,4]]},"282":{"position":[[809,4]]},"370":{"position":[[277,4]]},"391":{"position":[[0,4]]},"398":{"position":[[1880,4]]}}}],["nginx/traefik/caddi",{"_index":1295,"t":{"190":{"position":[[1578,21]]}}}],["nice",{"_index":1544,"t":{"226":{"position":[[797,4]]}}}],["nightmar",{"_index":2447,"t":{"420":{"position":[[1968,10]]}}}],["node",{"_index":1987,"t":{"339":{"position":[[21,4],[165,4],[365,4]]},"355":{"position":[[48,4]]},"362":{"position":[[125,4],[305,4],[483,4]]},"374":{"position":[[188,4],[498,4],[572,6],[856,4]]}}}],["node/npm",{"_index":1208,"t":{"170":{"position":[[545,9]]}}}],["node@^4.9.6",{"_index":2167,"t":{"374":{"position":[[649,12]]}}}],["node_modul",{"_index":2080,"t":{"362":{"position":[[178,12]]}}}],["nodej",{"_index":1008,"t":{"108":{"position":[[1513,6]]},"448":{"position":[[1232,6]]}}}],["noisi",{"_index":417,"t":{"25":{"position":[[267,5]]}}}],["non",{"_index":671,"t":{"66":{"position":[[252,3]]},"73":{"position":[[343,3]]},"162":{"position":[[85,3]]},"248":{"position":[[217,3]]},"289":{"position":[[2053,3]]},"294":{"position":[[310,3]]},"398":{"position":[[1135,3]]},"414":{"position":[[349,3]]}}}],["none",{"_index":308,"t":{"17":{"position":[[1641,4]]},"96":{"position":[[531,4]]},"118":{"position":[[758,5]]},"126":{"position":[[748,5]]},"162":{"position":[[1059,5]]},"238":{"position":[[927,4]]},"244":{"position":[[868,6]]},"402":{"position":[[845,8]]}}}],["normal",{"_index":1462,"t":{"222":{"position":[[942,6]]},"294":{"position":[[160,10],[314,6]]},"315":{"position":[[243,13]]},"391":{"position":[[487,6],[1341,11]]}}}],["normalizeprotocol",{"_index":2280,"t":{"391":{"position":[[543,18]]}}}],["normalizeurl(v",{"_index":2278,"t":{"391":{"position":[[496,17]]}}}],["note",{"_index":495,"t":{"35":{"position":[[416,4]]},"39":{"position":[[490,4]]},"63":{"position":[[48,4]]},"90":{"position":[[294,4],[423,4]]},"94":{"position":[[0,4]]},"108":{"position":[[150,4],[388,4]]},"110":{"position":[[13,4]]},"112":{"position":[[73,4]]},"130":{"position":[[416,4]]},"140":{"position":[[29,4]]},"144":{"position":[[29,4]]},"148":{"position":[[697,4]]},"156":{"position":[[29,4]]},"160":{"position":[[29,4]]},"162":{"position":[[260,4]]},"186":{"position":[[218,4]]},"188":{"position":[[30,4]]},"204":{"position":[[1478,4]]},"214":{"position":[[182,4]]},"238":{"position":[[1032,4]]},"280":{"position":[[0,4]]},"282":{"position":[[7002,4]]},"319":{"position":[[387,4]]},"398":{"position":[[3888,4]]},"430":{"position":[[441,4]]},"434":{"position":[[2528,4],[3450,4]]},"436":{"position":[[267,4]]},"438":{"position":[[0,4]]},"442":{"position":[[1587,4]]},"471":{"position":[[380,6]]}}}],["notic",{"_index":1560,"t":{"230":{"position":[[7,6]]}}}],["notif",{"_index":437,"t":{"31":{"position":[[21,12],[745,12],[1098,12]]},"170":{"position":[[123,12]]},"341":{"position":[[360,12]]},"446":{"position":[[314,12]]}}}],["now",{"_index":13,"t":{"4":{"position":[[5,3]]},"9":{"position":[[119,3],[146,3],[260,3],[283,3],[466,3],[936,3],[1238,3],[1305,3]]},"96":{"position":[[272,3]]},"206":{"position":[[657,3]]},"222":{"position":[[2383,3],[2799,4]]},"364":{"position":[[69,3]]},"383":{"position":[[1876,3],[2140,3]]},"389":{"position":[[0,3]]},"393":{"position":[[3063,3]]},"426":{"position":[[286,3]]},"444":{"position":[[283,3],[565,3]]},"448":{"position":[[796,3]]}}}],["now_playing=fals",{"_index":64,"t":{"9":{"position":[[372,17]]}}}],["now_playing=tru",{"_index":63,"t":{"9":{"position":[[352,16]]}}}],["nowplay",{"_index":95,"t":{"9":{"position":[[1136,15],[1317,15]]}}}],["npm",{"_index":149,"t":{"13":{"position":[[1119,3]]},"339":{"position":[[412,3],[424,3]]},"341":{"position":[[387,3]]},"362":{"position":[[320,3],[498,3]]},"374":{"position":[[201,3],[213,3],[237,3],[251,3],[1251,3]]}}}],["npm:@rollup/wasm",{"_index":2166,"t":{"374":{"position":[[631,17]]}}}],["ntfi",{"_index":249,"t":{"13":{"position":[[4988,7]]},"31":{"position":[[614,7],[998,5],[1184,7]]},"448":{"position":[[748,5]]}}}],["ntfyconfig",{"_index":451,"t":{"31":{"position":[[1035,10]]}}}],["ntfyserveron",{"_index":445,"t":{"31":{"position":[[589,16]]}}}],["null",{"_index":2018,"t":{"347":{"position":[[491,4]]},"391":{"position":[[615,4],[857,4],[1004,4]]}}}],["number",{"_index":28,"t":{"7":{"position":[[142,6]]},"17":{"position":[[1323,8]]},"118":{"position":[[423,6]]},"126":{"position":[[417,6]]},"162":{"position":[[794,6]]},"226":{"position":[[329,6]]},"393":{"position":[[2131,6]]}}}],["numer",{"_index":1841,"t":{"285":{"position":[[46,7]]}}}],["nvm",{"_index":1990,"t":{"339":{"position":[[137,3],[332,3]]},"374":{"position":[[153,3]]}}}],["o",{"_index":2069,"t":{"360":{"position":[[263,1],[302,1]]},"420":{"position":[[2079,1]]}}}],["oauth",{"_index":1452,"t":{"222":{"position":[[557,5],[1369,5],[1549,5],[1893,5],[2170,6],[2893,5],[3174,5],[3786,5]]},"224":{"position":[[159,5],[218,5],[284,5]]},"406":{"position":[[409,6],[427,5]]}}}],["obj",{"_index":2265,"t":{"389":{"position":[[407,5],[750,4]]}}}],["object",{"_index":299,"t":{"17":{"position":[[1342,8]]},"232":{"position":[[1153,6]]},"236":{"position":[[236,6],[321,6]]},"238":{"position":[[167,7],[874,6]]},"242":{"position":[[66,6],[117,6],[606,6],[784,6],[1117,7]]},"244":{"position":[[84,6]]},"317":{"position":[[336,6]]},"345":{"position":[[197,6],[214,6]]},"396":{"position":[[939,6]]}}}],["object.values(cp).every(x",{"_index":2247,"t":{"387":{"position":[[809,27]]}}}],["obscur",{"_index":1746,"t":{"265":{"position":[[1030,8]]},"267":{"position":[[427,8]]}}}],["obtain",{"_index":661,"t":{"63":{"position":[[230,6]]},"66":{"position":[[622,8]]},"222":{"position":[[665,6]]}}}],["occasion",{"_index":2551,"t":{"471":{"position":[[218,12]]}}}],["occur",{"_index":78,"t":{"9":{"position":[[631,5]]},"244":{"position":[[56,6]]},"347":{"position":[[2815,8]]},"396":{"position":[[1087,8]]},"420":{"position":[[371,6],[914,5],[2682,9],[3259,8]]}}}],["occurr",{"_index":1924,"t":{"294":{"position":[[398,10]]}}}],["off",{"_index":957,"t":{"106":{"position":[[450,5]]}}}],["offici",{"_index":550,"t":{"45":{"position":[[113,8]]},"49":{"position":[[25,8]]},"57":{"position":[[311,8]]},"154":{"position":[[410,8]]},"274":{"position":[[305,13]]},"287":{"position":[[356,8],[683,9],[1410,10],[1443,12]]},"289":{"position":[[860,10],[926,12]]},"292":{"position":[[386,8],[447,13],[799,8],[860,13]]},"305":{"position":[[295,13]]},"309":{"position":[[392,13]]},"406":{"position":[[768,8]]},"412":{"position":[[189,8]]}}}],["offlin",{"_index":2066,"t":{"360":{"position":[[64,7]]},"434":{"position":[[1516,7]]}}}],["ogg",{"_index":1065,"t":{"112":{"position":[[1917,6],[2131,4]]}}}],["ok",{"_index":468,"t":{"33":{"position":[[128,2]]},"398":{"position":[[2997,2]]},"420":{"position":[[758,4]]}}}],["okay",{"_index":1853,"t":{"287":{"position":[[415,4]]}}}],["old",{"_index":1482,"t":{"222":{"position":[[1922,3]]}}}],["omit",{"_index":764,"t":{"77":{"position":[[2192,8],[2428,8]]},"79":{"position":[[35,4]]},"90":{"position":[[341,7]]},"254":{"position":[[184,8]]},"315":{"position":[[516,8]]},"452":{"position":[[424,7]]}}}],["on",{"_index":112,"t":{"13":{"position":[[123,3],[278,3],[580,3],[604,3],[1606,3],[2804,3],[3289,3]]},"21":{"position":[[211,3]]},"27":{"position":[[330,3]]},"70":{"position":[[61,3]]},"77":{"position":[[1302,3]]},"92":{"position":[[45,3]]},"102":{"position":[[229,3]]},"190":{"position":[[1224,3]]},"194":{"position":[[196,3],[485,4]]},"204":{"position":[[309,3]]},"206":{"position":[[1493,3]]},"222":{"position":[[510,3],[2059,3]]},"232":{"position":[[999,3]]},"234":{"position":[[24,3]]},"248":{"position":[[464,3]]},"250":{"position":[[1158,3],[1330,3]]},"254":{"position":[[117,3]]},"272":{"position":[[487,3]]},"278":{"position":[[354,3],[434,3]]},"282":{"position":[[1160,3],[1188,3],[3665,3],[5221,3],[6784,3]]},"289":{"position":[[661,3],[2367,3],[2770,3]]},"294":{"position":[[624,3]]},"315":{"position":[[483,3]]},"332":{"position":[[172,3],[216,3],[559,3],[624,4]]},"368":{"position":[[2626,3]]},"383":{"position":[[1069,3]]},"412":{"position":[[71,3]]},"434":{"position":[[3133,3]]},"448":{"position":[[1714,3]]},"450":{"position":[[30,3],[54,3]]}}}],["onc",{"_index":996,"t":{"108":{"position":[[1200,4]]},"222":{"position":[[4537,4]]},"436":{"position":[[309,4]]},"438":{"position":[[42,4]]}}}],["one/mi",{"_index":1974,"t":{"332":{"position":[[459,6]]}}}],["onfailur",{"_index":1611,"t":{"240":{"position":[[324,9],[1367,11],[1438,12]]},"282":{"position":[[7098,11]]},"309":{"position":[[835,11],[906,12]]}}}],["onlin",{"_index":900,"t":{"98":{"position":[[224,6]]}}}],["onskip",{"_index":1613,"t":{"240":{"position":[[458,6]]},"242":{"position":[[474,9]]}}}],["onsuccess",{"_index":1610,"t":{"240":{"position":[[247,9],[1417,12]]},"309":{"position":[[885,12]]}}}],["open",{"_index":392,"t":{"23":{"position":[[3035,4]]},"86":{"position":[[509,4]]},"102":{"position":[[331,4],[599,4]]},"108":{"position":[[262,4]]},"206":{"position":[[86,4]]},"210":{"position":[[44,4]]},"341":{"position":[[298,4]]},"347":{"position":[[1880,4]]},"402":{"position":[[2267,5],[2369,4]]},"428":{"position":[[0,4]]},"448":{"position":[[1540,4]]}}}],["oper",{"_index":1203,"t":{"170":{"position":[[76,9],[335,9]]},"343":{"position":[[385,8],[490,8]]},"345":{"position":[[278,7]]},"347":{"position":[[988,8]]},"393":{"position":[[46,7],[160,7]]}}}],["opinion",{"_index":1724,"t":{"265":{"position":[[347,8]]},"292":{"position":[[283,11]]}}}],["oppos",{"_index":1888,"t":{"289":{"position":[[1300,7]]},"380":{"position":[[965,7]]},"402":{"position":[[168,7]]}}}],["option",{"_index":94,"t":{"9":{"position":[[1102,10]]},"13":{"position":[[3539,7],[3585,7],[5111,11],[5135,11]]},"15":{"position":[[43,7]]},"19":{"position":[[6,7]]},"23":{"position":[[203,9]]},"25":{"position":[[51,8],[72,7]]},"31":{"position":[[709,10],[1062,10],[1306,11],[1330,11]]},"51":{"position":[[200,8],[244,8]]},"77":{"position":[[69,9],[207,9],[371,9],[582,9],[746,9],[1076,10]]},"92":{"position":[[341,7],[416,10]]},"94":{"position":[[633,7],[701,10]]},"96":{"position":[[1299,7],[1367,10]]},"106":{"position":[[215,6],[360,10],[421,6]]},"108":{"position":[[3543,10]]},"112":{"position":[[1062,7],[1128,10],[2000,7]]},"116":{"position":[[144,7]]},"118":{"position":[[493,8]]},"122":{"position":[[2334,8],[2619,10],[3239,10]]},"136":{"position":[[231,10]]},"152":{"position":[[311,10]]},"172":{"position":[[158,8]]},"176":{"position":[[262,10],[528,10]]},"188":{"position":[[2605,10],[3151,10]]},"194":{"position":[[643,8]]},"206":{"position":[[782,8],[1654,10],[2449,10]]},"222":{"position":[[1146,10],[2736,10],[4039,10]]},"224":{"position":[[593,10],[950,10]]},"230":{"position":[[464,10]]},"232":{"position":[[1381,10]]},"234":{"position":[[677,9]]},"236":{"position":[[837,10],[1548,10],[1726,10],[2352,10]]},"240":{"position":[[14,10],[924,10],[1205,10]]},"244":{"position":[[397,10]]},"250":{"position":[[657,7]]},"254":{"position":[[327,10]]},"259":{"position":[[393,10]]},"261":{"position":[[292,10]]},"263":{"position":[[325,10]]},"276":{"position":[[127,10],[428,10],[1013,10]]},"280":{"position":[[46,9]]},"282":{"position":[[1501,6],[3811,10],[4044,8]]},"292":{"position":[[64,8]]},"298":{"position":[[444,10]]},"300":{"position":[[627,10]]},"303":{"position":[[263,10]]},"305":{"position":[[576,10]]},"307":{"position":[[598,10]]},"309":{"position":[[673,10]]},"311":{"position":[[701,10],[1018,10]]},"315":{"position":[[659,10]]},"319":{"position":[[143,10]]},"339":{"position":[[342,9]]},"345":{"position":[[204,9],[350,7],[362,8]]},"349":{"position":[[283,8]]},"368":{"position":[[1236,9],[2286,8],[2445,11],[2994,12]]},"370":{"position":[[893,7]]},"374":{"position":[[163,9]]},"387":{"position":[[247,7]]},"389":{"position":[[631,8]]},"396":{"position":[[681,9]]},"420":{"position":[[1505,7],[1579,10],[2214,11],[2351,7],[2414,10]]},"434":{"position":[[1642,7],[2779,9]]},"436":{"position":[[200,9],[1899,10]]},"440":{"position":[[1116,10]]},"444":{"position":[[500,7]]},"446":{"position":[[25,7]]},"452":{"position":[[355,8]]},"462":{"position":[[75,7]]}}}],["order",{"_index":100,"t":{"9":{"position":[[1253,5]]},"29":{"position":[[76,5]]},"108":{"position":[[116,5]]},"116":{"position":[[3,5]]},"124":{"position":[[3,5]]},"178":{"position":[[3,5]]},"190":{"position":[[2014,5]]},"222":{"position":[[2067,5]]},"282":{"position":[[1049,5],[1130,5],[1231,5],[1475,5],[1603,5]]},"289":{"position":[[732,5]]},"337":{"position":[[339,5]]},"347":{"position":[[306,5],[2401,5]]},"368":{"position":[[2108,5]]},"393":{"position":[[289,5]]},"420":{"position":[[30,5]]},"436":{"position":[[75,5]]}}}],["organ",{"_index":1834,"t":{"282":{"position":[[6328,9],[6430,9]]},"298":{"position":[[102,9]]}}}],["origin",{"_index":1353,"t":{"204":{"position":[[186,11]]},"222":{"position":[[2282,7]]},"244":{"position":[[148,8],[289,8],[537,8],[757,8],[814,9],[907,9],[962,9]]},"265":{"position":[[1254,10]]},"269":{"position":[[158,10]]},"278":{"position":[[891,8]]},"289":{"position":[[1152,8],[1278,8],[1585,8],[2229,8],[2309,8]]},"311":{"position":[[159,8],[1206,8]]},"420":{"position":[[1845,10],[1935,10],[2035,10],[2118,10]]}}}],["os",{"_index":983,"t":{"108":{"position":[[965,2]]}}}],["os/contain",{"_index":122,"t":{"13":{"position":[[367,12]]}}}],["other",{"_index":2539,"t":{"448":{"position":[[1789,6]]}}}],["otherwis",{"_index":848,"t":{"90":{"position":[[601,10]]},"96":{"position":[[601,9]]},"240":{"position":[[405,9]]},"368":{"position":[[1711,10]]},"389":{"position":[[505,9]]}}}],["out",{"_index":269,"t":{"17":{"position":[[199,3]]},"75":{"position":[[739,4]]},"148":{"position":[[937,3]]},"222":{"position":[[1988,3]]},"289":{"position":[[437,3]]},"296":{"position":[[139,3]]},"409":{"position":[[405,3]]},"446":{"position":[[342,3]]}}}],["outcom",{"_index":1608,"t":{"240":{"position":[[122,7]]}}}],["output",{"_index":413,"t":{"25":{"position":[[111,6],[163,6]]},"108":{"position":[[3121,6],[3328,6]]},"206":{"position":[[2300,6]]},"244":{"position":[[141,6],[182,6],[282,6],[323,6],[484,6]]},"347":{"position":[[642,6]]},"402":{"position":[[1557,6]]},"414":{"position":[[516,6]]},"462":{"position":[[121,6]]}}}],["outsid",{"_index":528,"t":{"39":{"position":[[134,7]]},"57":{"position":[[132,7]]},"132":{"position":[[61,7]]},"138":{"position":[[199,7]]},"146":{"position":[[61,7]]},"154":{"position":[[231,7]]},"190":{"position":[[2946,8]]},"210":{"position":[[657,7]]}}}],["outta",{"_index":2449,"t":{"420":{"position":[[2012,5]]}}}],["over",{"_index":1219,"t":{"170":{"position":[[1355,4]]},"265":{"position":[[698,4]]},"267":{"position":[[95,4]]},"289":{"position":[[880,4],[974,4]]},"292":{"position":[[403,4],[816,4]]},"296":{"position":[[50,4],[349,4]]},"393":{"position":[[1238,4]]},"448":{"position":[[1279,4]]}}}],["overrid",{"_index":330,"t":{"21":{"position":[[312,8]]},"25":{"position":[[27,8]]},"77":{"position":[[1116,8]]},"122":{"position":[[885,8]]},"172":{"position":[[324,9]]},"188":{"position":[[536,10],[1517,8]]},"236":{"position":[[1825,10],[2453,9]]},"276":{"position":[[835,8],[1150,8]]},"311":{"position":[[291,9]]},"374":{"position":[[452,9],[540,12]]}}}],["overridden",{"_index":730,"t":{"77":{"position":[[136,10],[300,10],[488,10],[675,10],[863,10]]},"236":{"position":[[1907,10]]}}}],["overriden/ad",{"_index":1776,"t":{"276":{"position":[[895,15]]}}}],["overview",{"_index":686,"t":{"68":{"position":[[1536,8]]}}}],["overwrit",{"_index":2073,"t":{"360":{"position":[[318,9]]}}}],["own",{"_index":2132,"t":{"368":{"position":[[3239,4]]}}}],["p",{"_index":1310,"t":{"190":{"position":[[2744,1]]},"368":{"position":[[2311,1]]},"370":{"position":[[631,1],[786,1]]},"424":{"position":[[77,1]]}}}],["packag",{"_index":995,"t":{"108":{"position":[[1159,7]]},"362":{"position":[[324,7]]},"368":{"position":[[114,8]]}}}],["package.json",{"_index":2161,"t":{"374":{"position":[[465,12]]}}}],["page",{"_index":593,"t":{"57":{"position":[[345,4]]},"98":{"position":[[164,4]]},"154":{"position":[[445,4]]},"190":{"position":[[3074,4],[4121,5]]},"368":{"position":[[134,4],[190,4]]},"398":{"position":[[3192,5]]},"462":{"position":[[9,4],[348,6],[372,4]]},"471":{"position":[[419,4]]}}}],["pan",{"_index":1719,"t":{"261":{"position":[[188,4]]}}}],["pandora",{"_index":1041,"t":{"110":{"position":[[539,7]]},"162":{"position":[[114,8]]},"414":{"position":[[147,8]]}}}],["pane",{"_index":931,"t":{"102":{"position":[[558,5]]}}}],["panel",{"_index":581,"t":{"53":{"position":[[347,5]]},"442":{"position":[[531,5]]}}}],["param",{"_index":476,"t":{"33":{"position":[[341,6]]}}}],["paramet",{"_index":1843,"t":{"285":{"position":[[104,11]]}}}],["pars",{"_index":114,"t":{"13":{"position":[[152,5],[322,5],[1141,5],[2788,5]]},"108":{"position":[[515,6]]},"112":{"position":[[0,5],[279,7],[323,5],[1673,7]]},"206":{"position":[[993,8],[2069,7]]},"347":{"position":[[849,5],[1079,5]]},"391":{"position":[[235,5],[1251,5],[2553,5]]},"409":{"position":[[124,7],[271,6]]}}}],["parseconnectionurl(v",{"_index":2277,"t":{"391":{"position":[[447,23]]}}}],["parsedconfig",{"_index":2241,"t":{"387":{"position":[[472,14],[1158,13]]}}}],["part",{"_index":277,"t":{"17":{"position":[[359,4]]},"118":{"position":[[226,4],[324,4]]},"126":{"position":[[222,4],[320,4]]},"162":{"position":[[579,4],[677,4]]},"222":{"position":[[3465,5]]},"238":{"position":[[89,5]]},"242":{"position":[[299,5],[1026,5],[1112,4]]},"244":{"position":[[806,4]]},"280":{"position":[[267,5]]},"282":{"position":[[6132,4]]},"313":{"position":[[87,5]]},"343":{"position":[[187,6],[402,5]]},"448":{"position":[[1863,5]]}}}],["parti",{"_index":641,"t":{"61":{"position":[[1424,5]]},"75":{"position":[[693,5]]},"77":{"position":[[2367,9]]},"79":{"position":[[1001,9]]},"106":{"position":[[6,5]]},"420":{"position":[[2763,5]]}}}],["partial",{"_index":1940,"t":{"307":{"position":[[221,7]]}}}],["partyplex",{"_index":763,"t":{"77":{"position":[[2176,12]]},"79":{"position":[[897,12]]}}}],["pass",{"_index":997,"t":{"108":{"position":[[1231,4]]},"242":{"position":[[352,6],[383,4],[443,4]]},"393":{"position":[[1067,4],[1347,4]]}}}],["password",{"_index":255,"t":{"13":{"position":[[5123,11]]},"31":{"position":[[1318,11]]},"53":{"position":[[261,8]]},"70":{"position":[[107,9],[157,9],[184,8]]},"73":{"position":[[792,8]]},"77":{"position":[[2749,11]]},"116":{"position":[[295,8]]},"120":{"position":[[275,8],[417,11],[652,11]]},"122":{"position":[[504,9],[1481,9],[1516,8],[1589,9]]},"124":{"position":[[228,8]]},"128":{"position":[[206,8],[363,11],[620,11]]},"176":{"position":[[233,11],[499,11]]},"178":{"position":[[121,8]]},"180":{"position":[[302,11],[552,11]]},"194":{"position":[[261,8]]},"196":{"position":[[327,11],[619,11]]},"206":{"position":[[392,8],[410,8],[640,9]]},"208":{"position":[[230,11],[447,11]]},"236":{"position":[[426,9]]},"347":{"position":[[1303,8]]},"442":{"position":[[445,8]]}}}],["past",{"_index":2409,"t":{"409":{"position":[[346,5]]}}}],["path",{"_index":501,"t":{"35":{"position":[[737,4],[885,4]]},"51":{"position":[[565,4]]},"96":{"position":[[454,4],[583,4],[625,4],[655,4]]},"134":{"position":[[163,4]]},"148":{"position":[[194,4],[288,4]]},"218":{"position":[[400,5],[520,4]]},"360":{"position":[[378,4]]}}}],["path/to/flatpak/build/dir",{"_index":2071,"t":{"360":{"position":[[268,26]]}}}],["pattern",{"_index":273,"t":{"17":{"position":[[299,8]]},"226":{"position":[[752,7]]},"230":{"position":[[25,7]]},"282":{"position":[[4281,8]]},"313":{"position":[[185,9]]},"448":{"position":[[626,9]]}}}],["paus",{"_index":831,"t":{"86":{"position":[[760,8]]},"393":{"position":[[2106,11]]}}}],["payload",{"_index":481,"t":{"33":{"position":[[483,7]]},"108":{"position":[[3296,7]]},"414":{"position":[[431,7]]}}}],["pd",{"_index":612,"t":{"61":{"position":[[344,3],[1105,3]]},"68":{"position":[[225,3],[426,3],[1183,3]]},"73":{"position":[[355,3]]},"182":{"position":[[197,3]]},"184":{"position":[[89,3]]},"198":{"position":[[37,4],[197,3],[276,3]]},"200":{"position":[[89,3]]},"204":{"position":[[675,3]]}}}],["pds/repositori",{"_index":621,"t":{"61":{"position":[[574,14]]},"68":{"position":[[656,14]]}}}],["peac",{"_index":2537,"t":{"448":{"position":[[1559,5]]}}}],["per",{"_index":1774,"t":{"276":{"position":[[821,3],[914,4]]},"311":{"position":[[277,3]]}}}],["percent",{"_index":225,"t":{"13":{"position":[[4234,10]]},"92":{"position":[[126,7],[521,10]]},"112":{"position":[[1391,7]]}}}],["perform",{"_index":873,"t":{"96":{"position":[[260,11]]},"282":{"position":[[287,10]]},"436":{"position":[[299,9]]},"438":{"position":[[32,9]]}}}],["period",{"_index":2429,"t":{"420":{"position":[[1033,7]]}}}],["perman",{"_index":1570,"t":{"232":{"position":[[544,11]]}}}],["permiss",{"_index":1214,"t":{"170":{"position":[[1041,11]]},"222":{"position":[[1406,10],[4843,11]]},"368":{"position":[[3211,11],[3305,10]]},"444":{"position":[[117,12]]}}}],["persist",{"_index":39,"t":{"7":{"position":[[296,7]]},"23":{"position":[[42,7],[246,12],[380,9],[539,9],[666,10],[1154,11],[1296,9],[1423,10],[2081,9]]},"31":{"position":[[1488,10],[1802,12]]},"61":{"position":[[1342,10],[1770,10]]},"206":{"position":[[459,7]]},"448":{"position":[[1096,12]]}}}],["person",{"_index":127,"t":{"13":{"position":[[499,6]]},"61":{"position":[[319,8],[348,9]]},"68":{"position":[[229,9],[401,8],[430,9]]},"75":{"position":[[78,6],[118,6]]},"190":{"position":[[3562,8]]},"198":{"position":[[201,9]]},"380":{"position":[[683,8]]},"436":{"position":[[557,8]]},"438":{"position":[[290,8]]},"448":{"position":[[1598,8]]}}}],["persona",{"_index":1897,"t":{"289":{"position":[[1749,8]]}}}],["persona5",{"_index":1895,"t":{"289":{"position":[[1575,9],[2299,9]]}}}],["pgid",{"_index":1213,"t":{"170":{"position":[[995,4]]},"368":{"position":[[3392,5]]}}}],["pgid=1000",{"_index":2118,"t":{"368":{"position":[[794,9]]},"370":{"position":[[618,11],[745,11],[1383,9]]}}}],["phone",{"_index":2460,"t":{"420":{"position":[[2852,8]]}}}],["phone/comput",{"_index":965,"t":{"108":{"position":[[62,14]]}}}],["phrase",{"_index":1017,"t":{"108":{"position":[[2399,7],[2922,7]]},"248":{"position":[[521,7],[598,7]]},"294":{"position":[[290,7]]},"324":{"position":[[12,6]]}}}],["phu7",{"_index":707,"t":{"73":{"position":[[950,4],[1201,4]]},"204":{"position":[[950,4],[1159,4],[1389,4],[1854,4],[2169,4]]}}}],["pi",{"_index":2104,"t":{"368":{"position":[[76,3]]}}}],["pickup",{"_index":2487,"t":{"426":{"position":[[179,6]]}}}],["pin",{"_index":2554,"t":{"471":{"position":[[488,6]]}}}],["ping",{"_index":2036,"t":{"347":{"position":[[1924,4]]}}}],["pip/pipx",{"_index":2061,"t":{"355":{"position":[[86,8]]}}}],["place",{"_index":23,"t":{"7":{"position":[[70,6]]},"404":{"position":[[554,5]]}}}],["placehold",{"_index":2506,"t":{"434":{"position":[[3655,12]]}}}],["plain",{"_index":472,"t":{"33":{"position":[[210,5]]},"282":{"position":[[2856,5]]},"317":{"position":[[41,5],[386,5]]}}}],["platform",{"_index":604,"t":{"61":{"position":[[126,8],[1503,9]]},"81":{"position":[[104,9]]},"182":{"position":[[101,8]]},"349":{"position":[[404,8]]},"368":{"position":[[6,8]]},"374":{"position":[[346,8]]},"414":{"position":[[114,8],[303,9]]},"420":{"position":[[2719,8],[2800,8]]},"448":{"position":[[1333,8],[1522,8]]}}}],["platformid",{"_index":2330,"t":{"393":{"position":[[2333,11]]}}}],["play",{"_index":6,"t":{"2":{"position":[[92,6]]},"4":{"position":[[9,7]]},"9":{"position":[[41,7],[123,7],[150,7],[264,7],[287,7],[470,7],[594,8],[940,7],[1242,7],[1309,7]]},"61":{"position":[[722,5]]},"68":{"position":[[804,5]]},"75":{"position":[[31,5],[542,5],[608,5],[713,4],[753,5],[890,5]]},"77":{"position":[[2079,4]]},"81":{"position":[[73,7]]},"86":{"position":[[608,6],[778,8],[850,7]]},"88":{"position":[[34,7],[91,7]]},"96":{"position":[[276,7]]},"108":{"position":[[144,5],[1727,7]]},"112":{"position":[[1399,7]]},"162":{"position":[[48,7],[181,6]]},"164":{"position":[[67,6]]},"170":{"position":[[283,6]]},"190":{"position":[[232,4],[307,4],[451,7]]},"204":{"position":[[71,5],[172,4],[412,4]]},"206":{"position":[[1020,6]]},"218":{"position":[[45,6]]},"228":{"position":[[114,4],[202,4],[236,4],[258,5],[292,4],[379,5],[396,5],[442,4],[521,5],[569,4],[613,4],[673,4],[760,4]]},"232":{"position":[[33,4],[98,4],[144,4],[193,4],[271,4],[336,4],[428,4],[1474,4],[1567,4]]},"234":{"position":[[114,4],[369,4],[486,4]]},"238":{"position":[[102,4],[251,4],[326,4],[429,4],[495,4],[556,4],[634,4],[1197,4]]},"240":{"position":[[520,4]]},"242":{"position":[[284,4],[525,4],[601,4],[703,4],[779,4],[876,4],[953,4],[1532,4]]},"244":{"position":[[157,4],[298,4],[546,5],[701,5]]},"248":{"position":[[73,4],[574,4],[694,4]]},"252":{"position":[[202,4],[277,4],[372,4]]},"265":{"position":[[35,4],[197,4],[263,4]]},"276":{"position":[[572,4],[647,4],[742,4]]},"280":{"position":[[171,4]]},"282":{"position":[[6310,4]]},"287":{"position":[[241,4]]},"292":{"position":[[233,4]]},"296":{"position":[[471,4]]},"300":{"position":[[447,4]]},"313":{"position":[[96,4]]},"324":{"position":[[55,4]]},"349":{"position":[[246,6],[332,4],[391,4],[464,6]]},"380":{"position":[[455,6],[501,7]]},"383":{"position":[[2144,7]]},"393":{"position":[[108,6],[408,8],[771,7],[834,5],[1464,6],[1854,6],[1899,7],[1985,9],[2080,9],[2212,5],[2370,5],[2680,6],[2844,5]]},"396":{"position":[[166,6],[934,4],[1119,8]]},"398":{"position":[[1845,5],[2041,6],[2258,7],[2321,4],[2441,4],[2473,6],[3218,4],[3296,5],[3361,4],[3638,5],[3751,4],[3996,4]]},"412":{"position":[[113,5]]},"416":{"position":[[21,7]]},"420":{"position":[[2899,7]]},"444":{"position":[[569,7]]},"448":{"position":[[800,7],[1453,4],[1482,4],[1917,5]]},"450":{"position":[[139,6]]},"452":{"position":[[72,7]]},"454":{"position":[[92,6]]}}}],["play/scrobbl",{"_index":1582,"t":{"232":{"position":[[1544,14]]}}}],["playdat",{"_index":2274,"t":{"389":{"position":[[906,9]]}}}],["playedat",{"_index":2272,"t":{"389":{"position":[[736,9],[873,8]]}}}],["player",{"_index":74,"t":{"9":{"position":[[572,6],[669,6],[730,7]]},"81":{"position":[[94,6]]},"83":{"position":[[624,6]]},"86":{"position":[[747,6],[787,6]]},"108":{"position":[[3265,6]]},"170":{"position":[[59,7],[303,6]]},"172":{"position":[[210,6],[287,7]]},"190":{"position":[[36,6]]},"380":{"position":[[66,6],[85,7],[98,6],[566,6],[593,6],[635,6],[709,6],[924,6]]},"383":{"position":[[47,6],[622,6],[650,6],[791,6],[2120,6]]},"385":{"position":[[775,6]]},"391":{"position":[[1984,6],[2511,6]]},"393":{"position":[[87,6],[279,6],[1085,6],[1194,6],[1356,6],[2200,6],[2277,6],[2437,6],[2456,6],[2580,6],[2642,6]]},"398":{"position":[[578,7]]},"434":{"position":[[31,7]]},"448":{"position":[[310,6]]},"452":{"position":[[116,7],[134,7]]}}}],["player'",{"_index":2260,"t":{"389":{"position":[[92,8],[587,8]]}}}],["playerdata",{"_index":2329,"t":{"393":{"position":[[2301,11]]}}}],["playerst",{"_index":2326,"t":{"393":{"position":[[2064,12]]}}}],["playerstatedata",{"_index":2319,"t":{"393":{"position":[[1591,16],[2313,15]]}}}],["playlist/queu",{"_index":1278,"t":{"190":{"position":[[92,14]]}}}],["playobject",{"_index":2051,"t":{"349":{"position":[[4,10],[523,10],[648,10],[736,10]]},"383":{"position":[[2043,10]]},"389":{"position":[[127,11],[294,10],[671,10]]},"393":{"position":[[742,11],[2496,10]]},"396":{"position":[[375,11]]},"398":{"position":[[2878,11],[3055,12],[3556,11],[3588,12]]}}}],["plays.push(playerdata",{"_index":2332,"t":{"393":{"position":[[2520,23]]}}}],["playtransform",{"_index":1565,"t":{"230":{"position":[[477,16]]},"232":{"position":[[1394,16]]},"236":{"position":[[850,16],[1561,16],[1739,16],[2365,16]]},"240":{"position":[[937,16],[1218,16]]},"242":{"position":[[1258,16],[1542,16]]},"244":{"position":[[70,13],[410,16]]},"254":{"position":[[340,16]]},"259":{"position":[[406,16]]},"261":{"position":[[305,16]]},"263":{"position":[[338,16]]},"276":{"position":[[140,16],[441,16],[1026,16]]},"298":{"position":[[457,16]]},"300":{"position":[[640,16]]},"303":{"position":[[276,16]]},"305":{"position":[[589,16]]},"307":{"position":[[611,16]]},"309":{"position":[[686,16]]},"311":{"position":[[714,16],[1031,16]]},"315":{"position":[[672,16]]},"319":{"position":[[156,16]]},"436":{"position":[[1912,16]]},"440":{"position":[[1129,16]]}}}],["pleas",{"_index":968,"t":{"108":{"position":[[255,6],[3084,6],[3281,6]]},"190":{"position":[[3528,6]]},"206":{"position":[[2256,6]]},"300":{"position":[[285,6]]},"420":{"position":[[1361,6]]}}}],["plex",{"_index":132,"t":{"13":{"position":[[618,4],[1535,4],[3218,4]]},"75":{"position":[[494,4],[565,4],[681,4]]},"77":{"position":[[1694,7],[1864,7],[2160,7]]},"81":{"position":[[146,5]]},"83":{"position":[[697,4]]},"188":{"position":[[10,4],[79,4],[225,4],[295,4],[341,4],[765,4],[921,4],[967,4],[1085,4],[1233,4],[1257,4],[1430,4],[1656,4],[1713,4],[1804,5],[1886,5],[3251,6]]},"294":{"position":[[1132,5]]},"398":{"position":[[266,5],[1177,5]]},"430":{"position":[[338,5]]},"434":{"position":[[123,4],[2508,4],[2577,4],[3001,4]]},"436":{"position":[[923,4]]},"440":{"position":[[140,4]]},"448":{"position":[[357,4]]},"452":{"position":[[198,5]]}}}],["plex.json",{"_index":189,"t":{"13":{"position":[[2470,9]]}}}],["plex_devices_allow",{"_index":1270,"t":{"188":{"position":[[1917,18]]}}}],["plex_devices_block",{"_index":1271,"t":{"188":{"position":[[1988,18]]}}}],["plex_libraries_allow",{"_index":1265,"t":{"188":{"position":[[1491,20],[2069,20]]}}}],["plex_libraries_block",{"_index":1272,"t":{"188":{"position":[[2151,20]]}}}],["plex_local_us",{"_index":1260,"t":{"188":{"position":[[270,17],[1145,18]]}}}],["plex_token",{"_index":1268,"t":{"188":{"position":[[1694,10]]}}}],["plex_token=6c0ihz8j7__f5r18oa0zm8",{"_index":2502,"t":{"434":{"position":[[2743,33]]}}}],["plex_transforms=musicbrainz",{"_index":2515,"t":{"436":{"position":[[1470,27]]},"440":{"position":[[687,27]]}}}],["plex_url",{"_index":1266,"t":{"188":{"position":[[1628,8]]}}}],["plex_url=http://192.168.0.101:32400",{"_index":2501,"t":{"434":{"position":[[2705,35]]}}}],["plex_users_allow",{"_index":1262,"t":{"188":{"position":[[453,16],[723,16],[885,17],[1179,17],[1744,16]]}}}],["plex_users_allow=myplexusernam",{"_index":2503,"t":{"434":{"position":[[2847,31]]}}}],["plex_users_block",{"_index":1269,"t":{"188":{"position":[[1826,16]]}}}],["plexmediaserver/1.24.5.5173",{"_index":2388,"t":{"402":{"position":[[1054,27]]}}}],["plkex",{"_index":2391,"t":{"402":{"position":[[1111,6]]}}}],["plyr",{"_index":1369,"t":{"204":{"position":[[983,9],[1422,8],[1889,6],[2204,6]]}}}],["plyr.fm",{"_index":1366,"t":{"204":{"position":[[810,8],[1228,7]]}}}],["pm195xpv98cdpk0qw47fiior8akatax5dblbf",{"_index":492,"t":{"35":{"position":[[362,37]]},"442":{"position":[[1533,37]]}}}],["podcast",{"_index":722,"t":{"75":{"position":[[623,7]]},"77":{"position":[[2089,10],[2132,12]]},"79":{"position":[[869,12]]}}}],["point",{"_index":1470,"t":{"222":{"position":[[1277,5]]},"230":{"position":[[131,7]]}}}],["poll",{"_index":439,"t":{"31":{"position":[[85,7],[108,7],[129,7]]},"33":{"position":[[660,4],[728,7]]},"77":{"position":[[102,7]]},"222":{"position":[[4601,7]]},"380":{"position":[[877,7]]},"385":{"position":[[418,7]]},"393":{"position":[[645,7]]},"398":{"position":[[31,7],[407,7],[1139,7],[1233,7],[2148,7]]}}}],["pollingopt",{"_index":2192,"t":{"383":{"position":[[236,14],[522,14]]}}}],["polo",{"_index":1718,"t":{"261":{"position":[[180,5]]}}}],["pong",{"_index":2037,"t":{"347":{"position":[[1929,4]]}}}],["pop!_o",{"_index":2468,"t":{"422":{"position":[[107,8]]}}}],["popular",{"_index":1155,"t":{"148":{"position":[[373,7]]},"422":{"position":[[59,7]]}}}],["popup",{"_index":1492,"t":{"222":{"position":[[2473,5]]}}}],["port",{"_index":328,"t":{"21":{"position":[[296,4],[345,4]]},"23":{"position":[[3715,4]]},"86":{"position":[[514,4]]},"108":{"position":[[950,4]]},"118":{"position":[[418,4]]},"126":{"position":[[412,4],[449,4]]},"162":{"position":[[789,4],[895,4]]},"170":{"position":[[1391,4],[1534,5],[1589,4]]},"174":{"position":[[183,4]]},"178":{"position":[[268,4],[374,4]]},"180":{"position":[[116,4]]},"188":{"position":[[50,4]]},"206":{"position":[[711,5],[841,4],[978,5]]},"256":{"position":[[1043,6]]},"278":{"position":[[2123,6]]},"368":{"position":[[1424,6],[1451,4],[1468,4],[2083,4],[2223,4],[2414,6]]},"370":{"position":[[139,4],[1423,6]]},"374":{"position":[[1301,4],[1343,4]]},"380":{"position":[[668,4]]},"383":{"position":[[775,4]]},"402":{"position":[[2165,4],[2254,4],[2354,4]]},"430":{"position":[[156,4]]},"432":{"position":[[487,6]]},"434":{"position":[[2548,4]]}}}],["ports/prefix",{"_index":2276,"t":{"391":{"position":[[269,13]]}}}],["posit",{"_index":832,"t":{"86":{"position":[[794,8]]},"96":{"position":[[72,9]]},"380":{"position":[[600,8]]},"393":{"position":[[2118,9],[2170,8],[2414,8]]}}}],["possibl",{"_index":176,"t":{"13":{"position":[[1876,8]]},"170":{"position":[[629,9]]},"190":{"position":[[3640,8]]},"222":{"position":[[1940,8]]},"248":{"position":[[753,11],[887,13]]},"282":{"position":[[3039,11],[4506,11],[4854,13],[5456,11],[5676,11]]},"289":{"position":[[289,11]]},"294":{"position":[[331,8],[656,11],[854,13]]},"347":{"position":[[2866,9]]},"448":{"position":[[2060,9]]}}}],["post",{"_index":2386,"t":{"402":{"position":[[1010,4]]}}}],["postcompar",{"_index":1567,"t":{"230":{"position":[[547,14]]},"232":{"position":[[172,11],[407,11],[1122,12]]}}}],["potenti",{"_index":1591,"t":{"236":{"position":[[192,13]]},"282":{"position":[[886,9]]},"406":{"position":[[1255,11]]}}}],["pr",{"_index":2488,"t":{"428":{"position":[[7,2]]}}}],["practic",{"_index":1679,"t":{"248":{"position":[[640,9]]},"280":{"position":[[127,9]]},"398":{"position":[[3826,8]]}}}],["pre",{"_index":390,"t":{"23":{"position":[[2667,3]]},"242":{"position":[[253,3]]},"250":{"position":[[1180,4]]}}}],["preced",{"_index":1828,"t":{"282":{"position":[[5242,9]]}}}],["precompar",{"_index":1566,"t":{"230":{"position":[[496,13]]},"232":{"position":[[13,10],[251,10],[870,10],[1027,10],[1107,10]]},"236":{"position":[[869,13],[1580,13],[1758,13],[2384,13]]},"240":{"position":[[956,13],[1237,13]]},"242":{"position":[[1277,13],[1561,13]]},"244":{"position":[[429,13],[718,12]]},"254":{"position":[[359,13]]},"259":{"position":[[425,13]]},"261":{"position":[[324,13]]},"263":{"position":[[357,13]]},"276":{"position":[[159,13],[460,13],[1045,13]]},"298":{"position":[[476,13]]},"300":{"position":[[673,13]]},"303":{"position":[[295,13]]},"305":{"position":[[608,13]]},"307":{"position":[[630,13]]},"309":{"position":[[705,13]]},"311":{"position":[[733,13],[1050,13]]},"315":{"position":[[691,13]]},"319":{"position":[[191,13]]},"436":{"position":[[1931,13]]},"440":{"position":[[1148,13]]}}}],["prefer",{"_index":1374,"t":{"206":{"position":[[110,11]]},"265":{"position":[[557,6]]},"287":{"position":[[295,6],[520,6]]},"289":{"position":[[853,6],[945,6]]},"292":{"position":[[464,6],[564,6],[877,6],[977,6]]},"294":{"position":[[1992,6]]},"296":{"position":[[38,6],[334,6]]},"398":{"position":[[309,6]]}}}],["preferences/set",{"_index":1407,"t":{"210":{"position":[[53,20]]}}}],["prefix",{"_index":566,"t":{"51":{"position":[[570,6]]},"256":{"position":[[283,6]]},"278":{"position":[[1174,6]]}}}],["premium",{"_index":914,"t":{"100":{"position":[[271,7]]}}}],["present",{"_index":121,"t":{"13":{"position":[[352,7]]},"112":{"position":[[110,10]]},"248":{"position":[[419,7],[481,7]]},"250":{"position":[[706,7],[787,7],[905,7],[992,8]]},"252":{"position":[[402,7]]},"282":{"position":[[510,7],[742,7]]},"341":{"position":[[376,10]]}}}],["preset",{"_index":1781,"t":{"278":{"position":[[81,7],[317,7],[358,6],[445,7],[528,7]]},"436":{"position":[[727,7]]},"438":{"position":[[460,7]]}}}],["presid",{"_index":2439,"t":{"420":{"position":[[1810,9]]}}}],["press",{"_index":922,"t":{"102":{"position":[[318,5],[392,5]]}}}],["pretend",{"_index":2403,"t":{"406":{"position":[[676,7]]}}}],["pretransform",{"_index":1699,"t":{"256":{"position":[[220,12],[865,12]]},"278":{"position":[[1111,12],[1911,12]]}}}],["prevent",{"_index":960,"t":{"106":{"position":[[586,7]]},"164":{"position":[[390,7]]},"166":{"position":[[138,7]]},"226":{"position":[[866,7]]},"398":{"position":[[2485,8],[4048,7]]}}}],["preview",{"_index":689,"t":{"68":{"position":[[1595,7]]}}}],["previou",{"_index":1588,"t":{"234":{"position":[[505,8]]},"244":{"position":[[518,8]]},"434":{"position":[[448,8]]}}}],["previous",{"_index":2312,"t":{"393":{"position":[[810,10],[2889,10]]}}}],["price",{"_index":1891,"t":{"289":{"position":[[1524,8]]}}}],["primari",{"_index":1769,"t":{"272":{"position":[[692,7]]},"287":{"position":[[736,7]]},"294":{"position":[[1919,7]]}}}],["primarili",{"_index":2307,"t":{"393":{"position":[[36,9]]}}}],["print",{"_index":2135,"t":{"368":{"position":[[3487,6],[3507,6]]}}}],["priorit",{"_index":1743,"t":{"265":{"position":[[933,10]]},"267":{"position":[[330,10]]},"278":{"position":[[596,9]]},"289":{"position":[[1952,10]]},"294":{"position":[[957,10]]}}}],["prioriti",{"_index":101,"t":{"9":{"position":[[1282,8]]},"13":{"position":[[4923,13],[5147,13]]},"31":{"position":[[758,8],[944,13],[1111,8],[1342,13]]},"289":{"position":[[777,8]]}}}],["privaci",{"_index":634,"t":{"61":{"position":[[1245,8]]},"68":{"position":[[1323,8]]},"70":{"position":[[129,7]]}}}],["probabl",{"_index":672,"t":{"66":{"position":[[275,8]]},"73":{"position":[[370,8]]}}}],["problem",{"_index":969,"t":{"108":{"position":[[294,8]]},"368":{"position":[[3316,9]]},"406":{"position":[[1279,8]]},"446":{"position":[[537,8]]}}}],["proce",{"_index":2078,"t":{"360":{"position":[[491,7]]}}}],["process",{"_index":1286,"t":{"190":{"position":[[761,7],[2481,7],[4351,7]]},"230":{"position":[[169,10]]},"232":{"position":[[798,9],[904,9]]},"240":{"position":[[313,10],[390,11],[508,7]]},"242":{"position":[[406,10]]},"265":{"position":[[1687,11]]},"393":{"position":[[2572,7]]}}}],["process.env.cool_token",{"_index":2246,"t":{"387":{"position":[[781,22]]}}}],["process.env.cool_url",{"_index":2245,"t":{"387":{"position":[[752,21]]}}}],["processrecentplay",{"_index":2314,"t":{"393":{"position":[[1001,18],[1134,21],[1272,18]]},"398":{"position":[[1815,19]]}}}],["produc",{"_index":1643,"t":{"244":{"position":[[885,8],[940,8]]}}}],["profil",{"_index":592,"t":{"57":{"position":[[337,7]]},"59":{"position":[[119,7]]},"68":{"position":[[62,7]]},"154":{"position":[[437,7]]},"448":{"position":[[2250,7]]}}}],["project",{"_index":177,"t":{"13":{"position":[[2021,8],[3660,7]]},"148":{"position":[[962,7]]},"222":{"position":[[1846,7]]},"349":{"position":[[772,7]]},"360":{"position":[[170,7]]},"362":{"position":[[224,7],[271,7]]},"398":{"position":[[1498,7]]}}}],["project_dir",{"_index":2083,"t":{"362":{"position":[[285,11],[463,11]]}}}],["project_dir/config",{"_index":156,"t":{"13":{"position":[[1293,18]]}}}],["project_dir/config/config.json",{"_index":202,"t":{"13":{"position":[[2953,30]]}}}],["project_dir/flatpak",{"_index":2087,"t":{"362":{"position":[[375,19],[561,19],[761,19]]}}}],["promise<playobject",{"_index":2323,"t":{"393":{"position":[[1824,21]]},"396":{"position":[[715,21]]}}}],["promise<tru",{"_index":2285,"t":{"391":{"position":[[766,12],[1722,12]]}}}],["promot",{"_index":1859,"t":{"287":{"position":[[693,12]]}}}],["proper",{"_index":1695,"t":{"250":{"position":[[1265,6]]},"444":{"position":[[105,6]]}}}],["properli",{"_index":1451,"t":{"222":{"position":[[463,8]]},"380":{"position":[[298,8]]},"393":{"position":[[668,8]]}}}],["propert",{"_index":1620,"t":{"242":{"position":[[133,9]]}}}],["properti",{"_index":85,"t":{"9":{"position":[[867,8]]},"23":{"position":[[2539,11]]},"27":{"position":[[357,8]]},"31":{"position":[[267,9]]},"49":{"position":[[123,8]]},"77":{"position":[[150,8],[314,8],[502,8],[689,8],[877,8]]},"79":{"position":[[47,8]]},"90":{"position":[[65,8],[131,8],[625,8]]},"108":{"position":[[1661,8]]},"194":{"position":[[663,8]]},"204":{"position":[[747,8]]},"236":{"position":[[2463,8]]},"238":{"position":[[702,8],[841,8],[939,10]]},"240":{"position":[[174,10]]},"242":{"position":[[158,8],[223,8]]},"250":{"position":[[10,10],[531,10]]},"274":{"position":[[11,10]]},"276":{"position":[[919,9],[1212,9]]},"280":{"position":[[9,10]]},"287":{"position":[[1281,8]]},"289":{"position":[[676,8],[786,9],[1181,10],[2395,10]]},"317":{"position":[[903,8]]},"347":{"position":[[1287,10],[2021,11],[2054,10],[3154,10]]},"383":{"position":[[570,11]]},"391":{"position":[[170,10]]}}}],["properties/behavior",{"_index":2005,"t":{"343":{"position":[[441,19]]}}}],["protect",{"_index":2284,"t":{"391":{"position":[[731,9],[1685,9]]},"393":{"position":[[1752,9]]},"396":{"position":[[644,9]]}}}],["protocol",{"_index":325,"t":{"21":{"position":[[232,8],[255,8]]},"61":{"position":[[151,8],[198,8]]},"68":{"position":[[280,8]]},"182":{"position":[[126,8]]}}}],["protocol://libre.tld/path/prefix",{"_index":558,"t":{"49":{"position":[[192,32]]}}}],["protocol]://[hostname]:[port]/[path",{"_index":1073,"t":{"118":{"position":[[138,37]]},"126":{"position":[[136,37]]},"162":{"position":[[493,37]]}}}],["provid",{"_index":182,"t":{"13":{"position":[[2224,8],[3849,8]]},"23":{"position":[[1018,11],[1763,11],[2386,11],[2964,11],[3812,11]]},"43":{"position":[[400,9]]},"51":{"position":[[486,9]]},"75":{"position":[[391,8]]},"96":{"position":[[539,9],[686,7]]},"108":{"position":[[440,8]]},"116":{"position":[[270,7]]},"122":{"position":[[1456,7],[1564,7]]},"124":{"position":[[259,7]]},"134":{"position":[[17,8]]},"136":{"position":[[202,8]]},"148":{"position":[[17,8]]},"150":{"position":[[71,8]]},"152":{"position":[[200,8],[260,8]]},"178":{"position":[[382,8],[435,8]]},"194":{"position":[[561,7]]},"218":{"position":[[317,8],[503,7]]},"222":{"position":[[3336,7],[5272,8]]},"250":{"position":[[645,8],[1257,7]]},"311":{"position":[[41,8]]},"313":{"position":[[52,8]]},"360":{"position":[[29,8]]},"378":{"position":[[19,7]]},"391":{"position":[[191,8]]},"396":{"position":[[107,8]]},"420":{"position":[[1320,9],[1388,7],[2586,7],[2614,7],[3213,7]]},"434":{"position":[[1485,9]]},"436":{"position":[[387,7]]},"438":{"position":[[120,7]]},"462":{"position":[[136,8]]}}}],["proxi",{"_index":824,"t":{"86":{"position":[[530,6]]},"96":{"position":[[570,5]]},"148":{"position":[[894,5]]},"190":{"position":[[1572,5]]},"210":{"position":[[746,5]]},"218":{"position":[[474,6]]}}}],["psuedo",{"_index":1777,"t":{"276":{"position":[[1127,8]]},"282":{"position":[[6530,6]]},"289":{"position":[[1963,6]]}}}],["public",{"_index":631,"t":{"61":{"position":[[1078,6],[1112,7],[1152,6]]},"68":{"position":[[1156,6],[1190,7],[1230,6],[1417,6]]},"98":{"position":[[157,6]]},"210":{"position":[[540,6]]}}}],["publicli",{"_index":1416,"t":{"210":{"position":[[598,8]]}}}],["publish",{"_index":2128,"t":{"368":{"position":[[2278,7]]}}}],["puid",{"_index":1212,"t":{"170":{"position":[[986,4]]},"368":{"position":[[3383,4]]}}}],["puid=1000",{"_index":2116,"t":{"368":{"position":[[695,9]]},"370":{"position":[[603,11],[730,11],[1371,9]]}}}],["pull",{"_index":616,"t":{"61":{"position":[[467,5],[1020,6]]},"68":{"position":[[549,5],[1098,6]]},"473":{"position":[[35,4],[279,4]]},"475":{"position":[[84,7],[115,4]]}}}],["punk",{"_index":1684,"t":{"248":{"position":[[815,4],[933,5]]},"282":{"position":[[4568,4],[4630,4],[4900,5],[5517,4]]},"294":{"position":[[718,4],[900,5]]}}}],["push",{"_index":436,"t":{"31":{"position":[[14,4]]},"393":{"position":[[2481,4]]}}}],["pwd)/config:/config",{"_index":2126,"t":{"368":{"position":[[1848,23]]},"370":{"position":[[801,23]]}}}],["python",{"_index":2059,"t":{"355":{"position":[[73,6]]}}}],["qualiti",{"_index":1054,"t":{"112":{"position":[[383,7]]}}}],["queri",{"_index":475,"t":{"33":{"position":[[335,5]]},"222":{"position":[[3687,5]]},"280":{"position":[[293,7]]},"282":{"position":[[836,7]]}}}],["querystrings/data",{"_index":1322,"t":{"190":{"position":[[3583,17]]}}}],["queu",{"_index":361,"t":{"23":{"position":[[299,6]]},"448":{"position":[[1031,7]]}}}],["queue",{"_index":24,"t":{"7":{"position":[[97,5]]},"190":{"position":[[211,5]]},"420":{"position":[[3048,8]]}}}],["quick",{"_index":1757,"t":{"265":{"position":[[1570,5]]},"370":{"position":[[12,5]]},"448":{"position":[[1239,5]]},"456":{"position":[[8,5]]}}}],["quicker",{"_index":376,"t":{"23":{"position":[[1129,7]]}}}],["quickstart",{"_index":1705,"t":{"256":{"position":[[594,11]]},"278":{"position":[[1491,11]]},"448":{"position":[[2438,10]]}}}],["rang",{"_index":1739,"t":{"265":{"position":[[830,5]]},"267":{"position":[[227,5]]}}}],["rank",{"_index":1884,"t":{"289":{"position":[[705,4],[2251,6],[2953,7],[3088,6],[3124,6]]}}}],["rariti",{"_index":1645,"t":{"244":{"position":[[898,8],[953,8]]}}}],["raspberri",{"_index":2103,"t":{"368":{"position":[[66,9]]}}}],["rate",{"_index":1759,"t":{"272":{"position":[[9,4]]}}}],["raw",{"_index":691,"t":{"68":{"position":[[1641,3]]},"108":{"position":[[3117,3]]},"204":{"position":[[658,3]]},"206":{"position":[[1163,3]]},"414":{"position":[[550,3]]}}}],["re",{"_index":485,"t":{"35":{"position":[[26,2]]},"39":{"position":[[27,2]]},"45":{"position":[[27,2]]},"57":{"position":[[27,2]]},"61":{"position":[[26,2]]},"68":{"position":[[26,2]]},"130":{"position":[[65,2]]},"132":{"position":[[189,2]]},"138":{"position":[[55,2]]},"142":{"position":[[56,2]]},"146":{"position":[[204,2]]},"154":{"position":[[72,2]]},"182":{"position":[[210,2]]},"198":{"position":[[289,2]]},"222":{"position":[[4647,2]]},"347":{"position":[[2846,2]]},"406":{"position":[[1132,2]]},"420":{"position":[[1162,3]]}}}],["re)authent",{"_index":1332,"t":{"190":{"position":[[4296,16]]},"222":{"position":[[4270,16]]},"406":{"position":[[497,16]]},"434":{"position":[[1165,16],[4053,16]]}}}],["re)start",{"_index":2498,"t":{"434":{"position":[[1949,9]]}}}],["reach",{"_index":1501,"t":{"222":{"position":[[3084,5]]},"404":{"position":[[474,5]]}}}],["reachabl",{"_index":2393,"t":{"402":{"position":[[1877,9]]}}}],["read",{"_index":630,"t":{"61":{"position":[[998,4],[1159,5]]},"68":{"position":[[1076,4],[1237,5]]},"347":{"position":[[386,7],[1317,4],[3230,4]]},"368":{"position":[[3518,4],[3579,4]]},"380":{"position":[[857,4]]},"387":{"position":[[18,5]]},"391":{"position":[[1889,4]]}}}],["read_onli",{"_index":2138,"t":{"368":{"position":[[3594,10],[3710,10]]}}}],["readi",{"_index":1380,"t":{"206":{"position":[[661,5]]}}}],["readm",{"_index":2117,"t":{"368":{"position":[[758,6],[857,6]]}}}],["real",{"_index":829,"t":{"86":{"position":[[705,4],[924,4]]},"148":{"position":[[778,4]]},"389":{"position":[[433,4]]},"444":{"position":[[586,4]]}}}],["realiz",{"_index":1936,"t":{"296":{"position":[[170,9]]}}}],["reason",{"_index":1539,"t":{"226":{"position":[[339,8]]},"282":{"position":[[6737,7]]},"347":{"position":[[711,6]]},"398":{"position":[[3873,6]]}}}],["reauthent",{"_index":2050,"t":{"347":{"position":[[3313,14]]},"406":{"position":[[370,14]]}}}],["recap",{"_index":1549,"t":{"228":{"position":[[13,5]]}}}],["receiv",{"_index":1019,"t":{"108":{"position":[[2457,10],[3044,10]]},"228":{"position":[[558,8]]},"232":{"position":[[60,8],[298,8],[919,7]]},"234":{"position":[[477,8]]},"256":{"position":[[946,8]]},"278":{"position":[[1986,8]]},"349":{"position":[[562,8]]},"398":{"position":[[215,8],[1627,8],[1787,8]]},"402":{"position":[[449,8],[814,8],[1001,8]]},"414":{"position":[[73,8]]}}}],["recent",{"_index":2184,"t":{"380":{"position":[[446,8]]},"396":{"position":[[1110,8]]},"398":{"position":[[762,8],[4019,9]]},"462":{"position":[[31,6]]}}}],["recentlyplayedopt",{"_index":2322,"t":{"393":{"position":[[1795,21]]},"396":{"position":[[691,23]]}}}],["reciev",{"_index":1308,"t":{"190":{"position":[[2717,9]]}}}],["recogn",{"_index":2381,"t":{"402":{"position":[[942,10]]},"412":{"position":[[103,9]]}}}],["recommend",{"_index":975,"t":{"108":{"position":[[590,11]]},"122":{"position":[[353,11]]},"194":{"position":[[313,11]]},"210":{"position":[[811,13]]},"222":{"position":[[826,11]]},"282":{"position":[[4117,13]]},"360":{"position":[[130,9]]},"368":{"position":[[1538,11]]},"471":{"position":[[393,11]]}}}],["record",{"_index":1365,"t":{"204":{"position":[[765,6]]},"282":{"position":[[2130,11],[2278,9],[6142,9],[6173,9]]},"287":{"position":[[59,9],[200,9],[1560,9],[1670,9],[1817,9]]},"289":{"position":[[1621,9],[3024,11],[3172,10]]},"294":{"position":[[770,9]]}}}],["recov",{"_index":2043,"t":{"347":{"position":[[2938,7]]}}}],["redi",{"_index":394,"t":{"23":{"position":[[3055,6]]}}}],["redirect",{"_index":318,"t":{"21":{"position":[[49,8],[430,8],[486,8],[607,8],[841,8]]},"41":{"position":[[4,8],[39,8],[498,8]]},"45":{"position":[[437,9]]},"47":{"position":[[4,8],[39,8],[492,8]]},"190":{"position":[[791,8],[843,8],[871,8],[1272,8],[1485,8],[1655,8],[2115,8],[2809,8],[2961,8],[3052,8],[3979,8],[4158,8]]},"222":{"position":[[2307,8],[2941,8],[3033,8],[3210,8],[3362,8],[3442,8],[3750,8],[4132,8]]},"224":{"position":[[267,8]]},"368":{"position":[[926,8],[2498,9]]},"434":{"position":[[617,8],[737,8]]}}}],["redirecturi",{"_index":198,"t":{"13":{"position":[[2710,14],[4604,14]]},"17":{"position":[[641,14],[1115,14]]},"21":{"position":[[547,11]]},"41":{"position":[[396,11]]},"43":{"position":[[619,14],[969,14]]},"47":{"position":[[397,11]]},"51":{"position":[[773,14],[1077,14]]},"77":{"position":[[3627,14]]},"79":{"position":[[1993,14]]},"140":{"position":[[459,14],[809,14]]},"144":{"position":[[416,14],[720,14]]},"192":{"position":[[413,14],[765,14]]},"222":{"position":[[3963,14]]},"434":{"position":[[3890,14]]},"436":{"position":[[1837,14]]},"440":{"position":[[1054,14]]}}}],["redis://192.168.0.120:6379",{"_index":409,"t":{"23":{"position":[[3738,26],[3848,28]]}}}],["redis://host_ip:host_port",{"_index":406,"t":{"23":{"position":[[3532,25]]}}}],["redis://valkey:6379",{"_index":403,"t":{"23":{"position":[[3356,19]]}}}],["reduc",{"_index":349,"t":{"23":{"position":[[82,6]]},"96":{"position":[[113,6]]},"218":{"position":[[179,6]]}}}],["refer",{"_index":260,"t":{"15":{"position":[[98,9],[156,9]]},"31":{"position":[[649,5],[1004,5],[1404,5]]},"256":{"position":[[330,5]]},"278":{"position":[[1221,5]]},"280":{"position":[[109,5]]},"343":{"position":[[28,9],[128,8]]},"349":{"position":[[702,5]]},"398":{"position":[[1509,10]]},"416":{"position":[[271,5],[392,5]]},"434":{"position":[[631,5],[2945,5]]}}}],["refin",{"_index":1800,"t":{"280":{"position":[[301,8]]}}}],["refresh",{"_index":717,"t":{"75":{"position":[[429,7]]},"222":{"position":[[5432,11]]},"406":{"position":[[456,7]]}}}],["refreshtoken",{"_index":750,"t":{"77":{"position":[[1532,15]]},"79":{"position":[[464,15]]}}}],["regardless",{"_index":1021,"t":{"108":{"position":[[2551,10],[2954,10]]},"162":{"position":[[220,10]]},"265":{"position":[[274,10]]},"282":{"position":[[6191,10]]},"294":{"position":[[1612,10]]},"398":{"position":[[744,10]]},"436":{"position":[[314,10]]},"438":{"position":[[47,10]]},"448":{"position":[[1458,10],[1650,10]]}}}],["regex",{"_index":1962,"t":{"322":{"position":[[129,5],[196,5]]},"332":{"position":[[281,5]]}}}],["regist",{"_index":529,"t":{"39":{"position":[[303,8]]},"434":{"position":[[3304,8]]},"442":{"position":[[895,8]]}}}],["registr",{"_index":1150,"t":{"138":{"position":[[321,12]]},"142":{"position":[[206,12]]}}}],["regular",{"_index":666,"t":{"66":{"position":[[92,7]]},"73":{"position":[[184,7]]},"112":{"position":[[1694,7]]},"206":{"position":[[1182,7]]},"242":{"position":[[186,7],[898,7]]},"250":{"position":[[401,7]]},"317":{"position":[[179,7],[402,7]]},"393":{"position":[[2488,7]]}}}],["relat",{"_index":1896,"t":{"289":{"position":[[1717,7]]},"349":{"position":[[308,7]]},"432":{"position":[[40,7]]}}}],["relay",{"_index":1223,"t":{"170":{"position":[[1467,5]]}}}],["releas",{"_index":1778,"t":{"276":{"position":[[1136,10]]},"278":{"position":[[975,8],[1664,7]]},"282":{"position":[[6161,8],[6537,9],[6601,9],[6658,8],[6761,7]]},"287":{"position":[[49,7],[371,8],[536,7],[556,7],[625,7],[722,7],[785,7],[822,7],[889,7],[938,7],[1000,8],[1096,7],[1108,7],[1395,7],[1538,9],[1598,9],[1723,8],[1787,8],[1839,8],[2043,8]]},"289":{"position":[[66,9],[614,7],[639,7],[710,8],[871,8],[1392,8],[1665,8],[1704,7],[1970,7],[2023,8],[2156,8],[2291,7],[2914,7],[2969,7],[3095,7]]},"292":{"position":[[395,7],[581,7],[808,7],[994,7]]},"296":{"position":[[61,8],[208,7]]},"471":{"position":[[172,8],[372,7],[542,7]]}}}],["release/album/ep",{"_index":1858,"t":{"287":{"position":[[666,16]]}}}],["releaseallowempti",{"_index":1773,"t":{"274":{"position":[[319,20]]},"287":{"position":[[1881,17],[1953,20]]}}}],["releasecountri",{"_index":1864,"t":{"287":{"position":[[954,16]]}}}],["releasecountryprior",{"_index":1919,"t":{"292":{"position":[[589,25],[1002,25]]},"305":{"position":[[371,25]]},"309":{"position":[[468,25]]}}}],["releasegroup",{"_index":1662,"t":{"244":{"position":[[1167,13]]}}}],["releasegroupprimarytyp",{"_index":1860,"t":{"287":{"position":[[749,25]]}}}],["releasegroupprimarytypeprior",{"_index":1886,"t":{"289":{"position":[[995,34]]},"292":{"position":[[499,34],[912,34]]},"305":{"position":[[309,34]]},"309":{"position":[[406,34]]}}}],["releasegroupsecondarytyp",{"_index":1861,"t":{"287":{"position":[[851,27]]}}}],["releasegroupsecondarytypedeni",{"_index":1875,"t":{"287":{"position":[[1483,32]]}}}],["releasestatu",{"_index":1857,"t":{"287":{"position":[[640,15]]}}}],["releasestatusallow",{"_index":1874,"t":{"287":{"position":[[1421,21]]}}}],["releasestatusprior",{"_index":1772,"t":{"274":{"position":[[280,24]]},"276":{"position":[[1102,24]]},"289":{"position":[[901,24],[1927,21]]},"292":{"position":[[422,24],[835,24]]},"305":{"position":[[270,24]]},"309":{"position":[[367,24]]}}}],["reli",{"_index":973,"t":{"108":{"position":[[405,6],[672,7]]},"311":{"position":[[109,4]]},"406":{"position":[[599,6]]},"414":{"position":[[28,6]]}}}],["reload",{"_index":1410,"t":{"210":{"position":[[244,6]]},"426":{"position":[[41,6]]}}}],["remain",{"_index":1877,"t":{"289":{"position":[[38,9]]}}}],["remast",{"_index":1626,"t":{"242":{"position":[[854,18]]}}}],["rememb",{"_index":1507,"t":{"222":{"position":[[3700,8]]},"383":{"position":[[542,8]]}}}],["remix",{"_index":1863,"t":{"287":{"position":[[924,6]]}}}],["remot",{"_index":1121,"t":{"124":{"position":[[173,6]]},"170":{"position":[[608,6],[647,6],[1275,6]]},"402":{"position":[[477,6]]}}}],["remov",{"_index":911,"t":{"100":{"position":[[133,6]]},"282":{"position":[[4715,7]]},"287":{"position":[[1988,6]]},"289":{"position":[[154,8]]},"313":{"position":[[234,8],[275,8]]},"315":{"position":[[799,7]]},"317":{"position":[[83,7],[215,7]]},"319":{"position":[[223,7],[268,7],[500,8]]},"322":{"position":[[202,6]]},"324":{"position":[[0,7]]},"420":{"position":[[1086,8]]},"430":{"position":[[564,6]]}}}],["removetrailingslash",{"_index":2279,"t":{"391":{"position":[[514,21]]}}}],["renam",{"_index":178,"t":{"13":{"position":[[2057,8]]},"362":{"position":[[399,6],[585,6]]}}}],["render",{"_index":617,"t":{"61":{"position":[[502,6],[1050,6]]},"68":{"position":[[584,6],[1128,6]]},"337":{"position":[[348,6]]}}}],["repeat",{"_index":958,"t":{"106":{"position":[[484,8],[608,8]]},"226":{"position":[[400,9],[742,9]]}}}],["replac",{"_index":279,"t":{"17":{"position":[[405,8]]},"190":{"position":[[3153,7]]},"226":{"position":[[109,9]]},"234":{"position":[[201,7]]},"238":{"position":[[1174,9]]},"250":{"position":[[287,8]]},"313":{"position":[[31,7]]},"315":{"position":[[49,7]]},"317":{"position":[[13,7],[434,7],[524,10],[549,7],[747,10],[776,7],[895,7],[930,9]]},"319":{"position":[[41,7],[301,8],[349,10]]},"322":{"position":[[61,7],[142,7],[285,10]]},"328":{"position":[[49,10]]},"330":{"position":[[52,10]]},"332":{"position":[[93,7],[106,7],[294,7],[726,10]]},"362":{"position":[[653,7]]},"374":{"position":[[516,11]]},"430":{"position":[[618,7]]},"434":{"position":[[3645,9]]},"442":{"position":[[1829,7]]}}}],["repo",{"_index":2109,"t":{"368":{"position":[[285,5]]}}}],["repo=/home/youruser/multi",{"_index":2092,"t":{"362":{"position":[[799,25]]}}}],["report",{"_index":46,"t":{"9":{"position":[[20,6],[272,10],[494,8],[618,9],[779,9],[1231,6],[1295,9]]},"25":{"position":[[217,10]]},"88":{"position":[[13,6]]},"96":{"position":[[49,6]]},"106":{"position":[[65,6]]},"108":{"position":[[1597,6],[1681,8],[1758,6],[1855,6],[1950,8],[2622,7],[2979,8]]},"112":{"position":[[1303,6]]},"190":{"position":[[286,6],[439,7]]},"194":{"position":[[184,8]]},"206":{"position":[[1270,8],[1948,10],[1995,9],[2137,10],[2237,9]]},"218":{"position":[[127,6]]},"222":{"position":[[472,6],[1447,8]]},"248":{"position":[[140,6],[180,7]]},"393":{"position":[[423,8]]},"416":{"position":[[63,9],[147,8]]},"418":{"position":[[7,9]]},"420":{"position":[[1201,9],[1412,7]]}}}],["repositori",{"_index":611,"t":{"61":{"position":[[328,10],[488,10],[736,10],[1036,10]]},"68":{"position":[[209,10],[410,10],[570,10],[818,10],[1114,10]]},"184":{"position":[[93,10]]},"198":{"position":[[181,10]]},"200":{"position":[[93,10]]},"339":{"position":[[190,10]]},"341":{"position":[[5,10],[307,10]]},"368":{"position":[[123,10],[179,10]]},"374":{"position":[[11,10]]},"475":{"position":[[13,10]]}}}],["repres",{"_index":1842,"t":{"285":{"position":[[60,12]]},"287":{"position":[[1072,9]]},"389":{"position":[[556,9]]}}}],["request",{"_index":377,"t":{"23":{"position":[[1137,8]]},"35":{"position":[[1512,8]]},"77":{"position":[[235,7],[610,7]]},"86":{"position":[[211,8]]},"102":{"position":[[132,8]]},"190":{"position":[[2706,7],[3609,8]]},"347":{"position":[[374,8],[1821,7],[2496,7],[3172,7]]},"380":{"position":[[907,8]]},"391":{"position":[[1516,7],[2154,7],[2381,7]]},"393":{"position":[[1543,7],[1951,7]]},"396":{"position":[[339,7],[767,7]]},"402":{"position":[[458,7],[1015,7],[2522,9]]},"406":{"position":[[110,7]]},"442":{"position":[[2220,8]]}}}],["request.get(`${this.baseurl}/health",{"_index":2300,"t":{"391":{"position":[[1784,38]]}}}],["requir",{"_index":126,"t":{"13":{"position":[[426,7]]},"23":{"position":[[873,9],[1630,9],[2254,9],[2750,9],[3597,9]]},"33":{"position":[[566,7]]},"35":{"position":[[788,9]]},"37":{"position":[[52,9]]},"43":{"position":[[52,9]]},"51":{"position":[[52,9]]},"55":{"position":[[52,9]]},"59":{"position":[[52,9]]},"66":{"position":[[471,9]]},"73":{"position":[[609,9]]},"86":{"position":[[429,7]]},"94":{"position":[[272,7]]},"96":{"position":[[459,8]]},"98":{"position":[[36,9]]},"104":{"position":[[36,9]]},"108":{"position":[[1470,9],[1544,9]]},"110":{"position":[[131,9]]},"114":{"position":[[36,9]]},"120":{"position":[[52,8]]},"122":{"position":[[1234,9]]},"128":{"position":[[52,8]]},"136":{"position":[[52,9],[171,8]]},"148":{"position":[[737,7]]},"150":{"position":[[26,7]]},"152":{"position":[[52,9],[169,8]]},"170":{"position":[[396,8],[598,9],[768,11]]},"172":{"position":[[52,9]]},"176":{"position":[[52,9]]},"180":{"position":[[52,9]]},"188":{"position":[[1598,9]]},"192":{"position":[[52,9]]},"196":{"position":[[52,9]]},"208":{"position":[[52,9]]},"210":{"position":[[430,9]]},"212":{"position":[[117,8]]},"216":{"position":[[52,9]]},"220":{"position":[[52,9]]},"224":{"position":[[52,9]]},"236":{"position":[[348,8]]},"263":{"position":[[194,8]]},"272":{"position":[[36,8]]},"282":{"position":[[185,8],[326,8],[493,8],[775,8]]},"339":{"position":[[12,8]]},"345":{"position":[[250,8],[449,8]]},"347":{"position":[[516,8],[1278,8],[1977,8],[2293,8],[2374,8],[2446,8],[2708,8]]},"349":{"position":[[99,8]]},"355":{"position":[[64,8]]},"368":{"position":[[707,8],[806,8]]},"380":{"position":[[340,7]]},"383":{"position":[[355,8],[2065,8],[2092,8]]},"385":{"position":[[782,8],[848,7]]},"387":{"position":[[1048,10]]},"391":{"position":[[34,8]]},"471":{"position":[[76,7]]}}}],["requiresauth",{"_index":2039,"t":{"347":{"position":[[2125,12]]}}}],["requiresauthinteract",{"_index":2041,"t":{"347":{"position":[[2216,23]]}}}],["reset",{"_index":2424,"t":{"420":{"position":[[568,6]]}}}],["resolut",{"_index":989,"t":{"108":{"position":[[1094,10]]}}}],["resolv",{"_index":2042,"t":{"347":{"position":[[2737,7]]},"368":{"position":[[1366,7]]},"406":{"position":[[1267,7]]},"414":{"position":[[620,7]]}}}],["resp",{"_index":2299,"t":{"391":{"position":[[1771,4],[2368,4]]},"393":{"position":[[1938,4],[2244,5]]},"396":{"position":[[754,4],[987,5]]}}}],["resp.body.vers",{"_index":2302,"t":{"391":{"position":[[2000,22]]}}}],["respect",{"_index":1330,"t":{"190":{"position":[[4178,10]]},"345":{"position":[[82,12]]}}}],["respons",{"_index":480,"t":{"33":{"position":[[459,8]]},"86":{"position":[[251,8]]},"391":{"position":[[1894,8]]}}}],["restart",{"_index":41,"t":{"7":{"position":[[312,7]]},"23":{"position":[[72,9],[397,8],[1173,9],[2098,8]]},"77":{"position":[[110,8]]},"206":{"position":[[480,7]]},"222":{"position":[[4233,7],[4675,10]]},"256":{"position":[[1064,8]]},"278":{"position":[[2144,8]]},"347":{"position":[[180,10],[1611,7]]},"368":{"position":[[1514,8]]},"370":{"position":[[1444,8]]},"406":{"position":[[1241,7]]},"432":{"position":[[508,8]]},"434":{"position":[[2299,7],[2879,7]]},"475":{"position":[[124,7]]}}}],["restart=no",{"_index":2483,"t":{"424":{"position":[[395,10]]}}}],["restrict",{"_index":477,"t":{"33":{"position":[[364,8]]},"170":{"position":[[1399,10]]},"194":{"position":[[706,8]]},"222":{"position":[[4826,11]]},"265":{"position":[[890,10]]},"267":{"position":[[287,10]]},"434":{"position":[[2789,8]]}}}],["result",{"_index":290,"t":{"17":{"position":[[904,9]]},"238":{"position":[[51,9],[1130,6]]},"240":{"position":[[451,6]]},"242":{"position":[[1492,6]]},"265":{"position":[[1494,7]]},"269":{"position":[[398,7]]},"280":{"position":[[188,6],[318,7]]},"282":{"position":[[4790,9],[5612,9],[6241,7],[7055,7]]},"289":{"position":[[2266,9]]},"292":{"position":[[117,7]]},"294":{"position":[[1399,8]]},"300":{"position":[[88,9]]},"347":{"position":[[624,6]]}}}],["retri",{"_index":25,"t":{"7":{"position":[[112,7],[207,8],[253,7]]},"31":{"position":[[116,5]]},"77":{"position":[[243,7],[389,5],[412,6],[470,10],[618,7],[764,5],[787,6],[845,10],[1137,7]]},"448":{"position":[[1059,6]]}}}],["retriev",{"_index":918,"t":{"102":{"position":[[170,8],[257,8]]},"104":{"position":[[102,9]]},"406":{"position":[[1182,8]]}}}],["retrymultipli",{"_index":230,"t":{"13":{"position":[[4296,18],[4366,18]]},"77":{"position":[[344,18],[719,18]]}}}],["return",{"_index":466,"t":{"33":{"position":[[116,7],[320,6],[468,7],[602,6]]},"86":{"position":[[241,7]]},"282":{"position":[[1171,7],[1349,9],[7044,6]]},"285":{"position":[[11,8]]},"294":{"position":[[563,7],[1212,6],[1378,6]]},"300":{"position":[[22,9]]},"347":{"position":[[459,6],[484,6],[525,6],[560,6],[2586,7],[2903,6],[3274,7]]},"380":{"position":[[260,7],[523,7]]},"389":{"position":[[73,8],[109,6],[755,6]]},"391":{"position":[[717,6],[1381,6],[1823,6],[1850,8],[1907,6],[1971,6],[2473,6],[2518,8]]},"393":{"position":[[521,8],[734,7],[1098,8],[2449,6],[2750,6],[2833,6],[2964,6]]},"396":{"position":[[908,8],[993,6]]},"398":{"position":[[429,8],[702,6],[2182,8],[2943,8]]},"414":{"position":[[322,6]]}}}],["revers",{"_index":823,"t":{"86":{"position":[[522,7]]},"96":{"position":[[562,7]]},"148":{"position":[[886,7]]},"190":{"position":[[1564,7]]},"210":{"position":[[738,7]]},"218":{"position":[[466,7]]}}}],["review",{"_index":2175,"t":{"378":{"position":[[229,6]]},"446":{"position":[[91,6]]}}}],["rich",{"_index":642,"t":{"61":{"position":[[1488,4]]},"448":{"position":[[2052,4]]}}}],["right",{"_index":491,"t":{"35":{"position":[[342,5]]},"53":{"position":[[367,5]]},"102":{"position":[[774,5]]},"265":{"position":[[1383,6]]},"269":{"position":[[287,6]]},"282":{"position":[[6690,5]]},"398":{"position":[[71,5]]},"442":{"position":[[551,5],[1513,5]]}}}],["risk",{"_index":913,"t":{"100":{"position":[[219,5]]},"190":{"position":[[3767,4],[3838,4]]},"294":{"position":[[1961,5]]}}}],["rm",{"_index":1309,"t":{"190":{"position":[[2740,2]]},"473":{"position":[[125,2]]}}}],["robin",{"_index":1767,"t":{"272":{"position":[[541,5]]}}}],["rock",{"_index":1685,"t":{"248":{"position":[[820,4],[939,4]]},"282":{"position":[[4573,4],[4635,4],[4906,4],[5522,4]]},"294":{"position":[[723,4],[906,4]]}}}],["rockski",{"_index":17,"t":{"4":{"position":[[70,7]]},"61":{"position":[[52,7],[69,7],[86,7],[948,8],[1278,7]]},"63":{"position":[[39,8],[75,7],[198,7]]},"66":{"position":[[636,7],[1122,9]]},"83":{"position":[[726,7]]},"182":{"position":[[26,8],[44,7],[61,7],[171,7],[285,7],[315,7]]},"184":{"position":[[37,7]]},"186":{"position":[[8,7],[265,7],[314,7],[418,7],[897,9]]},"298":{"position":[[340,8]]},"307":{"position":[[191,8]]},"448":{"position":[[362,7],[568,7]]}}}],["rocksky'",{"_index":623,"t":{"61":{"position":[[787,9],[845,9],[1353,9]]}}}],["rocksky.app",{"_index":657,"t":{"63":{"position":[[120,11]]}}}],["rocksky_handl",{"_index":674,"t":{"66":{"position":[[501,14]]}}}],["rocksky_key",{"_index":676,"t":{"66":{"position":[[598,11]]}}}],["rollup",{"_index":2158,"t":{"374":{"position":[[265,6],[431,6],[532,7],[621,9]]}}}],["rollup/wasm",{"_index":2162,"t":{"374":{"position":[[485,12]]}}}],["romanian",{"_index":2443,"t":{"420":{"position":[[1889,8]]}}}],["root",{"_index":2082,"t":{"362":{"position":[[279,5]]}}}],["round",{"_index":1766,"t":{"272":{"position":[[535,5]]}}}],["rout",{"_index":2390,"t":{"402":{"position":[[1104,6]]}}}],["router",{"_index":2396,"t":{"402":{"position":[[2328,6]]}}}],["row",{"_index":937,"t":{"102":{"position":[[709,3]]},"420":{"position":[[2961,4]]}}}],["rule",{"_index":1605,"t":{"238":{"position":[[1054,5],[1102,5]]},"240":{"position":[[240,6]]},"242":{"position":[[26,5],[147,5],[1387,4]]},"252":{"position":[[5,4],[390,4]]},"256":{"position":[[247,5]]},"276":{"position":[[238,4]]},"278":{"position":[[1138,5]]},"298":{"position":[[4,5]]},"307":{"position":[[235,5]]},"315":{"position":[[87,6],[124,5]]},"319":{"position":[[5,4]]},"322":{"position":[[165,4]]}}}],["run",{"_index":123,"t":{"13":{"position":[[391,4],[443,4],[679,3],[1050,10],[1123,3]]},"21":{"position":[[375,7]]},"45":{"position":[[178,3]]},"57":{"position":[[252,3]]},"108":{"position":[[882,7],[1051,7],[1214,7],[1304,3],[3349,7]]},"154":{"position":[[351,3]]},"170":{"position":[[102,3],[498,7],[715,7],[825,3]]},"190":{"position":[[1349,3],[1531,7],[1919,3],[2328,4],[2660,4],[2734,3],[3384,3]]},"240":{"position":[[147,7],[695,3],[734,4],[1016,3],[1060,3],[1299,3],[1319,3]]},"242":{"position":[[103,4],[1241,3],[1424,3]]},"282":{"position":[[1119,3],[1242,3],[4425,7]]},"309":{"position":[[133,3],[767,3],[787,3]]},"322":{"position":[[125,3],[176,3]]},"339":{"position":[[83,7],[383,7],[428,3]]},"341":{"position":[[253,7],[407,3]]},"360":{"position":[[199,3]]},"364":{"position":[[73,3],[106,3]]},"368":{"position":[[719,7],[818,7],[986,7],[1837,3],[2274,3],[2302,3],[2808,3],[3132,7],[3442,3]]},"370":{"position":[[369,3],[700,3]]},"372":{"position":[[66,3]]},"374":{"position":[[217,3],[241,3],[255,3],[1255,3]]},"380":{"position":[[290,7]]},"391":{"position":[[67,8]]},"402":{"position":[[1689,7],[2216,7]]},"404":{"position":[[316,7]]},"414":{"position":[[476,3],[533,4]]},"422":{"position":[[177,4]]},"424":{"position":[[385,3]]},"426":{"position":[[19,4],[241,3]]},"430":{"position":[[31,7]]},"444":{"position":[[15,7],[287,8]]},"473":{"position":[[151,3],[243,3]]}}}],["run/debug",{"_index":1998,"t":{"341":{"position":[[88,9]]}}}],["run/start",{"_index":2020,"t":{"347":{"position":[[759,9]]}}}],["run/user/uid/bus:/run/user/uid/bus:ro",{"_index":1217,"t":{"170":{"position":[[1236,38]]}}}],["run:exec",{"_index":2140,"t":{"368":{"position":[[3735,9]]}}}],["runtim",{"_index":2545,"t":{"462":{"position":[[53,7]]}}}],["rv:139.0",{"_index":2377,"t":{"402":{"position":[[563,9],[774,9]]}}}],["rvowkj1xtivmxglr",{"_index":453,"t":{"31":{"position":[[1274,19]]}}}],["rxbcaiyysxm",{"_index":2446,"t":{"420":{"position":[[1954,13]]}}}],["s",{"_index":1964,"t":{"322":{"position":[[243,7],[346,8]]},"326":{"position":[[49,16],[96,16]]}}}],["s)et",{"_index":1250,"t":{"178":{"position":[[179,10]]}}}],["s*(?<artist",{"_index":1398,"t":{"206":{"position":[[1782,21]]}}}],["safeti",{"_index":1511,"t":{"222":{"position":[[4410,7]]}}}],["salt",{"_index":2028,"t":{"347":{"position":[[1312,4]]}}}],["same",{"_index":70,"t":{"9":{"position":[[510,4]]},"39":{"position":[[425,4]]},"41":{"position":[[162,4]]},"47":{"position":[[162,4]]},"106":{"position":[[76,4]]},"112":{"position":[[1749,4],[1985,4]]},"118":{"position":[[533,4]]},"126":{"position":[[525,4]]},"138":{"position":[[316,4]]},"142":{"position":[[201,4]]},"150":{"position":[[157,4]]},"170":{"position":[[562,4],[864,4]]},"178":{"position":[[280,4]]},"190":{"position":[[1982,4],[2363,4],[2572,4]]},"206":{"position":[[921,4]]},"222":{"position":[[1308,4],[2346,4],[3283,4],[3499,5]]},"232":{"position":[[778,4]]},"236":{"position":[[1038,4]]},"238":{"position":[[1071,4]]},"240":{"position":[[645,4]]},"278":{"position":[[510,5]]},"282":{"position":[[2700,4]]},"289":{"position":[[1814,4]]},"368":{"position":[[1001,4],[1270,4]]},"402":{"position":[[1730,4],[1783,4],[1975,4]]},"404":{"position":[[125,4],[331,4]]},"412":{"position":[[176,4]]},"414":{"position":[[192,4]]},"430":{"position":[[235,4],[489,4]]},"444":{"position":[[139,4]]},"473":{"position":[[206,4]]}}}],["sampl",{"_index":2152,"t":{"370":{"position":[[871,6]]}}}],["satisfi",{"_index":1600,"t":{"238":{"position":[[352,9]]},"252":{"position":[[303,9]]},"276":{"position":[[673,9]]}}}],["save",{"_index":694,"t":{"70":{"position":[[197,4]]},"190":{"position":[[4038,4]]},"206":{"position":[[437,4]]},"222":{"position":[[2076,5],[2479,4],[4695,5]]},"426":{"position":[[0,4]]},"430":{"position":[[222,5]]}}}],["scagg",{"_index":1969,"t":{"328":{"position":[[65,7]]}}}],["scan",{"_index":2486,"t":{"426":{"position":[[153,4]]}}}],["scenario",{"_index":287,"t":{"17":{"position":[[745,8]]},"75":{"position":[[0,9]]},"170":{"position":[[892,8]]},"190":{"position":[[2048,8]]},"226":{"position":[[725,8]]},"240":{"position":[[864,9]]},"263":{"position":[[7,8]]},"289":{"position":[[1409,8]]},"313":{"position":[[223,10]]},"332":{"position":[[397,10]]},"370":{"position":[[84,9]]},"398":{"position":[[15,9]]},"446":{"position":[[213,9]]}}}],["schema",{"_index":209,"t":{"13":{"position":[[3936,6]]},"31":{"position":[[669,6],[1024,6],[1424,6]]},"37":{"position":[[437,6],[747,6]]},"43":{"position":[[695,6],[1065,6]]},"51":{"position":[[850,6],[1175,6]]},"55":{"position":[[350,6],[631,6]]},"59":{"position":[[479,6],[816,6]]},"66":{"position":[[866,6],[1153,6]]},"73":{"position":[[987,6],[1258,6]]},"98":{"position":[[575,6],[861,6]]},"104":{"position":[[371,6],[693,6]]},"110":{"position":[[814,6],[1081,6]]},"114":{"position":[[230,6],[448,6]]},"120":{"position":[[462,6],[717,6]]},"122":{"position":[[2701,6],[3343,6]]},"128":{"position":[[409,6],[684,6]]},"130":{"position":[[856,6],[1166,6]]},"136":{"position":[[418,6],[629,6]]},"140":{"position":[[535,6],[905,6]]},"144":{"position":[[493,6],[818,6]]},"152":{"position":[[497,6],[708,6]]},"156":{"position":[[517,6],[854,6]]},"160":{"position":[[444,6],[725,6]]},"168":{"position":[[232,6],[505,6]]},"172":{"position":[[506,6],[753,6]]},"176":{"position":[[322,6],[605,6]]},"180":{"position":[[349,6],[601,6]]},"186":{"position":[[641,6],[928,6]]},"188":{"position":[[2715,6],[3279,6]]},"192":{"position":[[498,6],[871,6]]},"196":{"position":[[405,6],[719,6]]},"204":{"position":[[1949,6],[2284,6]]},"208":{"position":[[274,6],[508,6]]},"216":{"position":[[497,6],[744,6]]},"220":{"position":[[254,6],[472,6]]},"224":{"position":[[643,6],[1021,6]]}}}],["schvitz",{"_index":2445,"t":{"420":{"position":[[1916,7]]}}}],["scope",{"_index":1163,"t":{"148":{"position":[[948,5]]}}}],["scopes/permissions/gr",{"_index":1512,"t":{"222":{"position":[[4442,25]]}}}],["score",{"_index":1721,"t":{"265":{"position":[[89,5]]},"278":{"position":[[820,7]]},"282":{"position":[[6634,5]]},"285":{"position":[[54,5],[120,5],[160,5],[219,8],[247,5]]},"289":{"position":[[1056,8],[1373,5],[2450,8],[2521,7],[2584,7],[2648,7],[2814,7],[2838,5],[2893,5],[3042,5],[3057,5],[3109,6],[3131,5]]},"292":{"position":[[147,6]]},"296":{"position":[[260,6]]}}}],["scrape",{"_index":2402,"t":{"406":{"position":[[609,8]]},"420":{"position":[[170,7],[517,11]]}}}],["screen",{"_index":1481,"t":{"222":{"position":[[1907,6],[4347,6]]}}}],["screenshot",{"_index":1251,"t":{"178":{"position":[[314,10]]}}}],["script",{"_index":2065,"t":{"360":{"position":[[19,6]]}}}],["scrobbabl",{"_index":826,"t":{"86":{"position":[[622,11]]},"92":{"position":[[90,10],[472,10],[538,10]]}}}],["scrobbl",{"_index":7,"t":{"2":{"position":[[99,12]]},"7":{"position":[[41,8],[81,8],[220,8],[286,9],[345,8]]},"9":{"position":[[81,8],[549,8],[747,8]]},"13":{"position":[[521,10],[584,8],[1515,8],[1610,8],[1638,8],[1694,8],[3198,8],[3293,8],[3321,8],[3377,8]]},"15":{"position":[[108,8],[166,8]]},"23":{"position":[[259,9],[317,9],[353,9],[1004,11],[1879,10],[1969,8],[2950,11]]},"31":{"position":[[154,8],[170,8]]},"35":{"position":[[29,8],[1025,8]]},"39":{"position":[[30,8],[119,9]]},"45":{"position":[[30,8]]},"57":{"position":[[30,8],[117,9]]},"61":{"position":[[29,8],[705,11],[924,8],[1133,9],[1257,10],[1316,8],[1387,9],[1539,8],[1612,8],[1685,8],[1721,8],[1798,9],[1844,8],[1870,8]]},"68":{"position":[[29,8],[154,9],[787,11],[1002,8],[1211,9],[1459,9],[1553,9]]},"75":{"position":[[22,8],[207,8],[273,8],[338,8],[519,8],[595,8],[783,9],[867,8],[935,8]]},"77":{"position":[[2104,9],[2252,8],[2488,8]]},"83":{"position":[[16,8],[47,8],[86,8]]},"86":{"position":[[314,10],[961,9],[1002,8],[1085,11],[1138,8],[1192,9],[1284,9]]},"90":{"position":[[37,8],[170,8],[387,8]]},"92":{"position":[[284,8]]},"94":{"position":[[196,8],[361,9],[453,8],[556,10],[739,8],[787,8]]},"96":{"position":[[0,10],[153,8],[197,9],[977,8],[1025,10],[1138,8],[1222,10],[1405,8],[1453,8],[1541,10],[1772,8],[1856,8]]},"98":{"position":[[192,8],[264,8]]},"106":{"position":[[635,10]]},"108":{"position":[[125,8],[706,11],[1573,10]]},"110":{"position":[[280,8],[391,8],[472,8],[575,8]]},"112":{"position":[[61,11],[598,10],[659,8],[689,10],[723,9],[740,8],[788,10],[901,8],[985,10],[1166,8],[1214,8],[1265,10],[1373,8],[1469,8]]},"122":{"position":[[573,8],[708,8],[765,8],[1018,8],[1088,8],[1676,8],[1775,8],[1849,8],[1933,9],[2019,9],[2108,9]]},"130":{"position":[[39,8],[68,9],[133,8]]},"132":{"position":[[46,9],[127,8],[192,8]]},"134":{"position":[[84,9],[172,10]]},"136":{"position":[[282,9]]},"138":{"position":[[34,8],[58,9],[118,8],[184,9]]},"142":{"position":[[35,8],[59,9],[119,8]]},"146":{"position":[[46,9],[132,8],[207,8]]},"148":{"position":[[89,9],[203,11],[330,8]]},"152":{"position":[[276,10],[361,9]]},"154":{"position":[[46,8],[75,9],[140,8],[216,9]]},"158":{"position":[[14,8]]},"162":{"position":[[165,8]]},"164":{"position":[[38,10],[419,10]]},"166":{"position":[[264,8],[422,9],[534,8]]},"170":{"position":[[267,8]]},"172":{"position":[[230,8],[309,8]]},"182":{"position":[[14,8],[179,9],[213,9],[293,9]]},"184":{"position":[[108,8]]},"188":{"position":[[156,8],[410,8],[676,9],[818,9],[948,9],[1028,9],[1323,9],[1406,8],[1813,8],[1904,8],[1974,8],[2054,9],[2136,9],[2221,9]]},"190":{"position":[[366,8]]},"194":{"position":[[370,10],[507,8],[715,10]]},"198":{"position":[[14,8],[126,9],[258,9],[292,9],[372,9]]},"200":{"position":[[108,8]]},"204":{"position":[[81,9],[575,9],[795,9],[1004,9],[1213,9]]},"214":{"position":[[29,9],[46,9]]},"216":{"position":[[180,8],[269,8]]},"218":{"position":[[78,10],[219,8],[263,9]]},"222":{"position":[[216,8],[345,10]]},"226":{"position":[[55,8],[302,8],[708,9],[884,11]]},"228":{"position":[[38,8],[457,9],[482,8],[635,9],[746,9],[783,8],[817,8]]},"230":{"position":[[211,8]]},"232":{"position":[[221,8],[397,9],[445,10],[508,9],[530,9],[978,8]]},"248":{"position":[[710,8]]},"250":{"position":[[1135,8]]},"256":{"position":[[964,8]]},"265":{"position":[[524,9]]},"276":{"position":[[795,8]]},"278":{"position":[[900,8],[2004,8]]},"280":{"position":[[281,8]]},"282":{"position":[[63,8],[1849,8],[2098,8],[2438,9],[2776,8],[3309,8],[3637,8],[4331,8],[5984,8]]},"289":{"position":[[1161,9],[1287,9],[1422,8],[2238,8]]},"294":{"position":[[33,8],[244,8],[430,8],[554,8],[1303,8],[1417,9],[1495,10],[1661,10],[1725,8],[1820,8]]},"300":{"position":[[107,8],[238,8]]},"307":{"position":[[24,8],[122,8],[161,8],[788,8]]},"311":{"position":[[168,8]]},"349":{"position":[[112,11]]},"380":{"position":[[938,8]]},"393":{"position":[[355,10],[914,9],[1486,9],[2732,9],[2954,9]]},"396":{"position":[[27,8]]},"398":{"position":[[131,10],[169,8],[241,9],[330,8],[455,9],[1026,8],[1644,10],[1904,11],[2032,8],[2302,11],[2504,10],[2561,10],[3026,10],[3198,11],[3264,8],[3656,9],[3759,9],[3899,10],[3949,10],[3964,8],[4029,10]]},"412":{"position":[[243,9]]},"420":{"position":[[99,9],[361,9],[709,9],[895,9],[1215,8],[1250,8],[3103,9],[3164,9]]},"430":{"position":[[398,10]]},"434":{"position":[[1340,10],[1451,10],[1524,10],[1593,8],[2397,10],[2798,10],[3064,10],[3110,10],[3202,8]]},"436":{"position":[[155,9]]},"442":{"position":[[32,10],[64,8]]},"444":{"position":[[343,8]]},"446":{"position":[[376,8],[487,9]]},"448":{"position":[[20,8],[106,10],[498,10],[600,8],[812,8],[879,11],[1039,9],[1429,8],[1684,8],[1774,10],[1799,8],[1969,9],[2019,9],[2084,8],[2230,9],[2314,8]]},"450":{"position":[[202,10]]},"452":{"position":[[408,8],[448,9]]},"454":{"position":[[99,12]]}}}],["scrobblabl",{"_index":1554,"t":{"228":{"position":[[162,12]]}}}],["scrobble'",{"_index":1722,"t":{"265":{"position":[[252,10]]},"280":{"position":[[160,10]]}}}],["scrobble/play",{"_index":1572,"t":{"232":{"position":[[593,13]]}}}],["scrobblecli",{"_index":2364,"t":{"398":{"position":[[3309,15]]}}}],["scrobbler",{"_index":20,"t":{"7":{"position":[[9,9]]},"9":{"position":[[6,9],[229,9]]},"13":{"position":[[809,10],[840,9]]},"17":{"position":[[44,9],[275,9],[925,9],[1377,9],[1820,10],[1925,10]]},"23":{"position":[[6,9],[415,10],[3095,9],[3150,9],[3217,10],[3466,9]]},"29":{"position":[[6,9]]},"31":{"position":[[699,9],[1052,9],[1455,9]]},"35":{"position":[[597,9],[827,9],[1532,10],[1603,9]]},"39":{"position":[[167,9]]},"41":{"position":[[70,9],[217,9],[273,9]]},"47":{"position":[[70,9],[217,9],[273,9]]},"57":{"position":[[165,9]]},"61":{"position":[[695,9]]},"66":{"position":[[27,9],[348,9]]},"68":{"position":[[777,9],[1691,9]]},"73":{"position":[[39,9],[486,9]]},"77":{"position":[[1361,9]]},"86":{"position":[[33,9],[395,10],[448,9],[895,9],[1234,9]]},"90":{"position":[[515,9]]},"94":{"position":[[145,9],[244,9]]},"96":{"position":[[187,9],[1510,9]]},"102":{"position":[[84,9]]},"108":{"position":[[88,9],[896,9],[1421,9]]},"112":{"position":[[293,9],[501,9],[1333,9],[2080,9]]},"116":{"position":[[19,9]]},"118":{"position":[[260,9],[697,9]]},"122":{"position":[[67,9],[275,9],[553,9],[745,9],[998,9],[1075,9]]},"124":{"position":[[19,9]]},"126":{"position":[[256,9],[689,9]]},"130":{"position":[[492,9]]},"132":{"position":[[26,9]]},"134":{"position":[[54,9]]},"138":{"position":[[232,9]]},"140":{"position":[[107,9]]},"144":{"position":[[108,9]]},"146":{"position":[[26,9]]},"148":{"position":[[54,9],[348,10],[867,9],[1001,10]]},"150":{"position":[[192,9]]},"154":{"position":[[264,9]]},"156":{"position":[[112,9]]},"160":{"position":[[106,9]]},"162":{"position":[[151,9],[613,9],[998,9]]},"164":{"position":[[168,9],[404,9]]},"166":{"position":[[152,9],[243,9],[511,9]]},"170":{"position":[[224,9],[411,9],[485,9],[702,9],[837,9]]},"186":{"position":[[296,9]]},"188":{"position":[[127,9],[1386,9]]},"190":{"position":[[491,10],[1022,9],[1332,10],[1545,9],[1700,9],[1803,9],[1929,10],[2138,9],[2310,9],[2526,9],[2832,9],[2936,9],[3211,9],[3477,9],[4002,9],[4246,10]]},"204":{"position":[[1556,9]]},"206":{"position":[[1084,9],[1209,9],[2052,9],[2154,9]]},"210":{"position":[[566,9]]},"218":{"position":[[253,9],[335,9]]},"222":{"position":[[4951,9]]},"226":{"position":[[6,9],[902,9]]},"228":{"position":[[56,10]]},"232":{"position":[[817,9]]},"252":{"position":[[421,9]]},"254":{"position":[[86,9]]},"256":{"position":[[622,10],[653,9],[685,9]]},"265":{"position":[[121,9],[1544,9]]},"272":{"position":[[520,9],[664,9]]},"278":{"position":[[1519,10],[1550,9],[1582,9]]},"282":{"position":[[930,9],[1755,9],[1914,9],[2158,9],[3187,9],[3395,9],[3694,9]]},"300":{"position":[[46,9]]},"315":{"position":[[443,9]]},"337":{"position":[[6,9]]},"339":{"position":[[322,9]]},"362":{"position":[[682,9],[825,9],[881,9],[926,9]]},"368":{"position":[[372,10],[403,9],[435,9],[1479,9],[1885,9],[1952,10],[2336,9],[2397,10],[2864,9],[2925,10],[3663,10],[3694,9]]},"370":{"position":[[386,9],[683,9],[717,9],[838,9],[953,10],[984,9],[1016,9]]},"372":{"position":[[53,9]]},"374":{"position":[[143,9]]},"393":{"position":[[3084,10]]},"402":{"position":[[55,9],[154,10],[185,9],[218,9],[1222,9],[1277,9],[1476,9],[1751,10],[1864,9],[2047,10],[2203,9]]},"404":{"position":[[172,9],[299,9]]},"406":{"position":[[27,9],[933,9],[1222,9]]},"412":{"position":[[156,9]]},"414":{"position":[[283,10]]},"420":{"position":[[46,9],[295,9],[420,9],[558,9]]},"424":{"position":[[36,9],[266,9]]},"426":{"position":[[196,9]]},"428":{"position":[[57,9]]},"430":{"position":[[50,9],[287,9],[388,9],[459,9]]},"432":{"position":[[30,9],[151,10],[182,9],[214,9]]},"434":{"position":[[45,9],[1095,10],[1221,9],[1611,9],[1738,9],[1965,9],[2893,9],[3222,9],[3983,10],[4118,9]]},"436":{"position":[[6,9]]},"442":{"position":[[49,9],[782,9],[1162,9],[1764,9],[2068,9],[2240,10],[2311,9]]},"444":{"position":[[34,9],[270,9]]},"446":{"position":[[156,9]]},"448":{"position":[[1322,10],[1371,9],[2136,9]]},"471":{"position":[[17,9],[463,9]]},"473":{"position":[[98,9],[134,9],[168,9],[253,10]]},"475":{"position":[[138,10]]}}}],["scrobbler'",{"_index":317,"t":{"19":{"position":[[27,11]]},"170":{"position":[[1708,11]]},"190":{"position":[[2240,11]]},"226":{"position":[[189,11]]},"250":{"position":[[162,11]]},"444":{"position":[[612,11]]}}}],["scrobbler.app",{"_index":1293,"t":{"190":{"position":[[1390,13]]}}}],["scrobbler.app/callback",{"_index":1328,"t":{"190":{"position":[[3945,22]]}}}],["scrobbler.git",{"_index":1994,"t":{"339":{"position":[[297,13]]},"374":{"position":[[118,13]]}}}],["scrobbler.mydomain.com/callback",{"_index":2495,"t":{"434":{"position":[[1035,31]]}}}],["scrobbler.servic",{"_index":2475,"t":{"424":{"position":[[137,17],[222,18]]},"426":{"position":[[78,17],[125,17]]}}}],["scrobbler/directori",{"_index":2481,"t":{"424":{"position":[[351,19]]}}}],["scrobbler:0.9.7",{"_index":2555,"t":{"471":{"position":[[575,15]]}}}],["scrobbler:latest",{"_index":2107,"t":{"368":{"position":[[162,16],[216,16]]},"473":{"position":[[53,16]]}}}],["scrobblesourc",{"_index":2238,"t":{"387":{"position":[[396,15]]}}}],["scrobblesources.t",{"_index":2234,"t":{"387":{"position":[[198,18]]}}}],["scrobblethreshold",{"_index":222,"t":{"13":{"position":[[4194,21]]},"92":{"position":[[429,21]]}}}],["search",{"_index":314,"t":{"17":{"position":[[1844,6]]},"234":{"position":[[190,6]]},"278":{"position":[[606,9],[764,6],[1641,8]]},"280":{"position":[[239,9]]},"282":{"position":[[10,8],[38,6],[277,6],[471,9],[584,6],[712,7],[829,6],[908,6],[944,6],[1016,6],[1064,6],[1096,6],[1363,6],[1450,6],[1566,8],[1701,6],[1928,6],[2019,6],[2172,6],[2265,6],[2373,6],[2579,6],[2750,6],[2937,6],[3202,6],[3409,6],[3538,6],[3938,6],[4826,7],[5013,6],[5296,7],[5648,7],[5803,6],[5944,6],[6056,6],[6376,6],[6915,6],[6938,6],[7022,6]]},"285":{"position":[[97,6]]},"292":{"position":[[1039,6],[1077,6]]},"294":{"position":[[92,6],[981,6],[1365,8],[1927,6]]},"309":{"position":[[61,6]]},"311":{"position":[[120,8],[220,8],[373,6],[844,8],[890,8],[1128,6]]},"313":{"position":[[20,6]]},"315":{"position":[[38,6]]},"317":{"position":[[2,6],[453,9],[659,9]]},"319":{"position":[[30,6],[328,9]]},"322":{"position":[[54,6],[135,6],[233,9]]},"328":{"position":[[25,9]]},"330":{"position":[[23,9]]},"332":{"position":[[82,6],[681,9]]},"436":{"position":[[669,8]]},"438":{"position":[[402,8]]},"448":{"position":[[619,6]]}}}],["searchartistmethod",{"_index":1824,"t":{"282":{"position":[[3855,19],[4010,21],[4055,18],[5092,21],[5881,21]]},"292":{"position":[[1136,21]]},"305":{"position":[[405,21]]},"309":{"position":[[502,21]]},"311":{"position":[[790,21]]}}}],["searchord",{"_index":1779,"t":{"276":{"position":[[1173,14]]},"278":{"position":[[487,11],[548,12],[571,11],[724,11],[785,11],[1689,11]]},"282":{"position":[[1489,11],[1630,14],[1719,11],[2037,14],[2293,14],[2620,14],[2978,14],[3462,12],[3575,14],[3795,11],[3983,14],[5065,14],[5854,14],[6971,14]]},"292":{"position":[[1092,14]]},"305":{"position":[[436,14]]},"309":{"position":[[534,14]]},"311":{"position":[[899,14],[1135,14]]}}}],["searchwhenmiss",{"_index":1804,"t":{"282":{"position":[[342,17]]}}}],["searchwithmiss",{"_index":1806,"t":{"282":{"position":[[632,20]]}}}],["second",{"_index":735,"t":{"77":{"position":[[447,7],[822,7]]},"92":{"position":[[505,7]]},"389":{"position":[[843,7]]},"391":{"position":[[1416,6]]},"393":{"position":[[2141,7]]}}}],["secondari",{"_index":358,"t":{"23":{"position":[[226,9],[458,9],[774,9],[1215,9],[1531,9],[2155,9],[2463,9]]},"287":{"position":[[836,9]]}}}],["secondgotifyserv",{"_index":444,"t":{"31":{"position":[[530,21]]}}}],["secret",{"_index":284,"t":{"17":{"position":[[614,9],[1069,9],[1623,8]]},"39":{"position":[[515,6]]},"43":{"position":[[156,6],[573,9],[923,9]]},"45":{"position":[[267,6]]},"51":{"position":[[260,6],[751,9],[1055,9]]},"77":{"position":[[3603,9]]},"79":{"position":[[1969,9]]},"140":{"position":[[413,9],[763,9]]},"144":{"position":[[394,9],[698,9]]},"190":{"position":[[4146,7]]},"222":{"position":[[2509,7],[2929,7]]},"224":{"position":[[207,6]]},"404":{"position":[[24,7]]},"434":{"position":[[3474,6],[3855,9]]},"436":{"position":[[1802,9]]},"440":{"position":[[1019,9]]}}}],["section",{"_index":186,"t":{"13":{"position":[[2366,9]]},"15":{"position":[[270,7]]},"39":{"position":[[476,8]]},"49":{"position":[[144,7]]},"118":{"position":[[464,7]]},"126":{"position":[[469,7]]},"170":{"position":[[666,7]]},"190":{"position":[[4220,7]]},"206":{"position":[[270,7]]},"222":{"position":[[3187,7],[3764,7]]},"246":{"position":[[13,8]]},"256":{"position":[[382,8]]},"274":{"position":[[57,7]]},"278":{"position":[[1273,8]]},"280":{"position":[[34,7],[137,8]]},"357":{"position":[[57,7]]},"396":{"position":[[957,7]]},"398":{"position":[[1885,7]]},"416":{"position":[[305,7],[422,7]]},"434":{"position":[[252,7],[849,7],[1823,7],[2628,7],[3289,7]]},"436":{"position":[[468,7],[970,7],[1113,7],[1255,7],[1393,7],[1587,7],[1650,7]]},"438":{"position":[[201,7]]},"440":{"position":[[187,7],[330,7],[472,7],[610,7],[804,7],[867,7]]},"442":{"position":[[726,7],[1106,7],[2012,7]]}}}],["secur",{"_index":424,"t":{"27":{"position":[[65,8]]},"70":{"position":[[141,8]]},"170":{"position":[[808,6]]}}}],["see",{"_index":157,"t":{"13":{"position":[[1352,3],[3036,3]]},"15":{"position":[[0,3]]},"35":{"position":[[934,3]]},"86":{"position":[[1302,4]]},"94":{"position":[[101,3]]},"106":{"position":[[646,3]]},"108":{"position":[[1647,4]]},"130":{"position":[[185,3]]},"158":{"position":[[68,3]]},"164":{"position":[[201,3]]},"170":{"position":[[639,3]]},"186":{"position":[[0,3]]},"202":{"position":[[0,3]]},"222":{"position":[[356,3],[403,3]]},"232":{"position":[[137,3],[375,3]]},"238":{"position":[[792,3]]},"246":{"position":[[0,3]]},"282":{"position":[[1359,3]]},"292":{"position":[[108,3]]},"300":{"position":[[425,3]]},"347":{"position":[[3255,3]]},"366":{"position":[[70,3]]},"368":{"position":[[749,3],[848,3]]},"370":{"position":[[4,3],[848,3]]},"372":{"position":[[19,3]]},"374":{"position":[[666,3]]},"376":{"position":[[115,3]]},"393":{"position":[[2867,3]]},"398":{"position":[[1466,3],[1872,3],[2352,3]]},"402":{"position":[[1136,3],[2439,3]]},"406":{"position":[[7,3]]},"409":{"position":[[7,3]]},"418":{"position":[[80,3]]},"434":{"position":[[3248,3]]},"444":{"position":[[70,3],[410,3]]},"446":{"position":[[0,3],[223,3]]},"456":{"position":[[0,3]]},"458":{"position":[[0,3]]},"460":{"position":[[0,3]]}}}],["seem",{"_index":1474,"t":{"222":{"position":[[1393,4]]}}}],["seen",{"_index":1555,"t":{"228":{"position":[[279,5],[409,4],[660,5],[833,4]]},"232":{"position":[[503,4]]},"393":{"position":[[2900,4]]},"398":{"position":[[480,4],[738,5],[778,5],[2072,4],[2925,4]]},"420":{"position":[[1765,4]]}}}],["select",{"_index":936,"t":{"102":{"position":[[682,6]]},"206":{"position":[[203,6],[334,6]]},"222":{"position":[[4431,6],[4486,6],[4526,6]]},"278":{"position":[[68,9]]},"280":{"position":[[329,6]]},"287":{"position":[[210,8]]},"298":{"position":[[42,12]]},"436":{"position":[[682,7]]},"438":{"position":[[415,7]]}}}],["self",{"_index":1320,"t":{"190":{"position":[[3517,4]]},"234":{"position":[[57,4]]},"380":{"position":[[38,4]]},"448":{"position":[[2389,4]]}}}],["send",{"_index":636,"t":{"61":{"position":[[1329,4]]},"86":{"position":[[376,4]]},"226":{"position":[[289,7]]},"232":{"position":[[210,7]]},"294":{"position":[[1691,7]]},"380":{"position":[[901,5],[1052,4]]},"406":{"position":[[91,4]]},"450":{"position":[[193,5]]}}}],["sensibl",{"_index":1793,"t":{"278":{"position":[[909,8],[932,8],[1655,8]]},"280":{"position":[[75,8]]},"305":{"position":[[26,8]]},"307":{"position":[[483,8]]},"309":{"position":[[34,8]]},"311":{"position":[[322,9],[603,9]]}}}],["sensit",{"_index":267,"t":{"17":{"position":[[155,9]]}}}],["sent",{"_index":1323,"t":{"190":{"position":[[3601,4],[3672,4]]},"298":{"position":[[173,4]]},"398":{"position":[[3006,4]]}}}],["separ",{"_index":1105,"t":{"122":{"position":[[1629,9],[1719,9],[1820,9],[1895,9],[1982,9],[2068,9]]},"188":{"position":[[1770,9],[1852,9],[1945,9],[2016,9],[2099,9],[2181,9]]},"194":{"position":[[220,9]]},"280":{"position":[[378,8]]},"294":{"position":[[796,9]]},"420":{"position":[[1041,9]]},"448":{"position":[[1923,9]]}}}],["sept",{"_index":1472,"t":{"222":{"position":[[1360,4]]}}}],["serivc",{"_index":1338,"t":{"194":{"position":[[353,7]]}}}],["serv",{"_index":1984,"t":{"337":{"position":[[234,6]]},"368":{"position":[[1494,5]]},"370":{"position":[[124,7]]},"374":{"position":[[1291,6]]},"430":{"position":[[146,6]]}}}],["server",{"_index":170,"t":{"13":{"position":[[1669,7],[3352,7]]},"27":{"position":[[150,6]]},"31":{"position":[[53,7]]},"33":{"position":[[174,6]]},"35":{"position":[[106,6],[191,6]]},"37":{"position":[[205,6]]},"53":{"position":[[15,6],[518,6]]},"57":{"position":[[194,7],[278,6]]},"59":{"position":[[220,6]]},"61":{"position":[[363,8]]},"68":{"position":[[244,8],[445,8]]},"75":{"position":[[106,6],[193,6],[499,6],[570,6],[807,8],[847,6],[969,6]]},"96":{"position":[[232,6]]},"116":{"position":[[74,6]]},"120":{"position":[[150,6]]},"122":{"position":[[1305,6]]},"128":{"position":[[144,6]]},"130":{"position":[[153,7]]},"132":{"position":[[105,7]]},"134":{"position":[[156,6]]},"146":{"position":[[110,7]]},"148":{"position":[[187,6]]},"154":{"position":[[167,7],[293,7],[377,6]]},"158":{"position":[[35,7]]},"162":{"position":[[27,6],[382,7]]},"178":{"position":[[74,6],[108,6],[193,6],[301,6],[352,6]]},"180":{"position":[[138,6]]},"188":{"position":[[1661,6]]},"190":{"position":[[2679,6]]},"196":{"position":[[169,6]]},"198":{"position":[[216,8]]},"272":{"position":[[377,7],[491,6],[621,6],[712,7],[765,8],[938,6],[986,6]]},"337":{"position":[[146,6]]},"347":{"position":[[1846,6]]},"402":{"position":[[259,6],[892,6],[994,6],[1735,6]]},"442":{"position":[[199,6],[1277,6],[1362,6]]},"448":{"position":[[925,6]]}}}],["servers/mirror",{"_index":1765,"t":{"272":{"position":[[419,15]]}}}],["servic",{"_index":140,"t":{"13":{"position":[[793,9]]},"23":{"position":[[1854,8],[3201,9]]},"68":{"position":[[142,7]]},"86":{"position":[[227,7],[479,8],[1147,8]]},"124":{"position":[[141,8]]},"190":{"position":[[3797,7]]},"194":{"position":[[490,7]]},"198":{"position":[[114,7]]},"204":{"position":[[154,7],[251,7],[451,7],[542,8],[1248,9]]},"222":{"position":[[1435,8],[1869,9]]},"226":{"position":[[475,7]]},"228":{"position":[[792,7]]},"232":{"position":[[473,7]]},"256":{"position":[[606,9]]},"265":{"position":[[866,8],[1113,8]]},"267":{"position":[[263,8]]},"269":{"position":[[17,8]]},"278":{"position":[[1503,9]]},"292":{"position":[[367,9]]},"347":{"position":[[1489,7],[2429,7],[2516,7]]},"349":{"position":[[605,7]]},"368":{"position":[[356,9],[1936,9],[2381,9],[2909,9],[3647,9]]},"370":{"position":[[937,9]]},"378":{"position":[[174,7]]},"380":{"position":[[279,7],[1041,7]]},"393":{"position":[[446,8],[539,8],[1123,7],[1310,7]]},"396":{"position":[[83,7]]},"398":{"position":[[153,7],[499,7],[1076,7],[1272,7],[1355,8],[3325,7],[3716,7]]},"402":{"position":[[296,9],[2411,7]]},"404":{"position":[[103,8]]},"406":{"position":[[795,7]]},"422":{"position":[[22,7],[164,7]]},"424":{"position":[[13,7],[297,9]]},"426":{"position":[[166,8],[211,7],[230,7],[278,7]]},"428":{"position":[[77,7]]},"432":{"position":[[135,9]]},"442":{"position":[[12,8]]},"448":{"position":[[1408,7]]},"452":{"position":[[157,8]]}}}],["service'",{"_index":2035,"t":{"347":{"position":[[1836,9]]}}}],["service.md",{"_index":2155,"t":{"372":{"position":[[23,10]]}}}],["service/appl",{"_index":821,"t":{"86":{"position":[[147,20],[353,19]]}}}],["serviceallow",{"_index":1350,"t":{"204":{"position":[[0,12],[346,12],[967,15],[1406,15],[1871,15],[2186,15]]}}}],["servicedeni",{"_index":1351,"t":{"204":{"position":[[17,11],[378,11],[1176,14],[1899,14],[2214,14]]}}}],["services/mus",{"_index":2490,"t":{"434":{"position":[[16,14]]}}}],["session",{"_index":546,"t":{"43":{"position":[[340,7]]},"51":{"position":[[426,7]]},"170":{"position":[[931,7]]},"222":{"position":[[882,7],[914,7],[1247,8]]},"406":{"position":[[855,7],[994,7],[1068,7]]}}}],["sessions/tokens/etc",{"_index":375,"t":{"23":{"position":[[1091,22]]}}}],["set",{"_index":67,"t":{"9":{"position":[[441,3],[876,3]]},"13":{"position":[[3523,7]]},"17":{"position":[[754,3]]},"21":{"position":[[171,3],[337,3]]},"23":{"position":[[717,7],[1474,7]]},"25":{"position":[[103,3],[408,3],[519,3]]},"31":{"position":[[729,7],[1082,7]]},"35":{"position":[[220,8],[675,3],[1559,3]]},"39":{"position":[[440,3]]},"41":{"position":[[599,8]]},"47":{"position":[[593,8]]},"51":{"position":[[100,3]]},"53":{"position":[[248,3]]},"70":{"position":[[117,8]]},"94":{"position":[[585,3],[717,3],[765,3]]},"96":{"position":[[328,8],[1251,3],[1383,3],[1431,3],[1525,3],[1589,8],[1938,3]]},"108":{"position":[[2072,7],[2673,3]]},"110":{"position":[[174,3]]},"112":{"position":[[1014,3],[1144,3],[1192,3],[1426,3],[1955,3]]},"118":{"position":[[35,3],[395,8],[764,4]]},"120":{"position":[[219,3],[284,3]]},"124":{"position":[[129,8],[237,4]]},"126":{"position":[[33,3],[389,8],[754,4]]},"128":{"position":[[181,3],[215,3]]},"148":{"position":[[397,3]]},"162":{"position":[[390,3],[1065,4]]},"174":{"position":[[100,8]]},"178":{"position":[[115,3],[144,8]]},"180":{"position":[[121,3]]},"188":{"position":[[559,8]]},"190":{"position":[[815,3],[834,8],[1639,3],[2793,3]]},"206":{"position":[[153,8],[404,3],[685,7],[730,3]]},"212":{"position":[[372,3],[454,3]]},"216":{"position":[[95,3]]},"222":{"position":[[1648,7],[3307,3],[3392,7]]},"236":{"position":[[1098,4],[1881,3]]},"265":{"position":[[1623,3]]},"272":{"position":[[135,3]]},"276":{"position":[[861,3]]},"282":{"position":[[1446,3],[4081,3]]},"285":{"position":[[116,3],[146,3]]},"287":{"position":[[1877,3]]},"289":{"position":[[1792,4]]},"339":{"position":[[352,4]]},"341":{"position":[[35,8]]},"345":{"position":[[371,8]]},"347":{"position":[[2044,3],[2156,3],[2258,3]]},"357":{"position":[[0,3]]},"360":{"position":[[518,8]]},"368":{"position":[[892,3],[968,3],[1119,3],[2657,3],[3007,3],[3552,7]]},"374":{"position":[[176,3]]},"383":{"position":[[660,8]]},"396":{"position":[[221,3],[225,7]]},"398":{"position":[[641,7]]},"402":{"position":[[1489,7]]},"406":{"position":[[1197,3]]},"420":{"position":[[1615,3]]},"428":{"position":[[40,7]]},"434":{"position":[[187,7],[605,3],[2022,3]]},"442":{"position":[[432,3],[1391,8],[2267,3]]},"444":{"position":[[97,7],[367,3]]},"446":{"position":[[307,3]]},"450":{"position":[[4,3]]}}}],["set('author",{"_index":2304,"t":{"391":{"position":[[2420,21]]},"393":{"position":[[1995,21]]},"396":{"position":[[806,21]]}}}],["setup",{"_index":130,"t":{"13":{"position":[[559,5],[1735,5],[3418,5],[3456,5]]},"23":{"position":[[2112,5]]},"35":{"position":[[92,5]]},"53":{"position":[[0,5],[64,5]]},"130":{"position":[[234,6],[297,5],[606,5]]},"134":{"position":[[214,5]]},"140":{"position":[[223,5]]},"144":{"position":[[225,5]]},"148":{"position":[[363,5],[524,5],[855,5]]},"150":{"position":[[87,6]]},"156":{"position":[[233,5]]},"158":{"position":[[118,6],[181,5]]},"160":{"position":[[222,5]]},"170":{"position":[[369,6],[589,5],[615,5]]},"178":{"position":[[81,6],[200,5],[308,5]]},"184":{"position":[[11,5]]},"186":{"position":[[51,6],[114,5],[412,5]]},"200":{"position":[[11,5]]},"202":{"position":[[51,6],[115,5]]},"204":{"position":[[1672,5]]},"222":{"position":[[5337,5]]},"265":{"position":[[1585,6]]},"368":{"position":[[772,5],[871,5],[2061,6]]},"385":{"position":[[57,5]]},"422":{"position":[[139,5]]},"434":{"position":[[1574,5],[3038,6],[3275,5]]},"436":{"position":[[222,5],[1545,5]]},"440":{"position":[[762,5]]},"442":{"position":[[184,5],[248,5],[1263,5]]},"446":{"position":[[370,5]]},"448":{"position":[[1848,5],[2323,5]]}}}],["setup.sh",{"_index":2068,"t":{"360":{"position":[[251,10]]},"362":{"position":[[18,8]]},"364":{"position":[[51,9]]}}}],["sevenhtml",{"_index":1066,"t":{"112":{"position":[[1924,12]]}}}],["sever",{"_index":1476,"t":{"222":{"position":[[1498,7]]},"236":{"position":[[1090,7]]},"287":{"position":[[10,7]]}}}],["shape",{"_index":2007,"t":{"345":{"position":[[66,6]]},"347":{"position":[[928,5]]}}}],["share",{"_index":542,"t":{"43":{"position":[[149,6]]},"51":{"position":[[253,6]]},"61":{"position":[[256,5]]},"68":{"position":[[338,5]]},"75":{"position":[[663,6]]},"116":{"position":[[196,5]]},"343":{"position":[[81,6],[423,5]]}}}],["shortcut",{"_index":414,"t":{"25":{"position":[[141,8]]}}}],["shorter",{"_index":1058,"t":{"112":{"position":[[1432,7]]},"190":{"position":[[224,7]]}}}],["show",{"_index":369,"t":{"23":{"position":[[817,4],[1574,4],[2198,4]]},"170":{"position":[[146,5]]},"206":{"position":[[148,4]]},"244":{"position":[[491,5]]},"444":{"position":[[461,4],[600,5]]}}}],["shown",{"_index":695,"t":{"70":{"position":[[231,5]]},"98":{"position":[[144,5]]},"102":{"position":[[532,5]]},"112":{"position":[[1761,5]]},"130":{"position":[[450,5]]},"138":{"position":[[370,5]]},"140":{"position":[[63,5]]},"142":{"position":[[255,5]]},"144":{"position":[[63,5]]},"156":{"position":[[63,5]]},"160":{"position":[[63,5]]},"178":{"position":[[288,5]]},"186":{"position":[[252,5]]},"204":{"position":[[1512,5]]},"206":{"position":[[313,5]]},"254":{"position":[[140,5]]},"256":{"position":[[26,5]]},"278":{"position":[[26,5]]},"305":{"position":[[17,5]]}}}],["side",{"_index":2421,"t":{"420":{"position":[[453,4]]}}}],["side(",{"_index":1578,"t":{"232":{"position":[[1183,7]]}}}],["sidebar",{"_index":935,"t":{"102":{"position":[[670,7]]},"246":{"position":[[58,9]]}}}],["sign",{"_index":658,"t":{"63":{"position":[[136,4]]},"222":{"position":[[5098,4]]}}}],["signal",{"_index":2335,"t":{"393":{"position":[[2915,10]]}}}],["silo",{"_index":2541,"t":{"448":{"position":[[1876,4]]}}}],["similar",{"_index":1317,"t":{"190":{"position":[[3244,7]]},"278":{"position":[[877,10]]},"289":{"position":[[1120,7],[1736,7],[2213,7],[2844,10]]},"311":{"position":[[1192,10]]},"420":{"position":[[1712,7]]}}}],["similiar",{"_index":1909,"t":{"289":{"position":[[2509,11],[2572,11],[2636,11]]}}}],["simpl",{"_index":129,"t":{"13":{"position":[[552,6]]},"68":{"position":[[1523,6]]},"190":{"position":[[2667,6]]},"206":{"position":[[167,6]]},"341":{"position":[[291,6]]}}}],["simpli",{"_index":1211,"t":{"170":{"position":[[909,6]]},"398":{"position":[[591,6]]}}}],["simplifi",{"_index":2356,"t":{"398":{"position":[[2550,10]]}}}],["singl",{"_index":1050,"t":{"112":{"position":[[224,6]]},"234":{"position":[[311,6]]},"248":{"position":[[201,6]]},"287":{"position":[[310,8],[803,7]]},"289":{"position":[[965,8],[1040,9]]},"292":{"position":[[483,7],[544,9],[896,7],[957,9]]},"305":{"position":[[354,9]]},"309":{"position":[[451,9]]},"387":{"position":[[933,9]]},"448":{"position":[[854,6]]}}}],["single_user_platform_id",{"_index":2320,"t":{"393":{"position":[[1608,23],[2345,24]]}}}],["site",{"_index":1324,"t":{"190":{"position":[[3626,4],[3857,4]]},"406":{"position":[[626,4]]},"409":{"position":[[378,4]]}}}],["skagg",{"_index":1968,"t":{"328":{"position":[[40,8]]}}}],["skip",{"_index":1614,"t":{"240":{"position":[[578,4]]},"242":{"position":[[466,7]]},"265":{"position":[[1592,4]]},"282":{"position":[[242,8]]},"322":{"position":[[155,4]]},"398":{"position":[[3789,4]]}}}],["slash",{"_index":1972,"t":{"332":{"position":[[264,5],[440,5],[540,5]]}}}],["slice.wisp.plac",{"_index":688,"t":{"68":{"position":[[1572,16]]}}}],["slick",{"_index":2177,"t":{"380":{"position":[[111,5]]}}}],["slight",{"_index":2411,"t":{"414":{"position":[[211,6]]}}}],["slightli",{"_index":1577,"t":{"232":{"position":[[1083,8]]}}}],["slower",{"_index":753,"t":{"77":{"position":[[1605,6]]}}}],["slug",{"_index":1138,"t":{"134":{"position":[[5,4],[189,4],[292,4]]},"136":{"position":[[380,7],[566,7]]},"148":{"position":[[5,4],[499,4],[607,4]]},"212":{"position":[[80,4],[244,7],[328,7],[616,4]]},"216":{"position":[[417,7],[638,7]]},"402":{"position":[[840,4]]}}}],["slug/token",{"_index":1143,"t":{"136":{"position":[[183,10]]},"152":{"position":[[181,10]]}}}],["smart",{"_index":2535,"t":{"448":{"position":[[1066,5]]}}}],["smarttub",{"_index":1018,"t":{"108":{"position":[[2428,13],[3015,13]]}}}],["socat",{"_index":1221,"t":{"170":{"position":[[1442,5],[1600,5]]}}}],["social",{"_index":610,"t":{"61":{"position":[[281,6]]},"68":{"position":[[109,6],[363,6]]},"198":{"position":[[81,6]]}}}],["socket",{"_index":999,"t":{"108":{"position":[[1263,6]]},"170":{"position":[[659,6],[791,7],[949,6],[1067,7],[1287,7],[1508,6]]}}}],["sole",{"_index":977,"t":{"108":{"position":[[680,6]]},"112":{"position":[[419,6]]},"148":{"position":[[981,6]]}}}],["solut",{"_index":2530,"t":{"446":{"position":[[517,9]]}}}],["some_ip",{"_index":2027,"t":{"347":{"position":[[1193,9]]}}}],["someguy",{"_index":1678,"t":{"248":{"position":[[629,8]]}}}],["someotherus",{"_index":1120,"t":{"122":{"position":[[2975,15]]},"188":{"position":[[2416,15],[2962,15]]}}}],["someth",{"_index":1498,"t":{"222":{"position":[[2856,9]]},"307":{"position":[[468,9]]},"402":{"position":[[327,9],[1261,9]]},"406":{"position":[[917,9]]},"409":{"position":[[11,9]]},"420":{"position":[[404,9]]}}}],["sometim",{"_index":1876,"t":{"287":{"position":[[1548,9]]},"420":{"position":[[1076,9]]}}}],["someus",{"_index":1263,"t":{"188":{"position":[[869,12],[903,8],[931,8],[1164,11],[1243,9]]}}}],["somewher",{"_index":544,"t":{"43":{"position":[[306,9]]},"51":{"position":[[391,9]]},"70":{"position":[[205,10]]},"339":{"position":[[201,9]]},"374":{"position":[[22,9]]}}}],["song",{"_index":5,"t":{"2":{"position":[[77,5]]},"86":{"position":[[594,4]]},"92":{"position":[[82,4]]},"228":{"position":[[119,5]]},"248":{"position":[[351,4],[617,4]]},"393":{"position":[[319,4]]},"420":{"position":[[85,4],[1907,4],[2950,5],[2989,4],[3036,4],[3113,5],[3174,5]]}}}],["sono",{"_index":946,"t":{"106":{"position":[[37,7]]}}}],["sort",{"_index":1790,"t":{"278":{"position":[[837,7],[967,7],[1672,7]]},"289":{"position":[[83,7],[176,6],[217,7],[397,7],[524,7],[1196,7],[3013,7]]},"296":{"position":[[341,7],[364,7]]}}}],["sorted/rank",{"_index":1887,"t":{"289":{"position":[[1093,13]]}}}],["sot",{"_index":794,"t":{"83":{"position":[[25,3]]}}}],["sound",{"_index":1893,"t":{"289":{"position":[[1552,5]]},"420":{"position":[[2018,5]]}}}],["soundcloud",{"_index":1190,"t":{"164":{"position":[[368,14]]},"166":{"position":[[20,12],[98,12],[373,14],[444,11]]}}}],["soundcloud:song:mysong",{"_index":1191,"t":{"164":{"position":[[474,22]]}}}],["soundtrack",{"_index":1862,"t":{"287":{"position":[[912,11]]},"289":{"position":[[1594,11],[2318,11]]}}}],["soup",{"_index":1683,"t":{"248":{"position":[[808,4],[926,6]]},"282":{"position":[[3094,6],[4561,4],[4625,4],[4893,6],[5511,5],[5606,5],[5731,6]]},"294":{"position":[[711,4],[893,6]]}}}],["sourc",{"_index":71,"t":{"9":{"position":[[525,6],[708,7],[808,6],[895,6],[988,6],[1183,6]]},"13":{"position":[[0,7],[608,6],[1458,7],[1496,6],[3141,7],[3179,6],[4392,10]]},"15":{"position":[[64,6],[117,7],[134,7]]},"17":{"position":[[1604,9]]},"23":{"position":[[3040,6]]},"25":{"position":[[489,10]]},"27":{"position":[[48,8],[208,7]]},"29":{"position":[[93,7]]},"31":{"position":[[78,6],[101,6],[122,6],[358,10]]},"33":{"position":[[647,7]]},"35":{"position":[[83,8]]},"39":{"position":[[100,8]]},"45":{"position":[[93,8],[226,6]]},"57":{"position":[[98,8]]},"61":{"position":[[77,8],[1553,6]]},"68":{"position":[[87,8]]},"77":{"position":[[253,6],[910,10],[2245,6],[2481,6]]},"81":{"position":[[2,6],[19,6]]},"86":{"position":[[4,7],[122,6],[190,6],[332,6],[421,7],[545,6],[677,7],[881,7],[1028,7],[1220,7]]},"88":{"position":[[5,7],[105,7]]},"90":{"position":[[25,6],[377,6]]},"92":{"position":[[2,6],[654,7]]},"94":{"position":[[55,8],[131,7],[224,7],[522,8]]},"96":{"position":[[1000,6]]},"98":{"position":[[649,10]]},"100":{"position":[[13,6],[200,6],[235,6]]},"104":{"position":[[445,10]]},"106":{"position":[[168,6]]},"108":{"position":[[247,7],[398,6],[532,6],[577,6],[3342,6]]},"110":{"position":[[896,10]]},"112":{"position":[[621,7],[763,6],[1498,8],[1575,7],[1716,7],[1898,10],[1965,7],[2047,7]]},"114":{"position":[[312,10]]},"120":{"position":[[552,10]]},"122":{"position":[[2775,10]]},"128":{"position":[[499,10]]},"130":{"position":[[5,6],[265,6],[363,8],[623,7],[685,8],[709,9],[946,10],[976,8],[1000,9]]},"132":{"position":[[5,6],[254,8]]},"134":{"position":[[246,7]]},"136":{"position":[[126,6],[508,10]]},"138":{"position":[[5,6],[301,6],[437,8]]},"140":{"position":[[242,7],[347,9],[625,10],[697,9]]},"142":{"position":[[5,6],[186,6],[323,8]]},"144":{"position":[[245,7],[352,9],[583,10],[656,9]]},"146":{"position":[[5,6],[279,8]]},"148":{"position":[[561,7]]},"152":{"position":[[124,6],[587,10]]},"154":{"position":[[5,6]]},"156":{"position":[[257,7],[366,9],[607,10],[677,9]]},"158":{"position":[[149,6],[247,8]]},"160":{"position":[[240,7],[306,8],[346,9],[534,10],[567,8],[607,9]]},"162":{"position":[[98,7],[212,7]]},"164":{"position":[[59,7]]},"166":{"position":[[12,7]]},"168":{"position":[[322,10]]},"172":{"position":[[113,6],[596,10]]},"176":{"position":[[412,10]]},"180":{"position":[[439,10]]},"182":{"position":[[151,6]]},"186":{"position":[[82,6],[180,8],[431,7],[522,9],[731,10],[788,9]]},"188":{"position":[[2805,10]]},"190":{"position":[[1965,7]]},"192":{"position":[[588,10]]},"194":{"position":[[5,6],[337,7],[462,6]]},"196":{"position":[[495,10]]},"198":{"position":[[230,6]]},"202":{"position":[[83,6],[181,8]]},"204":{"position":[[874,9],[1083,9],[1313,9],[1691,7],[1778,9],[2039,10],[2093,9]]},"208":{"position":[[364,10]]},"212":{"position":[[44,7],[365,6],[447,6],[583,6]]},"216":{"position":[[587,10]]},"220":{"position":[[344,10]]},"222":{"position":[[1667,6],[4302,6]]},"224":{"position":[[733,10]]},"226":{"position":[[272,6],[665,6]]},"228":{"position":[[67,7],[177,6],[211,6],[358,6],[532,8],[581,6]]},"230":{"position":[[151,6],[348,6],[434,9]]},"232":{"position":[[4,8],[1011,7]]},"244":{"position":[[674,9]]},"248":{"position":[[127,7]]},"250":{"position":[[1217,7]]},"256":{"position":[[426,6],[890,6]]},"265":{"position":[[292,6],[475,8]]},"276":{"position":[[20,6]]},"278":{"position":[[1318,6],[1936,6]]},"282":{"position":[[1435,7]]},"292":{"position":[[697,7]]},"294":{"position":[[65,6],[449,7],[1059,7],[1155,9],[1197,7]]},"311":{"position":[[398,7],[670,8]]},"319":{"position":[[113,9]]},"337":{"position":[[198,6]]},"343":{"position":[[52,7]]},"347":{"position":[[886,7]]},"349":{"position":[[495,7]]},"351":{"position":[[0,6]]},"357":{"position":[[50,6]]},"360":{"position":[[72,7],[351,7]]},"362":{"position":[[65,7],[152,8],[454,8]]},"368":{"position":[[2159,7],[2470,6]]},"370":{"position":[[103,6]]},"374":{"position":[[918,10]]},"376":{"position":[[107,7]]},"378":{"position":[[77,6],[131,6]]},"380":{"position":[[885,6],[987,6]]},"383":{"position":[[1124,6],[1210,8],[1641,6],[1901,6]]},"385":{"position":[[22,6],[431,7],[950,6]]},"387":{"position":[[57,6],[912,7],[1090,6]]},"389":{"position":[[943,7]]},"393":{"position":[[16,7],[59,6],[173,6],[653,6],[1116,6],[1187,6],[1303,6]]},"396":{"position":[[13,6],[181,6]]},"398":{"position":[[146,6],[376,7],[391,6],[492,6],[526,6],[617,6],[1147,7],[1163,7],[1374,7],[1483,7],[1753,6],[1922,7],[1947,6],[2228,6],[2576,7]]},"402":{"position":[[6,7],[1178,6],[1947,8],[2404,6]]},"414":{"position":[[468,7]]},"420":{"position":[[120,6],[607,7],[768,6],[2266,8],[2572,6]]},"434":{"position":[[0,7],[1415,6],[1554,6],[1679,7],[1722,6],[2921,7],[3006,6],[3169,7],[3798,9],[4085,8]]},"436":{"position":[[64,7],[337,7],[776,6],[823,8],[888,7],[1551,7],[1745,9]]},"438":{"position":[[70,7]]},"440":{"position":[[40,8],[105,7],[768,7],[962,9]]},"442":{"position":[[105,7]]},"444":{"position":[[316,7]]},"446":{"position":[[241,7]]},"448":{"position":[[127,7],[704,7],[1545,6],[1703,7],[1881,7],[2184,6],[2212,6],[2449,7]]},"450":{"position":[[42,7],[110,8],[151,6],[237,6]]},"452":{"position":[[2,6],[19,6],[237,6],[344,7],[394,6],[436,6]]}}}],["source'",{"_index":73,"t":{"9":{"position":[[563,8]]},"90":{"position":[[79,8]]},"92":{"position":[[352,8]]},"94":{"position":[[75,8],[476,8],[624,8]]},"96":{"position":[[1161,8],[1290,8]]},"112":{"position":[[924,8],[1053,8]]},"226":{"position":[[466,8]]},"232":{"position":[[861,8]]},"282":{"position":[[6301,8]]},"393":{"position":[[437,8]]},"396":{"position":[[74,8]]},"398":{"position":[[2528,8],[3419,8]]}}}],["source/cli",{"_index":173,"t":{"13":{"position":[[1775,13],[1794,14],[1945,13]]},"15":{"position":[[231,13]]},"19":{"position":[[76,14]]},"244":{"position":[[96,13]]},"256":{"position":[[143,13],[354,13]]},"278":{"position":[[1034,13],[1245,13]]},"337":{"position":[[114,13]]},"343":{"position":[[106,13],[408,14]]},"349":{"position":[[360,13]]},"368":{"position":[[907,13]]},"446":{"position":[[199,13]]}}}],["source/client'",{"_index":1701,"t":{"256":{"position":[[304,15]]},"278":{"position":[[1195,15]]}}}],["source_scrobble_duration=40",{"_index":858,"t":{"92":{"position":[[674,27]]}}}],["source_scrobble_percent=20",{"_index":859,"t":{"92":{"position":[[702,26]]}}}],["source_sot",{"_index":2347,"t":{"398":{"position":[[833,10]]}}}],["source_sot.histori",{"_index":2350,"t":{"398":{"position":[[1111,19]]}}}],["sourceaioconfig",{"_index":2213,"t":{"383":{"position":[[1547,15]]}}}],["sourceconfig",{"_index":2211,"t":{"383":{"position":[[1467,12]]}}}],["sourcedata",{"_index":2318,"t":{"393":{"position":[[1579,11],[1861,12]]}}}],["sourcedefault",{"_index":217,"t":{"13":{"position":[[4100,17]]},"77":{"position":[[25,17]]},"387":{"position":[[1182,14]]}}}],["sources.0.json",{"_index":2088,"t":{"362":{"position":[[416,14]]}}}],["sources.1.json",{"_index":2090,"t":{"362":{"position":[[602,14]]}}}],["sources.json",{"_index":2086,"t":{"362":{"position":[[357,12],[543,12]]}}}],["sources/cli",{"_index":183,"t":{"13":{"position":[[2255,15],[3479,15],[3551,15],[3880,15]]},"33":{"position":[[41,15]]},"256":{"position":[[90,16]]},"278":{"position":[[121,16]]},"444":{"position":[[445,15]]},"466":{"position":[[49,15]]}}}],["sourcetyp",{"_index":2216,"t":{"383":{"position":[[1753,10],[1812,12],[1825,12]]},"387":{"position":[[621,10],[635,12],[657,12]]}}}],["space",{"_index":1970,"t":{"332":{"position":[[249,6],[425,6]]},"420":{"position":[[2006,5]]}}}],["special",{"_index":1358,"t":{"204":{"position":[[494,7]]},"287":{"position":[[1053,7]]},"317":{"position":[[968,7]]}}}],["specif",{"_index":110,"t":{"13":{"position":[[86,8],[1706,8],[3389,8]]},"19":{"position":[[60,8]]},"88":{"position":[[177,8]]},"108":{"position":[[968,8],[2205,8]]},"174":{"position":[[158,8]]},"188":{"position":[[840,8],[1045,8]]},"194":{"position":[[498,8]]},"206":{"position":[[773,8]]},"234":{"position":[[631,8],[693,8]]},"240":{"position":[[569,8]]},"246":{"position":[[25,8]]},"282":{"position":[[125,8]]},"287":{"position":[[1125,12]]},"349":{"position":[[323,8],[340,9],[413,8]]},"414":{"position":[[294,8]]},"448":{"position":[[1892,8]]}}}],["specifi",{"_index":153,"t":{"13":{"position":[[1192,9],[2852,9]]},"21":{"position":[[267,9],[422,7],[562,9]]},"41":{"position":[[529,9]]},"47":{"position":[[523,9]]},"49":{"position":[[57,7]]},"77":{"position":[[2037,7]]},"90":{"position":[[114,7]]},"164":{"position":[[97,7]]},"190":{"position":[[1256,7]]},"238":{"position":[[15,7],[115,10],[954,9],[1037,10]]},"240":{"position":[[775,10]]},"252":{"position":[[38,10]]},"276":{"position":[[40,10],[271,10]]},"282":{"position":[[3822,7]]},"307":{"position":[[244,7]]},"311":{"position":[[355,7]]},"317":{"position":[[348,9]]},"368":{"position":[[473,7],[3192,7],[3339,9]]},"370":{"position":[[1054,7]]},"385":{"position":[[104,7]]},"406":{"position":[[100,9]]},"432":{"position":[[252,7]]},"462":{"position":[[181,9]]}}}],["speed",{"_index":385,"t":{"23":{"position":[[1960,5]]}}}],["spell",{"_index":1543,"t":{"226":{"position":[[637,7]]},"313":{"position":[[328,8]]}}}],["split",{"_index":1669,"t":{"248":{"position":[[252,6],[365,5],[436,5],[489,6]]}}}],["spotifi",{"_index":166,"t":{"13":{"position":[[1553,7],[3236,7],[4415,10]]},"17":{"position":[[1614,8]]},"21":{"position":[[85,7]]},"33":{"position":[[665,9]]},"75":{"position":[[139,7],[367,7]]},"77":{"position":[[933,10],[1153,7],[1189,10],[1435,10]]},"79":{"position":[[92,7]]},"81":{"position":[[127,8]]},"83":{"position":[[757,7]]},"110":{"position":[[530,8]]},"172":{"position":[[473,9],[701,9]]},"190":{"position":[[0,7],[28,7],[67,7],[269,7],[380,7],[472,7],[517,7],[551,7],[648,7],[708,7],[900,7],[1041,7],[1063,7],[1298,7],[1647,7],[1677,7],[1957,7],[2107,7],[2432,7],[2801,7],[2917,7],[3039,7],[3680,7],[3971,7],[4320,7]]},"192":{"position":[[840,9]]},"238":{"position":[[652,7]]},"265":{"position":[[1122,9]]},"269":{"position":[[26,9]]},"282":{"position":[[1894,8]]},"289":{"position":[[1447,8]]},"294":{"position":[[1113,8]]},"311":{"position":[[33,7],[89,8]]},"374":{"position":[[555,8]]},"383":{"position":[[1766,9],[1842,10]]},"412":{"position":[[198,7]]},"414":{"position":[[137,9]]},"430":{"position":[[308,8]]},"434":{"position":[[105,7],[528,7],[563,7],[644,7],[1189,7]]},"436":{"position":[[905,7]]},"440":{"position":[[122,7]]},"448":{"position":[[370,7]]},"452":{"position":[[179,8]]},"462":{"position":[[252,7]]}}}],["spotify'",{"_index":648,"t":{"61":{"position":[[1655,9]]}}}],["spotify.json",{"_index":190,"t":{"13":{"position":[[2480,12]]},"92":{"position":[[381,12]]},"311":{"position":[[958,12]]}}}],["spotify/jellyfin/etc",{"_index":1694,"t":{"250":{"position":[[1230,21]]}}}],["spotify_client_id",{"_index":1333,"t":{"192":{"position":[[82,17]]}}}],["spotify_client_id=yourclientid",{"_index":2492,"t":{"434":{"position":[[926,30]]}}}],["spotify_client_id=yourid",{"_index":136,"t":{"13":{"position":[[686,26],[865,24],[1061,24]]}}}],["spotify_client_secret",{"_index":1334,"t":{"192":{"position":[[104,21]]}}}],["spotify_client_secret=yourclientsecret",{"_index":2493,"t":{"434":{"position":[[959,38]]}}}],["spotify_client_secret=yoursecret",{"_index":137,"t":{"13":{"position":[[716,34],[892,32],[1086,32]]}}}],["spotify_redirect_uri",{"_index":1297,"t":{"190":{"position":[[1710,20],[2148,20],[2842,20],[4012,20]]},"192":{"position":[[130,20]]}}}],["spotify_redirect_uri=https://multi",{"_index":2494,"t":{"434":{"position":[[1000,34]]}}}],["spotify_secret",{"_index":310,"t":{"17":{"position":[[1659,14]]}}}],["spotify_transforms=musicbrainz",{"_index":2513,"t":{"436":{"position":[[1190,30]]},"440":{"position":[[407,30]]}}}],["spotifysourceaioconfig",{"_index":2214,"t":{"383":{"position":[[1565,22]]}}}],["spotifysourceconfig",{"_index":2212,"t":{"383":{"position":[[1482,19]]}}}],["src/backend/common/infrastructure/atomic.t",{"_index":2215,"t":{"383":{"position":[[1697,43]]}}}],["src/backend/common/infrastructure/config/source/coolplayer.t",{"_index":2191,"t":{"383":{"position":[[164,62]]}}}],["src/backend/common/infrastructure/config/source/sources.t",{"_index":2206,"t":{"383":{"position":[[1219,58]]}}}],["src/backend/sources/coolplayersource.t",{"_index":2261,"t":{"389":{"position":[[139,39]]},"391":{"position":[[283,39],[1469,39],[2107,39]]},"393":{"position":[[1496,39]]},"396":{"position":[[292,39]]},"398":{"position":[[784,39]]}}}],["src/backend/sources/mybasicsource.t",{"_index":2359,"t":{"398":{"position":[[2764,36],[3436,36]]}}}],["src/backend/sources/scrobblesources.t",{"_index":2235,"t":{"387":{"position":[[255,38]]}}}],["src/backend/sources/spotifysource.t",{"_index":2220,"t":{"385":{"position":[[127,36]]}}}],["src/index.j",{"_index":2169,"t":{"374":{"position":[[861,12]]}}}],["src/service/api.t",{"_index":2352,"t":{"398":{"position":[[1422,18]]}}}],["ssl",{"_index":1161,"t":{"148":{"position":[[815,3]]},"190":{"position":[[1435,3]]}}}],["stack",{"_index":396,"t":{"23":{"position":[[3175,6]]},"170":{"position":[[1101,5]]},"434":{"position":[[3610,5]]}}}],["stage",{"_index":1583,"t":{"234":{"position":[[36,7],[46,5],[144,6],[160,5],[249,5],[348,5],[461,5],[514,6],[541,5],[593,5],[648,6],[687,5]]},"236":{"position":[[0,6],[110,5],[146,5],[179,6],[283,6],[384,5],[605,5],[684,5],[1024,6],[1894,5],[1938,5],[2120,5],[2199,5]]},"238":{"position":[[5,5],[161,5],[737,6],[767,5],[971,5],[1095,6]]},"240":{"position":[[0,6],[60,5],[101,7],[155,6],[218,5],[285,5],[358,5],[493,5],[537,5],[563,5],[681,6],[711,5],[754,5],[985,5],[1031,5]]},"242":{"position":[[0,6],[44,6],[457,5],[1172,5],[1252,5],[1435,5],[1509,5]]},"244":{"position":[[21,5],[197,5],[338,5],[527,5],[568,6]]},"246":{"position":[[34,5],[73,5],[86,5],[104,5]]},"248":{"position":[[11,5],[102,5],[677,5]]},"250":{"position":[[25,5]]},"254":{"position":[[54,5],[223,6],[438,5]]},"256":{"position":[[180,5],[207,5],[856,5]]},"259":{"position":[[161,5],[240,5]]},"263":{"position":[[171,5],[229,6]]},"265":{"position":[[16,5],[213,5],[461,5]]},"272":{"position":[[165,5]]},"274":{"position":[[83,5]]},"276":{"position":[[9,5],[232,5],[868,5]]},"278":{"position":[[256,5],[1071,5],[1098,5],[1902,5]]},"282":{"position":[[233,5],[526,5],[699,5],[1516,5],[1956,5],[2202,5],[2516,5],[2874,5],[3475,5],[3875,5],[4205,5],[4379,5],[4459,6],[4950,5],[5740,5],[6845,5],[7072,5]]},"289":{"position":[[2414,5]]},"292":{"position":[[27,5]]},"300":{"position":[[406,6],[465,6],[523,6]]},"309":{"position":[[12,5],[106,5]]},"311":{"position":[[332,5],[414,5]]},"313":{"position":[[9,5],[112,5],[383,5]]},"315":{"position":[[4,5],[154,5],[352,6],[411,5],[555,6],[766,5]]},"347":{"position":[[90,8],[266,7],[274,6],[324,6],[405,5],[439,5],[503,5],[544,5],[583,5],[658,5],[690,5],[772,6],[796,5],[1063,6],[1400,6],[1430,5],[1537,5],[1706,5],[1798,6],[1934,6],[2484,5],[2573,5],[3045,6]]},"383":{"position":[[402,6],[2074,6]]},"391":{"position":[[27,6],[122,6],[1462,6],[2100,6]]}}}],["stage/rul",{"_index":1622,"t":{"242":{"position":[[392,10]]}}}],["stand",{"_index":1700,"t":{"256":{"position":[[268,6]]},"278":{"position":[[1159,6]]}}}],["standalon",{"_index":1985,"t":{"337":{"position":[[273,10]]}}}],["standard",{"_index":607,"t":{"61":{"position":[[212,8]]},"68":{"position":[[294,8]]},"112":{"position":[[90,8]]},"118":{"position":[[348,8]]},"126":{"position":[[344,8]]},"134":{"position":[[137,10]]},"148":{"position":[[163,10]]},"162":{"position":[[72,8],[89,8],[701,8]]},"170":{"position":[[11,8]]},"234":{"position":[[416,11]]},"265":{"position":[[233,13]]},"349":{"position":[[22,8],[156,8]]},"389":{"position":[[118,8]]},"393":{"position":[[2268,8]]},"448":{"position":[[1933,11]]}}}],["start",{"_index":150,"t":{"13":{"position":[[1127,5]]},"31":{"position":[[93,7]]},"53":{"position":[[270,5]]},"73":{"position":[[80,8]]},"164":{"position":[[231,5],[452,5]]},"190":{"position":[[740,5],[1102,6],[3899,8],[4234,5],[4336,5]]},"206":{"position":[[737,8]]},"222":{"position":[[2804,5],[3513,5],[4595,5],[4939,5],[5454,5]]},"317":{"position":[[714,6]]},"339":{"position":[[432,5]]},"347":{"position":[[157,6]]},"370":{"position":[[18,5]]},"374":{"position":[[259,5],[1259,5]]},"387":{"position":[[8,6]]},"396":{"position":[[60,6]]},"420":{"position":[[2916,5]]},"424":{"position":[[389,5]]},"426":{"position":[[113,5],[268,5]]},"434":{"position":[[1080,8],[3968,8]]},"442":{"position":[[454,5]]},"444":{"position":[[200,5]]},"448":{"position":[[1245,5],[2464,8]]},"456":{"position":[[14,5]]}}}],["startup",{"_index":1497,"t":{"222":{"position":[[2836,7]]},"343":{"position":[[315,9]]},"347":{"position":[[1560,7]]},"396":{"position":[[603,7]]},"462":{"position":[[218,7]]}}}],["stat",{"_index":685,"t":{"68":{"position":[[1530,5]]},"112":{"position":[[1638,6],[1787,6],[2034,6]]},"448":{"position":[[946,6]]}}}],["state",{"_index":830,"t":{"86":{"position":[[754,5],[934,5]]},"362":{"position":[[850,5]]},"380":{"position":[[553,5]]},"383":{"position":[[2127,5]]},"393":{"position":[[227,5],[552,5],[962,5],[1092,5],[1201,5],[1921,5],[2284,5],[2463,5],[2587,5],[2601,5],[2649,5]]},"398":{"position":[[46,5],[676,5],[1570,5]]}}}],["stateless",{"_index":456,"t":{"31":{"position":[[1474,9],[1704,9]]}}}],["statement",{"_index":2242,"t":{"387":{"position":[[595,9]]}}}],["static",{"_index":2259,"t":{"389":{"position":[[21,6],[600,6]]},"391":{"position":[[440,6]]}}}],["station",{"_index":898,"t":{"98":{"position":[[99,7],[131,7],[206,7],[276,7],[473,10],[488,7],[757,10],[772,7]]},"112":{"position":[[32,7],[568,8]]}}}],["statist",{"_index":2526,"t":{"444":{"position":[[516,10]]},"462":{"position":[[19,11]]}}}],["statu",{"_index":75,"t":{"9":{"position":[[579,6],[642,6]]},"33":{"position":[[241,6],[313,6]]},"94":{"position":[[485,6]]},"96":{"position":[[1170,6],[1618,6]]},"98":{"position":[[214,6]]},"112":{"position":[[933,6]]},"287":{"position":[[633,6],[1403,6]]},"406":{"position":[[129,6]]},"444":{"position":[[474,6],[577,6]]},"448":{"position":[[694,6]]},"462":{"position":[[2,6],[341,6],[365,6]]}}}],["stdout/stderr",{"_index":2546,"t":{"462":{"position":[[148,13]]}}}],["step",{"_index":1006,"t":{"108":{"position":[[1460,5],[1534,5]]},"190":{"position":[[2990,4],[3913,4]]},"280":{"position":[[232,6],[367,5]]},"282":{"position":[[814,4]]},"368":{"position":[[1564,5]]},"378":{"position":[[29,4],[37,4]]},"402":{"position":[[1380,5]]},"434":{"position":[[457,4]]},"436":{"position":[[192,4],[277,4],[1559,4]]},"438":{"position":[[10,4]]},"440":{"position":[[776,4]]}}}],["stick",{"_index":120,"t":{"13":{"position":[[269,5]]}}}],["still",{"_index":35,"t":{"7":{"position":[[229,5]]},"68":{"position":[[1343,5],[1375,5]]},"77":{"position":[[2023,5]]},"166":{"position":[[258,5]]},"210":{"position":[[801,5]]},"261":{"position":[[157,7]]},"289":{"position":[[2008,5]]},"292":{"position":[[102,5]]},"298":{"position":[[199,5],[353,5]]},"307":{"position":[[79,5]]},"315":{"position":[[134,5]]},"376":{"position":[[70,5]]},"398":{"position":[[401,5],[1548,5]]},"448":{"position":[[2339,5]]}}}],["stop",{"_index":33,"t":{"7":{"position":[[187,5]]},"31":{"position":[[137,7]]},"86":{"position":[[769,8]]},"222":{"position":[[128,4]]},"240":{"position":[[69,4],[343,5],[1430,7]]},"256":{"position":[[1080,7]]},"278":{"position":[[2160,7]]},"309":{"position":[[898,7]]},"347":{"position":[[221,5]]},"368":{"position":[[1530,7]]},"370":{"position":[[1460,7]]},"393":{"position":[[2093,9]]},"406":{"position":[[342,7]]},"432":{"position":[[524,7]]},"473":{"position":[[87,4]]}}}],["storag",{"_index":457,"t":{"31":{"position":[[1499,7],[1815,7]]},"102":{"position":[[630,7]]},"368":{"position":[[1606,8]]}}}],["store",{"_index":2,"t":{"2":{"position":[[32,6]]},"23":{"position":[[236,5],[473,6],[1230,6],[2622,6],[2896,5]]},"61":{"position":[[307,6],[1381,5]]},"68":{"position":[[389,6]]},"102":{"position":[[48,5]]},"347":{"position":[[1212,5],[1322,6],[3139,5]]},"349":{"position":[[57,5],[176,7]]},"362":{"position":[[728,7]]},"368":{"position":[[1671,7]]},"442":{"position":[[26,5]]},"454":{"position":[[32,6]]}}}],["stored/avail",{"_index":680,"t":{"68":{"position":[[164,16]]},"198":{"position":[[136,16]]}}}],["strang",{"_index":1030,"t":{"108":{"position":[[3254,7]]}}}],["stream",{"_index":1048,"t":{"112":{"position":[[40,9],[153,6],[180,7],[1550,6]]}}}],["streamtitl",{"_index":1051,"t":{"112":{"position":[[238,13]]}}}],["string",{"_index":297,"t":{"17":{"position":[[1272,6],[1479,6]]},"23":{"position":[[3394,6],[3445,6]]},"112":{"position":[[231,6]]},"164":{"position":[[212,6],[312,7]]},"166":{"position":[[315,7]]},"222":{"position":[[3693,6]]},"226":{"position":[[119,7]]},"234":{"position":[[325,6]]},"236":{"position":[[1414,6]]},"242":{"position":[[176,6]]},"248":{"position":[[208,6],[277,6]]},"250":{"position":[[74,6],[219,6],[386,7],[444,6],[765,7],[1162,6],[1334,7],[1388,7]]},"282":{"position":[[3676,6],[3771,7],[4316,6],[4673,6],[4708,6],[4750,6],[5201,7],[5366,7],[5409,7]]},"294":{"position":[[628,7]]},"317":{"position":[[47,6],[139,7],[166,7],[285,7],[312,7],[392,6],[566,6],[615,7],[649,7],[702,6],[793,6],[843,7],[883,7],[976,6]]},"319":{"position":[[456,6]]},"332":{"position":[[24,6],[69,7],[118,6]]},"345":{"position":[[183,6]]},"347":{"position":[[569,6]]},"383":{"position":[[749,6],[861,6]]},"391":{"position":[[471,7],[781,6],[906,8],[1057,8],[1737,6],[1916,6]]},"412":{"position":[[75,6]]}}}],["strong",{"_index":1723,"t":{"265":{"position":[[340,6]]}}}],["structur",{"_index":188,"t":{"13":{"position":[[2447,10]]},"61":{"position":[[762,9],[811,9]]},"68":{"position":[[844,9],[893,9]]},"230":{"position":[[286,9]]},"265":{"position":[[1163,10]]},"269":{"position":[[67,10]]},"343":{"position":[[227,9]]},"349":{"position":[[36,9]]}}}],["subdirectori",{"_index":1502,"t":{"222":{"position":[[3545,12]]}}}],["subhead",{"_index":847,"t":{"90":{"position":[[559,9]]}}}],["submit",{"_index":22,"t":{"7":{"position":[[32,6],[384,9]]},"61":{"position":[[1703,10]]},"402":{"position":[[1393,10]]}}}],["subsequ",{"_index":1607,"t":{"240":{"position":[[90,10]]}}}],["subset",{"_index":1354,"t":{"204":{"position":[[230,6]]}}}],["subson",{"_index":484,"t":{"33":{"position":[[685,9]]},"75":{"position":[[182,10]]},"77":{"position":[[2660,11]]},"83":{"position":[[789,8]]},"194":{"position":[[64,8],[621,8]]},"196":{"position":[[156,8],[687,10]]},"236":{"position":[[753,8],[1464,8],[2268,8]]},"248":{"position":[[169,8],[724,8]]},"254":{"position":[[243,8]]},"256":{"position":[[417,8]]},"259":{"position":[[309,8]]},"261":{"position":[[208,8]]},"263":{"position":[[241,8]]},"278":{"position":[[1309,8]]},"294":{"position":[[503,8]]},"300":{"position":[[543,8]]},"303":{"position":[[179,8]]},"305":{"position":[[492,8]]},"315":{"position":[[575,8]]},"434":{"position":[[1406,8],[1545,8]]},"448":{"position":[[378,8]]}}}],["subsonic.json",{"_index":1594,"t":{"236":{"position":[[775,13],[1486,13],[2290,13]]},"240":{"position":[[903,13],[1184,13]]},"254":{"position":[[265,13]]},"259":{"position":[[331,13]]},"261":{"position":[[230,13]]},"263":{"position":[[263,13]]},"276":{"position":[[65,13],[366,13],[951,13]]},"298":{"position":[[382,13]]},"300":{"position":[[565,13]]},"303":{"position":[[201,13]]},"305":{"position":[[514,13]]},"315":{"position":[[597,13]]}}}],["subsonic_password",{"_index":1342,"t":{"196":{"position":[[100,17]]}}}],["subsonic_transforms=musicbrainz",{"_index":1795,"t":{"278":{"position":[[1372,31]]}}}],["subsonic_transforms=n",{"_index":1703,"t":{"256":{"position":[[480,26]]}}}],["subsonic_url",{"_index":1343,"t":{"196":{"position":[[122,12]]}}}],["subsonic_us",{"_index":1341,"t":{"196":{"position":[[82,13]]}}}],["subsonic_user=myus",{"_index":1702,"t":{"256":{"position":[[448,20]]},"278":{"position":[[1340,20]]}}}],["succe",{"_index":2047,"t":{"347":{"position":[[3262,8]]}}}],["succeed",{"_index":2019,"t":{"347":{"position":[[550,9],[589,9],[2607,9]]}}}],["success",{"_index":1523,"t":{"222":{"position":[[5365,7]]},"240":{"position":[[994,11],[1276,10]]},"309":{"position":[[744,10]]}}}],["successfulli",{"_index":45,"t":{"7":{"position":[[371,12]]},"240":{"position":[[291,12]]}}}],["succinctli",{"_index":1628,"t":{"242":{"position":[[1010,11]]}}}],["such",{"_index":131,"t":{"13":{"position":[[572,4]]},"162":{"position":[[106,4]]},"194":{"position":[[117,5],[397,5]]},"248":{"position":[[160,4]]},"282":{"position":[[6516,5]]},"294":{"position":[[1104,4]]},"345":{"position":[[286,4]]},"349":{"position":[[396,4]]},"404":{"position":[[501,5]]}}}],["suffix",{"_index":1145,"t":{"136":{"position":[[250,6]]},"152":{"position":[[330,6]]}}}],["suggest",{"_index":1889,"t":{"289":{"position":[[1382,9],[1694,9]]}}}],["super",{"_index":2340,"t":{"396":{"position":[[525,8]]},"398":{"position":[[968,8]]}}}],["super('coolplay",{"_index":2230,"t":{"385":{"position":[[713,19]]}}}],["superag",{"_index":2164,"t":{"374":{"position":[[581,13],[595,13]]},"391":{"position":[[1529,13],[2167,13]]},"393":{"position":[[1556,13]]},"396":{"position":[[352,13]]}}}],["suppli",{"_index":1930,"t":{"294":{"position":[[1793,8]]}}}],["support",{"_index":55,"t":{"9":{"position":[[198,7]]},"13":{"position":[[1814,7]]},"29":{"position":[[16,8]]},"31":{"position":[[720,8],[1073,8],[1465,8]]},"94":{"position":[[111,10]]},"96":{"position":[[1007,8]]},"108":{"position":[[167,7]]},"112":{"position":[[770,8],[1587,9]]},"148":{"position":[[903,7]]},"162":{"position":[[39,8]]},"168":{"position":[[36,7]]},"194":{"position":[[81,8],[361,8]]},"210":{"position":[[301,9],[393,9]]},"214":{"position":[[118,9]]},"222":{"position":[[58,9]]},"226":{"position":[[24,7]]},"242":{"position":[[51,7]]},"292":{"position":[[712,7]]},"294":{"position":[[468,7]]},"298":{"position":[[284,8]]},"374":{"position":[[407,9]]},"376":{"position":[[51,10]]},"434":{"position":[[1331,8],[1476,8]]},"448":{"position":[[97,8],[489,8],[787,8],[829,8]]}}}],["sure",{"_index":1023,"t":{"108":{"position":[[2651,4]]},"118":{"position":[[409,4]]},"126":{"position":[[403,4]]},"150":{"position":[[141,4]]},"162":{"position":[[767,4]]},"170":{"position":[[981,4]]},"222":{"position":[[4375,4],[4423,4]]},"362":{"position":[[173,4]]},"402":{"position":[[2318,4]]}}}],["surfac",{"_index":1917,"t":{"292":{"position":[[219,7]]},"393":{"position":[[891,8]]},"398":{"position":[[3127,8]]}}}],["switch",{"_index":2243,"t":{"387":{"position":[[650,6],[1246,6]]},"420":{"position":[[2811,8]]}}}],["syntax",{"_index":877,"t":{"96":{"position":[[393,7]]},"118":{"position":[[128,6]]},"126":{"position":[[126,6]]},"162":{"position":[[483,6]]},"178":{"position":[[233,7]]},"244":{"position":[[620,7]]},"360":{"position":[[243,7]]}}}],["system",{"_index":876,"t":{"96":{"position":[[321,6]]},"170":{"position":[[86,8],[345,6]]},"339":{"position":[[66,7]]},"368":{"position":[[3569,6]]},"422":{"position":[[11,6]]}}}],["systemctl",{"_index":2485,"t":{"426":{"position":[[24,9],[48,9],[96,9]]}}}],["systemd",{"_index":2465,"t":{"422":{"position":[[0,7]]}}}],["systemscrobbl",{"_index":871,"t":{"94":{"position":[[810,17]]},"96":{"position":[[1476,17]]},"112":{"position":[[1237,17]]}}}],["s|\\\\s)(feat\\\\.(.+)|live|remastered(.+))$/i",{"_index":1966,"t":{"322":{"position":[[355,45]]}}}],["s滾石40\\\\s滾石撞樂隊\\\\s40團拚經典(.+)$/i",{"_index":1965,"t":{"322":{"position":[[251,33]]}}}],["tab",{"_index":927,"t":{"102":{"position":[[387,4],[412,4],[638,4]]},"170":{"position":[[688,4]]},"214":{"position":[[160,3]]},"434":{"position":[[3264,3]]},"436":{"position":[[862,3]]},"440":{"position":[[79,3]]},"448":{"position":[[2427,3]]}}}],["tabl",{"_index":504,"t":{"35":{"position":[[942,5]]}}}],["tag",{"_index":458,"t":{"31":{"position":[[1528,5],[1833,7]]},"226":{"position":[[352,4]]},"292":{"position":[[769,6]]},"357":{"position":[[15,3]]},"471":{"position":[[505,4],[526,4]]}}}],["tagged/organ",{"_index":1725,"t":{"265":{"position":[[401,16]]}}}],["tags/metadata",{"_index":1388,"t":{"206":{"position":[[1052,13]]}}}],["take",{"_index":494,"t":{"35":{"position":[[411,4]]},"39":{"position":[[485,4]]},"222":{"position":[[4215,4]]},"311":{"position":[[233,4]]},"389":{"position":[[53,4]]},"393":{"position":[[927,4],[1164,5]]},"398":{"position":[[2737,4]]},"442":{"position":[[1582,4]]}}}],["taken",{"_index":863,"t":{"94":{"position":[[390,5]]},"96":{"position":[[1075,5]]},"112":{"position":[[838,5]]}}}],["tautulli",{"_index":2346,"t":{"398":{"position":[[272,9],[1183,9]]}}}],["tcp",{"_index":1224,"t":{"170":{"position":[[1530,3],[1606,3]]},"174":{"position":[[35,3]]}}}],["teal",{"_index":687,"t":{"68":{"position":[[1567,4]]}}}],["teal.fm",{"_index":18,"t":{"4":{"position":[[80,7]]},"68":{"position":[[79,7],[96,7],[1026,8],[1332,7],[1364,7],[1451,7],[1606,7]]},"83":{"position":[[838,7]]},"198":{"position":[[51,7],[68,7],[250,7],[364,7],[394,7]]},"200":{"position":[[37,7]]},"202":{"position":[[8,7]]},"204":{"position":[[96,8],[1525,7],[1574,7],[1678,7]]},"448":{"position":[[433,7],[576,7]]}}}],["teal.fm'",{"_index":682,"t":{"68":{"position":[[869,9],[927,9]]}}}],["tealfm",{"_index":710,"t":{"73":{"position":[[1228,8]]},"204":{"position":[[2254,8]]},"298":{"position":[[318,7]]},"307":{"position":[[183,7]]}}}],["tealfm.json",{"_index":1367,"t":{"204":{"position":[[819,11],[1028,11],[1258,11]]}}}],["tealfm_app_pw",{"_index":701,"t":{"73":{"position":[[746,13]]}}}],["tealfm_identifi",{"_index":700,"t":{"73":{"position":[[639,17]]}}}],["team",{"_index":1894,"t":{"289":{"position":[[1558,7]]}}}],["technic",{"_index":2368,"t":{"398":{"position":[[3777,11]]},"420":{"position":[[956,11]]}}}],["tell",{"_index":2190,"t":{"383":{"position":[[82,4]]},"385":{"position":[[931,5]]},"387":{"position":[[112,4]]},"396":{"position":[[553,4]]},"398":{"position":[[996,4]]},"416":{"position":[[115,4]]}}}],["templat",{"_index":971,"t":{"108":{"position":[[353,8]]}}}],["temporarili",{"_index":1569,"t":{"232":{"position":[[79,11],[317,11]]}}}],["tend",{"_index":1339,"t":{"194":{"position":[[532,4]]}}}],["term",{"_index":633,"t":{"61":{"position":[[1236,5]]},"68":{"position":[[1314,5]]},"190":{"position":[[685,5]]},"230":{"position":[[268,5]]},"234":{"position":[[209,5]]},"287":{"position":[[1262,6]]}}}],["termin",{"_index":2134,"t":{"368":{"position":[[3468,9]]}}}],["test",{"_index":1510,"t":{"222":{"position":[[4360,9]]},"242":{"position":[[77,7],[339,4],[429,4]]},"341":{"position":[[144,5],[261,5]]},"347":{"position":[[1941,4]]},"383":{"position":[[392,4]]},"391":{"position":[[2052,4],[2095,4]]}}}],["text",{"_index":274,"t":{"17":{"position":[[311,4],[371,4]]},"102":{"position":[[491,4]]},"278":{"position":[[759,4],[854,4]]},"282":{"position":[[2416,4],[2862,4],[5918,4],[5971,4],[6051,4],[6120,4],[6371,4],[6933,4]]},"289":{"position":[[2504,4],[2567,4],[2631,4]]},"311":{"position":[[177,4],[215,4]]},"424":{"position":[[160,4]]}}}],["textbox",{"_index":1376,"t":{"206":{"position":[[326,7]]}}}],["theme",{"_index":1639,"t":{"244":{"position":[[800,5]]}}}],["themself",{"_index":1760,"t":{"272":{"position":[[67,8]]}}}],["therefor",{"_index":1056,"t":{"112":{"position":[[577,10]]},"294":{"position":[[1849,10]]},"420":{"position":[[800,10]]}}}],["these",{"_index":835,"t":{"86":{"position":[[874,6]]}}}],["thing",{"_index":2458,"t":{"420":{"position":[[2702,6]]}}}],["think",{"_index":1616,"t":{"240":{"position":[[675,5]]},"287":{"position":[[270,5]]}}}],["third",{"_index":944,"t":{"106":{"position":[[0,5]]}}}],["this.baseurl",{"_index":2292,"t":{"391":{"position":[[1149,12]]}}}],["this.canbacklog",{"_index":2341,"t":{"396":{"position":[[611,15]]}}}],["this.canpol",{"_index":2233,"t":{"385":{"position":[[1000,12]]}}}],["this.config",{"_index":2286,"t":{"391":{"position":[[830,12]]}}}],["this.config.token",{"_index":2305,"t":{"391":{"position":[[2449,23]]},"393":{"position":[[2024,23]]},"396":{"position":[[835,23]]}}}],["this.configdir}/currentcr",{"_index":2029,"t":{"347":{"position":[[1346,30]]}}}],["this.discover([someplay",{"_index":2362,"t":{"398":{"position":[[3070,26],[3603,26]]}}}],["this.emitt",{"_index":2258,"t":{"387":{"position":[[1418,14]]}}}],["this.logger.verbose(`config",{"_index":2295,"t":{"391":{"position":[[1294,27]]}}}],["this.playersourceoftruth",{"_index":2349,"t":{"398":{"position":[[1084,24]]}}}],["this.processrecentplays(play",{"_index":2334,"t":{"393":{"position":[[2786,31]]}}}],["this.requiresauth",{"_index":2231,"t":{"385":{"position":[[806,17]]}}}],["this.requiresauthinteract",{"_index":2232,"t":{"385":{"position":[[890,28]]}}}],["this.scrobble(discov",{"_index":2367,"t":{"398":{"position":[[3677,26]]}}}],["this.url.tostr",{"_index":2296,"t":{"391":{"position":[[1353,27]]}}}],["thorough",{"_index":2433,"t":{"420":{"position":[[1330,8]]}}}],["those",{"_index":1060,"t":{"112":{"position":[[1606,5]]},"250":{"position":[[971,5]]},"282":{"position":[[2835,5]]},"289":{"position":[[444,5]]}}}],["though",{"_index":620,"t":{"61":{"position":[[543,6]]},"68":{"position":[[625,6]]},"210":{"position":[[785,7]]},"238":{"position":[[828,7]]}}}],["thread",{"_index":962,"t":{"106":{"position":[[655,6]]}}}],["three",{"_index":724,"t":{"75":{"position":[[643,5]]},"222":{"position":[[3459,5]]},"240":{"position":[[168,5]]},"282":{"position":[[3370,5]]}}}],["threshold",{"_index":797,"t":{"83":{"position":[[68,10]]},"86":{"position":[[1011,11]]},"96":{"position":[[11,9],[162,10]]},"112":{"position":[[1276,9],[1478,11]]},"218":{"position":[[89,9],[228,10]]},"398":{"position":[[178,9]]}}}],["through",{"_index":175,"t":{"13":{"position":[[1842,7]]},"17":{"position":[[758,7]]},"23":{"position":[[2569,7]]},"86":{"position":[[498,7]]},"110":{"position":[[81,7]]},"164":{"position":[[74,7]]},"210":{"position":[[711,7],[728,7]]},"385":{"position":[[988,7]]},"393":{"position":[[2593,7]]},"448":{"position":[[1123,7],[1155,7]]}}}],["throw",{"_index":302,"t":{"17":{"position":[[1396,5]]},"347":{"position":[[477,6],[664,5],[2757,5],[2881,5]]},"391":{"position":[[942,5],[1095,5],[1224,5],[2037,5],[2582,5],[2615,5]]},"393":{"position":[[2558,5]]},"396":{"position":[[1064,5]]}}}],["thrown",{"_index":731,"t":{"77":{"position":[[285,7],[660,7]]}}}],["time",{"_index":29,"t":{"7":{"position":[[152,5]]},"13":{"position":[[2173,4],[3798,4]]},"86":{"position":[[710,4],[929,4]]},"92":{"position":[[182,4]]},"100":{"position":[[161,5]]},"106":{"position":[[92,5],[519,4]]},"108":{"position":[[1507,5]]},"190":{"position":[[237,4],[312,4]]},"204":{"position":[[337,5]]},"222":{"position":[[148,4],[1688,4]]},"226":{"position":[[174,5]]},"232":{"position":[[666,5]]},"347":{"position":[[1583,4]]},"393":{"position":[[1243,5]]},"402":{"position":[[868,5]]},"406":{"position":[[870,5]]},"420":{"position":[[1122,4],[3239,4]]},"444":{"position":[[591,4]]}}}],["timestamp",{"_index":2185,"t":{"380":{"position":[[476,9]]},"389":{"position":[[896,9]]},"393":{"position":[[850,9]]},"396":{"position":[[134,9]]},"398":{"position":[[2424,9]]}}}],["timezon",{"_index":2112,"t":{"368":{"position":[[481,8],[3015,8]]},"370":{"position":[[1062,8]]},"432":{"position":[[260,8]]}}}],["tip",{"_index":103,"t":{"11":{"position":[[0,3]]},"13":{"position":[[1900,3],[3608,3]]},"23":{"position":[[426,3],[1183,3]]},"35":{"position":[[1467,3]]},"212":{"position":[[514,3]]},"240":{"position":[[594,3]]},"265":{"position":[[1502,3],[1619,3]]},"282":{"position":[[4346,3]]},"339":{"position":[[74,3]]},"366":{"position":[[0,3]]},"370":{"position":[[0,3]]},"374":{"position":[[1265,3]]},"442":{"position":[[2175,3]]},"444":{"position":[[0,3]]}}}],["titl",{"_index":1390,"t":{"206":{"position":[[1125,6],[1430,5],[1712,5]]},"226":{"position":[[130,6],[458,5],[543,5],[574,5],[598,5]]},"236":{"position":[[1408,5],[1441,9],[2520,8]]},"238":{"position":[[126,6],[202,8],[256,5]]},"242":{"position":[[845,8],[881,5],[1072,6]]},"244":{"position":[[785,5]]},"248":{"position":[[579,5],[735,8],[869,8]]},"250":{"position":[[604,5],[679,8],[778,5],[868,5],[982,6],[1548,8],[1660,9]]},"252":{"position":[[153,8],[207,5]]},"263":{"position":[[61,6],[136,5],[393,8],[425,5]]},"276":{"position":[[523,8],[577,5]]},"282":{"position":[[414,5],[2347,5],[2471,6],[2614,5],[2737,5],[2972,5],[3021,8],[3227,6],[3282,5],[3334,6],[3427,5],[3556,5],[4310,5],[4488,8],[4702,5],[4744,5],[4836,8],[5403,5],[5438,8],[5658,8]]},"289":{"position":[[1477,6],[2561,5],[3036,5]]},"292":{"position":[[248,5]]},"294":{"position":[[190,5],[588,5],[638,8],[827,6],[836,8]]},"298":{"position":[[533,8]]},"307":{"position":[[687,8]]},"313":{"position":[[268,6]]},"315":{"position":[[271,8],[785,8],[826,5]]},"319":{"position":[[209,8],[246,5],[291,5],[418,7]]},"322":{"position":[[72,8],[212,5],[220,8]]},"324":{"position":[[44,5],[70,8]]},"326":{"position":[[38,8],[85,8]]}}}],["title.mp4",{"_index":1397,"t":{"206":{"position":[[1772,9]]}}}],["title/album",{"_index":1825,"t":{"282":{"position":[[3951,11],[5026,11],[5816,11]]}}}],["title/artist/album/listen",{"_index":1557,"t":{"228":{"position":[[307,28],[688,28]]}}}],["title>.+?)\\\\.\\\\w+$/i",{"_index":1399,"t":{"206":{"position":[[1806,24]]}}}],["titleonli",{"_index":1596,"t":{"236":{"position":[[1336,12],[1801,11]]}}}],["titles/artist",{"_index":1835,"t":{"282":{"position":[[6473,14]]}}}],["titleweight",{"_index":1911,"t":{"289":{"position":[[2592,14]]},"311":{"position":[[1241,14]]}}}],["tld",{"_index":665,"t":{"66":{"position":[[83,4],[333,3]]},"73":{"position":[[157,3],[471,3]]}}}],["tldr",{"_index":1562,"t":{"230":{"position":[[245,5]]},"232":{"position":[[961,4]]}}}],["tmp:noexec",{"_index":2141,"t":{"368":{"position":[[3747,11]]}}}],["tmpf",{"_index":2139,"t":{"368":{"position":[[3726,6]]}}}],["tmt_yxr90am",{"_index":2450,"t":{"420":{"position":[[2054,13]]}}}],["to",{"_index":909,"t":{"100":{"position":[[107,4]]}}}],["to/great",{"_index":902,"t":{"98":{"position":[[332,10]]}}}],["toggl",{"_index":886,"t":{"96":{"position":[[1016,8]]},"112":{"position":[[779,8]]},"345":{"position":[[515,7]]}}}],["token",{"_index":243,"t":{"13":{"position":[[4897,8]]},"31":{"position":[[501,8],[916,8]]},"37":{"position":[[310,8],[601,8]]},"57":{"position":[[365,5]]},"59":{"position":[[100,5],[348,8],[659,8]]},"75":{"position":[[437,5]]},"77":{"position":[[1759,8],[1929,8],[2286,8],[3137,8]]},"79":{"position":[[606,8],[760,8],[920,8],[1537,8]]},"130":{"position":[[729,8],[1020,8]]},"134":{"position":[[279,7]]},"148":{"position":[[594,7]]},"150":{"position":[[36,5],[58,6],[172,5]]},"152":{"position":[[249,6],[457,8],[644,8]]},"154":{"position":[[465,5]]},"156":{"position":[[386,8],[697,8]]},"188":{"position":[[15,5],[230,5],[770,5],[972,5],[1262,5],[1718,5],[2336,8],[2882,8]]},"190":{"position":[[1056,6]]},"347":{"position":[[3079,5],[3219,5]]},"380":{"position":[[365,5]]},"383":{"position":[[607,5],[680,6],[742,6]]},"387":{"position":[[774,6]]},"391":{"position":[[152,5],[811,6],[846,6],[865,5],[896,5],[2442,6]]},"393":{"position":[[2017,6]]},"396":{"position":[[828,6]]},"434":{"position":[[1762,5],[1926,5],[2444,5],[2457,5],[2513,5]]}}}],["token.trim",{"_index":2288,"t":{"391":{"position":[[918,12]]}}}],["toler",{"_index":1836,"t":{"282":{"position":[[6555,8]]}}}],["tool",{"_index":924,"t":{"102":{"position":[[350,5],[614,5]]},"116":{"position":[[135,5]]},"206":{"position":[[96,5]]},"398":{"position":[[77,4]]}}}],["top",{"_index":432,"t":{"27":{"position":[[347,3]]},"31":{"position":[[257,3]]},"236":{"position":[[75,3]]},"289":{"position":[[3084,3],[3120,3]]},"292":{"position":[[143,3]]},"420":{"position":[[1181,3]]},"436":{"position":[[1634,3]]},"440":{"position":[[851,3]]}}}],["topic",{"_index":252,"t":{"13":{"position":[[5065,8]]},"31":{"position":[[1265,8]]}}}],["touch",{"_index":2473,"t":{"424":{"position":[[102,5]]}}}],["toward",{"_index":1792,"t":{"278":{"position":[[869,7]]},"311":{"position":[[1184,7]]}}}],["track",{"_index":48,"t":{"9":{"position":[[49,6],[793,5]]},"61":{"position":[[103,8],[1441,5]]},"81":{"position":[[58,6]]},"86":{"position":[[841,6],[911,5],[973,5],[1070,5],[1202,7]]},"88":{"position":[[44,5],[76,5]]},"92":{"position":[[137,5],[198,5]]},"96":{"position":[[56,5]]},"106":{"position":[[81,5],[493,6],[617,6]]},"108":{"position":[[1930,5],[2489,9],[2519,5],[2788,8],[2945,8],[3233,5]]},"112":{"position":[[121,5],[487,7],[1310,5]]},"130":{"position":[[89,6]]},"154":{"position":[[96,6]]},"162":{"position":[[174,6]]},"164":{"position":[[253,6],[441,5]]},"166":{"position":[[58,5],[277,6],[407,5],[456,6],[471,6],[543,6],[558,6]]},"170":{"position":[[276,6]]},"182":{"position":[[78,8],[234,6]]},"190":{"position":[[150,5],[186,5]]},"198":{"position":[[313,6]]},"206":{"position":[[2005,5]]},"218":{"position":[[134,5]]},"222":{"position":[[444,7]]},"232":{"position":[[760,5],[954,6]]},"238":{"position":[[581,6]]},"244":{"position":[[1112,6]]},"250":{"position":[[862,5],[1470,5]]},"263":{"position":[[55,5],[94,5]]},"265":{"position":[[649,6]]},"267":{"position":[[46,6]]},"282":{"position":[[2063,5],[2124,5],[3765,5]]},"287":{"position":[[437,5]]},"289":{"position":[[1436,5],[1515,8]]},"315":{"position":[[820,5]]},"349":{"position":[[70,7],[140,5],[184,6],[207,5],[236,5],[437,6],[476,6],[571,5]]},"380":{"position":[[462,6],[586,6],[616,6]]},"383":{"position":[[2025,5],[2152,5]]},"389":{"position":[[62,5],[566,5],[813,6]]},"393":{"position":[[303,5],[417,5],[1072,5],[1393,5],[2158,5],[2223,5],[2625,5],[2687,5]]},"396":{"position":[[45,6],[116,5],[156,5],[593,6],[897,5]]},"398":{"position":[[423,5],[711,5],[1051,6],[2241,5],[2409,5],[2635,5],[2902,5],[3172,7],[3931,5]]},"412":{"position":[[288,6]]},"416":{"position":[[196,5],[265,5],[345,5],[386,5],[413,8]]},"420":{"position":[[819,6],[1013,5],[1099,5]]},"444":{"position":[[554,6]]},"446":{"position":[[460,5]]},"448":{"position":[[1630,5],[1759,7]]},"450":{"position":[[128,6]]}}}],["track'",{"_index":856,"t":{"92":{"position":[[587,7]]}}}],["track/record",{"_index":1802,"t":{"282":{"position":[[134,15]]}}}],["track/song",{"_index":1848,"t":{"287":{"position":[[81,11]]}}}],["track/title/album",{"_index":1927,"t":{"294":{"position":[[1545,17]]}}}],["tracknam",{"_index":2269,"t":{"389":{"position":[[692,10],[820,10]]}}}],["tracks/play",{"_index":2324,"t":{"393":{"position":[[1907,13]]}}}],["trade",{"_index":956,"t":{"106":{"position":[[444,5]]}}}],["traffic",{"_index":981,"t":{"108":{"position":[[939,7]]}}}],["tranform",{"_index":1693,"t":{"250":{"position":[[1080,10]]}}}],["transform",{"_index":360,"t":{"23":{"position":[[279,9],[1978,16]]},"118":{"position":[[610,9],[742,11]]},"126":{"position":[[602,9],[732,11]]},"162":{"position":[[911,9],[1043,11]]},"218":{"position":[[540,11]]},"232":{"position":[[518,11]]},"236":{"position":[[85,12],[490,15],[991,11],[1170,15],[2005,15]]},"238":{"position":[[61,14],[999,11],[1144,14]]},"240":{"position":[[436,14]]},"242":{"position":[[257,14]]},"244":{"position":[[27,15],[170,11],[311,11],[707,10],[740,9]]},"248":{"position":[[845,11]]},"250":{"position":[[1185,10]]},"252":{"position":[[56,11]]},"259":{"position":[[46,15]]},"261":{"position":[[46,15]]},"272":{"position":[[226,15],[795,15]]},"274":{"position":[[146,15]]},"276":{"position":[[289,11]]},"303":{"position":[[46,15]]},"305":{"position":[[134,15]]},"307":{"position":[[323,15]]},"309":{"position":[[231,15]]},"311":{"position":[[455,15]]},"315":{"position":[[199,15]]},"319":{"position":[[469,12]]},"349":{"position":[[621,9]]},"383":{"position":[[2002,9]]},"393":{"position":[[2253,9]]},"396":{"position":[[946,10]]}}}],["tray",{"_index":1204,"t":{"170":{"position":[[136,4]]}}}],["tri",{"_index":327,"t":{"21":{"position":[[285,3]]},"112":{"position":[[2112,3]]},"118":{"position":[[585,3]]},"126":{"position":[[577,3]]},"178":{"position":[[458,3]]},"206":{"position":[[1859,5]]},"222":{"position":[[1710,3]]},"234":{"position":[[354,5]]},"248":{"position":[[45,3]]},"250":{"position":[[565,3],[717,5],[798,5],[1354,3]]},"265":{"position":[[1440,6]]},"269":{"position":[[344,6]]},"282":{"position":[[875,3],[5316,3]]},"294":{"position":[[414,6]]},"347":{"position":[[1602,5]]},"391":{"position":[[1143,3],[1759,3],[2356,3]]},"393":{"position":[[1880,3]]},"396":{"position":[[20,3],[571,3],[742,3]]},"402":{"position":[[899,5],[1366,3]]}}}],["trigger",{"_index":2404,"t":{"406":{"position":[[888,9]]},"462":{"position":[[414,7]]}}}],["trivial",{"_index":2174,"t":{"378":{"position":[[63,9]]}}}],["troubleshoot",{"_index":415,"t":{"25":{"position":[[191,15],[356,15]]},"108":{"position":[[3067,16]]},"222":{"position":[[225,15]]},"402":{"position":[[1340,16]]},"420":{"position":[[2161,15]]}}}],["true",{"_index":96,"t":{"9":{"position":[[1152,4]]},"13":{"position":[[2579,5],[4436,5],[4702,5]]},"25":{"position":[[483,5]]},"27":{"position":[[380,4]]},"43":{"position":[[486,5],[836,5]]},"51":{"position":[[107,4],[688,5],[992,5]]},"55":{"position":[[231,5],[492,5]]},"59":{"position":[[307,5],[618,5]]},"94":{"position":[[724,4],[828,4]]},"96":{"position":[[1390,4],[1494,4]]},"98":{"position":[[254,4],[302,6],[411,5],[522,5],[695,5],[806,5]]},"104":{"position":[[188,5],[491,5]]},"108":{"position":[[2101,4],[3570,4]]},"110":{"position":[[181,6]]},"112":{"position":[[1151,4],[1255,4],[1845,5]]},"114":{"position":[[157,5],[354,5]]},"120":{"position":[[362,5],[597,5]]},"122":{"position":[[1151,4],[2184,5],[2646,5],[2822,5],[3266,5]]},"128":{"position":[[285,5],[542,5]]},"136":{"position":[[364,5],[550,5]]},"140":{"position":[[326,5],[676,5]]},"144":{"position":[[331,5],[635,5]]},"152":{"position":[[441,5],[628,5]]},"156":{"position":[[345,5],[656,5]]},"160":{"position":[[325,5],[586,5]]},"168":{"position":[[114,5],[367,5]]},"172":{"position":[[411,5],[639,5]]},"176":{"position":[[171,5],[437,5]]},"180":{"position":[[235,5],[485,5]]},"188":{"position":[[2305,5],[2632,5],[2851,5],[3178,5]]},"192":{"position":[[282,5],[634,5]]},"196":{"position":[[250,5],[542,5]]},"206":{"position":[[1628,5],[1920,5],[2423,5],[2481,4]]},"208":{"position":[[172,5],[389,5]]},"216":{"position":[[102,6]]},"220":{"position":[[194,5],[389,5]]},"222":{"position":[[1055,5],[1183,5],[1200,4],[2602,5],[2773,5],[2790,4],[3831,5],[4076,5],[4093,4]]},"224":{"position":[[422,5],[617,4],[779,5],[974,4]]},"230":{"position":[[413,5]]},"238":{"position":[[391,5],[457,5],[518,5],[596,5]]},"240":{"position":[[850,4]]},"242":{"position":[[344,4]]},"244":{"position":[[133,4],[461,4]]},"250":{"position":[[1057,5],[1068,4]]},"252":{"position":[[335,4],[446,5]]},"265":{"position":[[1227,4]]},"269":{"position":[[131,4]]},"274":{"position":[[340,4]]},"276":{"position":[[705,4],[761,4]]},"282":{"position":[[765,4]]},"287":{"position":[[1902,4],[1974,4]]},"298":{"position":[[614,4]]},"307":{"position":[[768,4]]},"347":{"position":[[532,4],[2163,4],[2265,4],[2594,4]]},"368":{"position":[[3721,4]]},"385":{"position":[[826,5],[1015,5]]},"391":{"position":[[562,6],[1388,5],[1830,5],[2480,5]]},"396":{"position":[[629,5]]},"420":{"position":[[1603,4],[2438,5],[2457,4]]}}}],["trust",{"_index":719,"t":{"75":{"position":[[462,5]]},"170":{"position":[[1429,8]]},"190":{"position":[[3786,8]]},"420":{"position":[[308,7]]}}}],["truth",{"_index":644,"t":{"61":{"position":[[1563,6]]},"86":{"position":[[555,6]]},"393":{"position":[[69,5]]},"398":{"position":[[627,5]]},"420":{"position":[[130,6],[618,6],[778,5]]}}}],["ts",{"_index":2054,"t":{"349":{"position":[[715,2]]},"385":{"position":[[518,2]]},"389":{"position":[[438,2]]}}}],["ts/j",{"_index":2267,"t":{"389":{"position":[[474,5]]}}}],["tuhe1cphrxi",{"_index":2436,"t":{"420":{"position":[[1779,13]]}}}],["tune",{"_index":2011,"t":{"345":{"position":[[405,4]]}}}],["tunein",{"_index":1173,"t":{"162":{"position":[[137,7]]}}}],["turn",{"_index":410,"t":{"25":{"position":[[0,7],[381,4]]},"108":{"position":[[3288,4]]},"206":{"position":[[2263,4],[2334,6]]},"300":{"position":[[159,7]]},"402":{"position":[[1414,4],[1444,4]]},"418":{"position":[[26,4]]},"420":{"position":[[1420,4],[2192,4],[2312,4]]}}}],["tutori",{"_index":2056,"t":{"351":{"position":[[23,8],[55,8]]}}}],["tv",{"_index":1038,"t":{"110":{"position":[[357,2]]},"222":{"position":[[4855,2]]}}}],["twice",{"_index":2428,"t":{"420":{"position":[[1019,5]]}}}],["two",{"_index":818,"t":{"86":{"position":[[67,3]]},"92":{"position":[[52,3]]},"280":{"position":[[228,3]]},"294":{"position":[[607,3]]},"332":{"position":[[188,3],[575,3],[639,4]]},"343":{"position":[[183,3]]},"347":{"position":[[2011,3]]},"420":{"position":[[942,3],[2946,3]]}}}],["two/anoth",{"_index":1975,"t":{"332":{"position":[[473,11]]}}}],["twog",{"_index":706,"t":{"73":{"position":[[944,5],[1195,5]]},"204":{"position":[[944,5],[1153,5],[1383,5],[1848,5],[2163,5]]}}}],["type",{"_index":115,"t":{"13":{"position":[[195,6],[1488,4],[1959,5],[2325,4],[2406,4],[3171,4],[4407,7],[4674,7],[4847,7],[4980,7]]},"15":{"position":[[22,5],[335,5]]},"23":{"position":[[936,4],[1689,4],[2312,4],[2500,4],[2813,4],[3663,4]]},"31":{"position":[[330,5],[447,7],[552,7],[606,7],[823,7],[1176,7],[1556,7]]},"33":{"position":[[348,4]]},"37":{"position":[[24,4],[224,4],[497,4],[710,7]]},"43":{"position":[[24,4],[422,4],[755,4],[1027,7]]},"51":{"position":[[24,4],[622,4],[910,4],[1136,7]]},"53":{"position":[[562,4]]},"55":{"position":[[24,4],[166,4],[410,4],[593,7]]},"59":{"position":[[24,4],[239,4],[539,4],[772,7]]},"61":{"position":[[386,4],[802,4]]},"66":{"position":[[443,4],[676,4],[926,4],[1114,7]]},"68":{"position":[[468,4],[884,4]]},"73":{"position":[[581,4],[813,4],[1047,4],[1220,7]]},"77":{"position":[[925,7],[1181,7],[1427,7],[1686,7],[1856,7],[2152,7],[2384,7],[2652,7],[2823,7],[3050,7],[3178,7],[3296,7],[3414,7],[3532,7]]},"79":{"position":[[40,6]]},"86":{"position":[[412,5]]},"90":{"position":[[586,5]]},"98":{"position":[[380,7],[664,7]]},"104":{"position":[[655,7]]},"108":{"position":[[1609,4],[1690,4],[1864,4],[1994,5],[2038,4],[2195,5],[2311,7],[2571,5],[2638,4],[2843,7],[2974,4],[3502,7]]},"110":{"position":[[1039,7]]},"114":{"position":[[409,7]]},"120":{"position":[[24,4],[300,4],[522,4],[679,7]]},"122":{"position":[[950,5],[3303,7]]},"128":{"position":[[24,4],[231,4],[469,4],[648,7]]},"130":{"position":[[411,4],[643,4],[916,4],[1129,7]]},"136":{"position":[[24,4],[304,4],[478,4],[586,7]]},"140":{"position":[[24,4],[262,4],[595,4],[867,7]]},"144":{"position":[[24,4],[265,4],[553,4],[779,7]]},"152":{"position":[[24,4],[383,4],[557,4],[666,7]]},"156":{"position":[[24,4],[277,4],[577,4],[810,7]]},"160":{"position":[[24,4],[260,4],[504,4],[687,7]]},"168":{"position":[[24,4],[56,4],[292,4],[467,7]]},"172":{"position":[[24,4],[356,4],[566,4],[716,7]]},"176":{"position":[[24,4],[136,4],[382,4],[570,7]]},"180":{"position":[[24,4],[173,4],[204,7],[409,4],[454,7]]},"186":{"position":[[213,4],[451,4],[701,4],[889,7]]},"188":{"position":[[1570,4],[2248,4],[2775,4],[3243,7]]},"192":{"position":[[24,4],[222,4],[558,4],[832,7]]},"196":{"position":[[24,4],[188,4],[465,4],[679,7]]},"204":{"position":[[1473,4],[1711,4],[2009,4],[2246,7]]},"206":{"position":[[625,6]]},"208":{"position":[[24,4],[137,4],[334,4],[473,7]]},"210":{"position":[[295,5]]},"216":{"position":[[24,4],[347,4],[557,4],[700,7]]},"220":{"position":[[24,4],[133,4],[314,4],[431,7]]},"222":{"position":[[1026,7],[2200,4],[2573,7],[3802,7]]},"224":{"position":[[24,4],[362,4],[703,4],[982,7]]},"234":{"position":[[571,4],[657,7]]},"236":{"position":[[129,4],[138,4],[510,7],[887,7],[1043,4],[1190,7],[1310,7],[1598,7],[1776,7],[2025,7],[2402,7]]},"238":{"position":[[177,7]]},"240":{"position":[[1064,7],[1107,7],[1379,7],[1467,7]]},"242":{"position":[[1295,7],[1577,7]]},"252":{"position":[[128,7]]},"254":{"position":[[377,7]]},"259":{"position":[[66,7],[443,7]]},"261":{"position":[[66,7],[342,7]]},"263":{"position":[[375,7]]},"272":{"position":[[246,7],[815,7]]},"274":{"position":[[166,7]]},"276":{"position":[[177,7],[478,7],[1063,7]]},"282":{"position":[[199,5],[316,5],[1328,5]]},"287":{"position":[[744,4],[846,4]]},"296":{"position":[[216,6]]},"298":{"position":[[494,7]]},"300":{"position":[[691,7]]},"303":{"position":[[66,7],[313,7]]},"305":{"position":[[154,7],[626,7]]},"307":{"position":[[343,7],[648,7]]},"309":{"position":[[251,7],[847,7],[935,7]]},"311":{"position":[[475,7],[751,7],[1068,7]]},"313":{"position":[[389,4]]},"315":{"position":[[219,7],[709,7]]},"319":{"position":[[175,7]]},"366":{"position":[[88,6]]},"374":{"position":[[933,7],[1137,7]]},"383":{"position":[[1131,5],[1462,4],[1542,4],[1648,4],[1748,4]]},"385":{"position":[[426,4],[503,4]]},"387":{"position":[[173,4],[875,5],[1104,4],[1253,6]]},"398":{"position":[[633,4]]},"416":{"position":[[83,4],[129,4],[222,4],[300,4],[369,4]]},"420":{"position":[[1526,7],[2361,7]]},"436":{"position":[[1947,7]]},"440":{"position":[[1164,7]]}}}],["type=simpl",{"_index":2479,"t":{"424":{"position":[[307,11]]}}}],["typeof",{"_index":2287,"t":{"391":{"position":[[888,7],[1037,7]]}}}],["typescript",{"_index":1980,"t":{"337":{"position":[[39,11]]},"343":{"position":[[194,10]]}}}],["tz",{"_index":2113,"t":{"368":{"position":[[495,2],[3075,2]]},"370":{"position":[[1076,2]]},"432":{"position":[[274,2]]}}}],["tz=etc/gmt",{"_index":2111,"t":{"368":{"position":[[460,10]]},"370":{"position":[[1041,10]]},"432":{"position":[[239,10]]}}}],["u",{"_index":2097,"t":{"364":{"position":[[111,1]]},"368":{"position":[[3482,1]]}}}],["ua",{"_index":2373,"t":{"402":{"position":[[526,4],[737,4],[1049,4]]}}}],["ubuntu",{"_index":1235,"t":{"172":{"position":[[391,9],[619,9]]},"422":{"position":[[91,7]]}}}],["ui",{"_index":80,"t":{"9":{"position":[[676,2]]},"122":{"position":[[105,2]]},"188":{"position":[[346,2]]},"368":{"position":[[1500,2]]},"374":{"position":[[1277,2]]},"393":{"position":[[2207,2]]},"434":{"position":[[379,2]]}}}],["uid",{"_index":1225,"t":{"170":{"position":[[1567,3]]},"368":{"position":[[3409,3],[3494,3]]}}}],["uid/gid",{"_index":2145,"t":{"370":{"position":[[310,7]]}}}],["ultim",{"_index":1072,"t":{"118":{"position":[[91,10]]},"126":{"position":[[89,10]]},"162":{"position":[[446,10]]}}}],["un",{"_index":363,"t":{"23":{"position":[[350,2]]}}}],["unabl",{"_index":21,"t":{"7":{"position":[[22,6]]}}}],["unauthent",{"_index":2180,"t":{"380":{"position":[[208,15]]}}}],["unavoid",{"_index":1483,"t":{"222":{"position":[[1959,11]]}}}],["uncaught",{"_index":2408,"t":{"409":{"position":[[184,8]]}}}],["uncom",{"_index":577,"t":{"53":{"position":[[183,9]]},"282":{"position":[[677,9]]},"442":{"position":[[367,9]]}}}],["uncomment/cr",{"_index":1236,"t":{"174":{"position":[[69,16]]}}}],["unconstrain",{"_index":1830,"t":{"282":{"position":[[6066,13]]}}}],["uncorrect",{"_index":1937,"t":{"296":{"position":[[492,11]]}}}],["undefin",{"_index":1812,"t":{"282":{"position":[[1734,9]]},"387":{"position":[[846,11]]},"391":{"position":[[790,10],[875,9],[1024,9],[1746,10]]},"420":{"position":[[1824,9],[2097,9]]}}}],["under",{"_index":441,"t":{"31":{"position":[[239,5]]},"90":{"position":[[569,5]]},"102":{"position":[[438,5]]},"178":{"position":[[337,5]]},"194":{"position":[[275,6]]},"210":{"position":[[82,5]]},"222":{"position":[[2009,5]]},"289":{"position":[[2738,5]]},"420":{"position":[[1499,5]]},"424":{"position":[[46,5]]}}}],["understand",{"_index":1932,"t":{"294":{"position":[[1946,10]]}}}],["undesir",{"_index":1833,"t":{"282":{"position":[[6273,10]]}}}],["undocu",{"_index":2413,"t":{"414":{"position":[[376,13]]}}}],["unexpect",{"_index":1832,"t":{"282":{"position":[[6258,10]]},"347":{"position":[[2646,10],[2798,10]]}}}],["unfortun",{"_index":2418,"t":{"420":{"position":[[200,14]]}}}],["uniqu",{"_index":1556,"t":{"228":{"position":[[300,6],[681,6]]},"234":{"position":[[73,6]]},"236":{"position":[[159,6]]},"294":{"position":[[991,6]]}}}],["unit",{"_index":2476,"t":{"424":{"position":[[241,6]]}}}],["unix",{"_index":1209,"t":{"170":{"position":[[654,4],[786,4],[944,4],[1282,4],[1637,4]]}}}],["unknown",{"_index":1012,"t":{"108":{"position":[[1896,8],[1980,7],[2014,7],[2181,7],[2357,7]]},"122":{"position":[[1123,7]]},"204":{"position":[[510,8],[1240,7],[1431,11]]},"402":{"position":[[1096,7]]},"406":{"position":[[901,7]]},"416":{"position":[[206,9],[286,7]]}}}],["unless",{"_index":1220,"t":{"170":{"position":[[1370,6]]},"190":{"position":[[1123,6]]},"256":{"position":[[1073,6]]},"278":{"position":[[2153,6]]},"294":{"position":[[1643,6]]},"368":{"position":[[1523,6]]},"370":{"position":[[1453,6]]},"398":{"position":[[3845,6]]},"432":{"position":[[517,6]]}}}],["unlik",{"_index":1515,"t":{"222":{"position":[[4795,8]]}}}],["unmatch",{"_index":309,"t":{"17":{"position":[[1648,10]]}}}],["unnam",{"_index":2249,"t":{"387":{"position":[[901,10]]}}}],["unoffici",{"_index":906,"t":{"100":{"position":[[25,10]]},"222":{"position":[[39,10],[265,11]]},"420":{"position":[[485,10]]}}}],["unreli",{"_index":1944,"t":{"311":{"position":[[12,10]]}}}],["unseen",{"_index":2348,"t":{"398":{"position":[[1044,6]]}}}],["unsupport",{"_index":1007,"t":{"108":{"position":[[1487,11]]},"376":{"position":[[0,11]]}}}],["unsur",{"_index":1360,"t":{"204":{"position":[[530,6]]}}}],["untest",{"_index":1414,"t":{"210":{"position":[[531,8]]}}}],["until",{"_index":1808,"t":{"282":{"position":[[1154,5]]}}}],["unus",{"_index":429,"t":{"27":{"position":[[224,8]]}}}],["uosrpjt3u5dhaaup3x",{"_index":954,"t":{"106":{"position":[[332,24]]}}}],["uosrpjt3u5dhaaup3xq30dwfosgqugdsyzl3qe743waavy2eur2ckyjcz4rv123q3psbkxklwa6ahc9xmefev6btfsp8luje3jswwrqogzcduowvzwo5saig",{"_index":943,"t":{"104":{"position":[[226,123],[529,122]]}}}],["up",{"_index":32,"t":{"7":{"position":[[174,3]]},"23":{"position":[[725,2],[1482,2],[1966,2]]},"53":{"position":[[319,2]]},"61":{"position":[[1743,2]]},"222":{"position":[[1656,2]]},"226":{"position":[[256,3]]},"234":{"position":[[18,2]]},"265":{"position":[[1627,2]]},"289":{"position":[[505,2],[2801,2]]},"347":{"position":[[769,2]]},"396":{"position":[[67,2]]},"406":{"position":[[732,2]]},"428":{"position":[[48,2]]},"430":{"position":[[24,2]]},"434":{"position":[[195,2]]},"442":{"position":[[503,2]]},"444":{"position":[[245,2],[371,3]]},"446":{"position":[[311,2]]},"450":{"position":[[8,2]]},"473":{"position":[[299,2]]}}}],["up/logn",{"_index":659,"t":{"63":{"position":[[141,7]]}}}],["updat",{"_index":874,"t":{"96":{"position":[[284,7]]},"206":{"position":[[188,7]]},"307":{"position":[[268,8],[781,6]]},"368":{"position":[[1763,8]]},"471":{"position":[[126,9],[321,6]]},"475":{"position":[[74,6]]}}}],["upgrad",{"_index":2553,"t":{"471":{"position":[[431,10]]}}}],["upper",{"_index":583,"t":{"53":{"position":[[361,5]]},"442":{"position":[[545,5]]}}}],["upstream",{"_index":1475,"t":{"222":{"position":[[1463,8]]},"398":{"position":[[1067,8],[1263,8],[1346,8]]}}}],["upstreamerror",{"_index":2297,"t":{"391":{"position":[[1552,13],[2190,13]]}}}],["uri",{"_index":1187,"t":{"164":{"position":[[244,3],[465,3]]},"190":{"position":[[800,3],[852,3],[880,3],[1097,4],[1281,3],[1494,4],[1664,3],[2124,3],[2818,3],[3988,3],[4167,3]]},"192":{"position":[[185,3]]},"222":{"position":[[2316,4],[2950,4],[3042,3],[3219,4],[3371,3],[3451,3],[3759,4],[4141,4]]},"224":{"position":[[276,3]]},"368":{"position":[[935,3],[2508,4]]},"434":{"position":[[626,4],[746,3]]}}}],["uriblacklist",{"_index":1185,"t":{"164":{"position":[[117,12],[352,15]]},"168":{"position":[[150,15],[403,15]]}}}],["uriwhitelist",{"_index":1186,"t":{"164":{"position":[[133,12]]},"168":{"position":[[170,15],[423,15]]}}}],["url",{"_index":235,"t":{"13":{"position":[[4738,6],[4865,6],[5033,6]]},"21":{"position":[[12,3],[58,4],[439,4],[495,3],[616,3],[850,3]]},"31":{"position":[[465,6],[880,6],[1229,6],[1652,7]]},"33":{"position":[[216,3]]},"35":{"position":[[492,3],[508,3],[563,3],[719,3],[733,3],[808,3],[861,4],[881,3],[909,3],[973,3],[1013,3],[1038,3]]},"37":{"position":[[187,3],[381,6],[672,6]]},"39":{"position":[[350,3],[472,3]]},"41":{"position":[[24,3],[136,3],[174,3],[507,3],[595,3]]},"43":{"position":[[246,3]]},"47":{"position":[[24,3],[136,3],[174,3],[501,3],[589,3]]},"51":{"position":[[330,3]]},"53":{"position":[[525,3]]},"55":{"position":[[102,3],[272,6],[533,6]]},"59":{"position":[[205,3],[420,6],[731,6]]},"68":{"position":[[1663,4]]},"77":{"position":[[1792,6],[1962,6],[2319,6],[2522,6],[2777,6],[3228,6],[3346,6],[3464,6]]},"79":{"position":[[639,6],[793,6],[953,6],[1077,6],[1622,6],[1722,6],[1822,6]]},"96":{"position":[[337,4],[346,3],[524,3],[594,3],[708,3]]},"98":{"position":[[87,3],[444,6],[728,6]]},"112":{"position":[[1490,3],[1511,3],[1529,3],[1702,3],[1861,6]]},"114":{"position":[[90,3],[173,6],[370,6]]},"118":{"position":[[4,3],[62,4],[71,3],[239,3],[337,3],[606,3],[649,3],[687,3],[738,3],[754,3]]},"120":{"position":[[132,3],[378,6],[613,6]]},"122":{"position":[[1285,3],[2215,6],[2853,6]]},"126":{"position":[[4,3],[60,4],[69,3],[235,3],[333,3],[598,3],[641,3],[679,3],[728,3],[744,3]]},"128":{"position":[[128,3],[301,6],[558,6]]},"130":{"position":[[800,6],[1091,6]]},"134":{"position":[[314,3]]},"136":{"position":[[246,3]]},"148":{"position":[[359,3],[629,3],[765,4]]},"152":{"position":[[326,3]]},"156":{"position":[[458,6],[769,6]]},"160":{"position":[[366,6],[627,6]]},"162":{"position":[[339,4],[348,3],[417,4],[426,3],[592,3],[690,3],[907,3],[950,3],[988,3],[1039,3],[1055,3]]},"168":{"position":[[130,6],[383,6]]},"176":{"position":[[204,6],[470,6]]},"178":{"position":[[210,3],[428,3]]},"180":{"position":[[272,6],[522,6]]},"188":{"position":[[42,3],[1645,3],[2353,6],[2899,6]]},"190":{"position":[[891,3],[976,3],[2423,3],[3086,3],[3148,4],[3237,3],[3328,3],[3696,3]]},"196":{"position":[[144,3],[266,6],[558,6]]},"208":{"position":[[205,6],[422,6]]},"210":{"position":[[113,4],[291,3],[411,3],[504,3]]},"212":{"position":[[107,4],[380,3],[462,3]]},"218":{"position":[[284,4],[458,3],[536,3],[552,3]]},"220":{"position":[[117,3],[210,6],[405,6]]},"222":{"position":[[3236,3],[3321,3],[3478,3],[3728,3],[5240,3]]},"236":{"position":[[411,4]]},"272":{"position":[[121,4],[575,3],[598,3],[639,3],[1030,6]]},"345":{"position":[[316,5]]},"347":{"position":[[1092,3],[1170,3],[2353,3]]},"349":{"position":[[430,3]]},"368":{"position":[[1396,3],[2440,4],[2670,3]]},"370":{"position":[[220,3]]},"374":{"position":[[1062,6],[1185,6]]},"391":{"position":[[332,3],[343,6],[428,4],[575,3],[724,4],[1322,4]]},"402":{"position":[[836,3],[921,3],[1616,4],[1625,4]]},"404":{"position":[[89,3],[589,5]]},"434":{"position":[[363,3],[2540,3],[3375,4]]},"442":{"position":[[966,4],[1659,3],[1675,3],[1730,3],[1897,3]]},"462":{"position":[[300,3]]}}}],["url(norm",{"_index":2281,"t":{"391":{"position":[[585,12]]}}}],["url.pathnam",{"_index":2283,"t":{"391":{"position":[[666,13],[691,12]]}}}],["url.port",{"_index":2282,"t":{"391":{"position":[[601,9],[623,8],[642,8]]}}}],["url/cod",{"_index":1516,"t":{"222":{"position":[[5017,8]]}}}],["urlbas",{"_index":557,"t":{"49":{"position":[[115,7]]}}}],["us",{"_index":57,"t":{"9":{"position":[[239,4],[342,5],[970,5]]},"13":{"position":[[35,6],[448,3],[1409,3],[1885,5],[2043,4],[2178,4],[2245,5],[3093,3],[3803,4],[3870,5]]},"15":{"position":[[313,5]]},"17":{"position":[[5,5],[128,5],[941,4],[1314,4],[1763,3],[1806,4],[1831,3],[1882,3],[1901,4]]},"21":{"position":[[24,4],[292,3],[353,3],[363,6]]},"23":{"position":[[452,3],[766,3],[944,3],[1209,3],[1523,3],[1697,3],[1863,4],[2147,3],[2320,3],[2514,5],[2657,5],[2821,3],[3352,3],[3452,4],[3671,3]]},"25":{"position":[[127,3],[182,4]]},"27":{"position":[[285,5],[339,3]]},"33":{"position":[[331,3]]},"35":{"position":[[6,4],[281,3],[315,5],[444,5],[516,3],[723,5],[812,4]]},"39":{"position":[[253,3],[385,5],[417,3],[444,5]]},"41":{"position":[[31,4],[144,3],[188,3],[573,5]]},"43":{"position":[[253,3]]},"45":{"position":[[105,3],[209,5],[287,3],[318,3]]},"47":{"position":[[31,4],[144,3],[188,3],[567,5]]},"49":{"position":[[15,5],[86,5]]},"51":{"position":[[139,5],[337,3],[515,3]]},"53":{"position":[[82,5],[581,4]]},"57":{"position":[[374,3]]},"61":{"position":[[6,4],[1202,5]]},"63":{"position":[[35,3],[149,5]]},"66":{"position":[[11,4],[179,3]]},"68":{"position":[[6,4],[1280,5],[1478,3],[1563,3],[1614,3]]},"73":{"position":[[23,4],[164,5],[271,3]]},"75":{"position":[[553,4]]},"77":{"position":[[1329,4]]},"86":{"position":[[277,3]]},"90":{"position":[[49,3],[454,5],[612,3]]},"92":{"position":[[40,4],[662,5]]},"96":{"position":[[147,5],[251,3],[350,4],[556,3],[730,4]]},"100":{"position":[[20,4],[191,3]]},"102":{"position":[[40,4],[94,4],[225,3]]},"108":{"position":[[36,5],[236,5],[778,5],[837,5],[2230,5],[2585,6],[3410,5]]},"112":{"position":[[53,3],[218,3],[648,3],[1463,5],[1543,3],[1648,3],[2119,3]]},"116":{"position":[[175,3]]},"118":{"position":[[8,4],[75,4],[275,3],[569,5],[712,3]]},"122":{"position":[[8,5],[320,3],[368,3],[902,3],[1131,3],[1427,3]]},"126":{"position":[[8,4],[73,4],[271,3],[561,5],[704,3]]},"130":{"position":[[125,4],[432,3],[532,4],[576,3]]},"132":{"position":[[119,4]]},"134":{"position":[[183,3],[265,3],[300,4]]},"136":{"position":[[104,3],[260,3]]},"138":{"position":[[110,4],[308,3]]},"140":{"position":[[45,3],[149,4],[193,3]]},"142":{"position":[[111,4],[193,3]]},"144":{"position":[[45,3],[151,4],[195,3]]},"146":{"position":[[124,4]]},"148":{"position":[[238,3],[493,3],[580,3],[615,4],[811,3]]},"150":{"position":[[149,3]]},"152":{"position":[[103,3],[340,3]]},"154":{"position":[[132,4],[474,3]]},"156":{"position":[[45,3],[159,4],[203,3]]},"158":{"position":[[6,4]]},"160":{"position":[[45,3],[147,4],[191,3]]},"162":{"position":[[352,4],[430,4],[628,3],[1013,3]]},"164":{"position":[[111,5],[276,4]]},"166":{"position":[[94,3],[167,5]]},"170":{"position":[[1438,3]]},"172":{"position":[[98,3],[120,7]]},"174":{"position":[[25,5]]},"178":{"position":[[12,3],[214,4],[465,3]]},"180":{"position":[[112,3]]},"182":{"position":[[6,4]]},"186":{"position":[[234,3],[338,4],[382,3]]},"188":{"position":[[55,4],[435,3],[1727,3]]},"190":{"position":[[75,4],[807,3],[1220,3],[1404,3],[1856,3],[2065,3],[2333,3],[2601,5],[3659,3],[3846,5],[3876,3]]},"194":{"position":[[19,4],[233,5],[270,4],[430,5],[635,3]]},"198":{"position":[[6,4]]},"204":{"position":[[51,4],[327,4],[484,5],[561,4],[608,3],[1494,3],[1598,4],[1642,3]]},"206":{"position":[[25,5],[673,4],[1176,5],[1334,3],[1529,5],[2164,4],[2219,3]]},"210":{"position":[[640,3]]},"212":{"position":[[18,3],[72,5],[126,5],[353,3],[435,3]]},"214":{"position":[[81,3]]},"218":{"position":[[213,5],[528,4]]},"222":{"position":[[543,5],[580,3],[1572,5],[1717,3],[1914,3],[2882,3],[3385,3],[3427,5],[4748,5],[4917,5],[5135,5]]},"230":{"position":[[336,4]]},"232":{"position":[[708,5],[1019,3],[1044,5],[1315,3]]},"234":{"position":[[255,4]]},"236":{"position":[[34,5],[206,4],[295,4],[614,4],[693,4],[965,4],[1379,4],[2129,4],[2208,4]]},"238":{"position":[[785,3],[1026,5],[1169,4]]},"242":{"position":[[235,4],[1488,3]]},"244":{"position":[[117,3],[244,5]]},"248":{"position":[[17,4],[116,6],[284,5],[585,5]]},"250":{"position":[[319,3],[557,4],[953,4]]},"252":{"position":[[83,4]]},"254":{"position":[[121,5],[176,4],[452,4]]},"256":{"position":[[58,5],[107,3],[290,4],[476,3],[557,5]]},"259":{"position":[[170,4],[249,4]]},"263":{"position":[[213,3]]},"265":{"position":[[131,4],[222,6],[1517,5]]},"272":{"position":[[76,5],[571,3],[631,4],[913,4]]},"276":{"position":[[316,4]]},"278":{"position":[[89,5],[271,3],[519,5],[993,3],[1181,4],[1368,3],[1454,5]]},"280":{"position":[[261,5]]},"282":{"position":[[335,6],[975,5],[1040,4],[1481,3],[1575,5],[1781,5],[1935,5],[2026,5],[2179,5],[2272,5],[2392,5],[2586,5],[2831,3],[2944,5],[3221,5],[3416,5],[3446,5],[3545,5],[3779,3],[3945,5],[4158,4],[4230,5],[4407,3],[4805,4],[5020,5],[5233,4],[5627,4],[5810,5],[6398,4],[6922,5]]},"287":{"position":[[154,3],[349,3],[423,4],[1044,4],[1188,4],[1211,5]]},"289":{"position":[[387,4],[471,5],[539,4],[697,4],[1171,3],[1922,4],[2090,5],[2754,5],[3145,4]]},"292":{"position":[[40,4],[382,3],[795,3],[1046,5]]},"294":{"position":[[118,3],[1165,3],[1877,5],[1970,5],[2002,3]]},"296":{"position":[[5,5]]},"298":{"position":[[0,3],[249,5]]},"300":{"position":[[59,5]]},"305":{"position":[[0,5]]},"307":{"position":[[217,3]]},"309":{"position":[[112,4]]},"311":{"position":[[206,3],[273,3],[599,3],[833,3],[1110,3]]},"313":{"position":[[15,4],[126,6]]},"315":{"position":[[32,5],[148,5],[508,4],[780,4]]},"317":{"position":[[372,6],[912,4],[960,3]]},"322":{"position":[[0,5]]},"332":{"position":[[370,3]]},"337":{"position":[[213,5]]},"339":{"position":[[133,3],[336,3]]},"341":{"position":[[219,6],[270,3],[332,4]]},"345":{"position":[[392,4]]},"347":{"position":[[812,4],[1439,4]]},"349":{"position":[[49,4],[296,6],[515,3]]},"357":{"position":[[32,3]]},"360":{"position":[[150,4],[415,4],[469,3]]},"362":{"position":[[14,3],[113,3],[720,3]]},"364":{"position":[[45,5],[80,5]]},"368":{"position":[[236,3],[899,5],[1326,3],[1802,5],[1895,5],[2022,5],[2142,3],[2462,5],[2554,5],[2630,4],[2731,3],[3042,5],[3349,5]]},"370":{"position":[[211,3]]},"374":{"position":[[157,3],[481,3],[1333,5]]},"378":{"position":[[186,4],[198,5]]},"380":{"position":[[1018,4]]},"383":{"position":[[54,5],[123,5],[1052,5]]},"385":{"position":[[409,4]]},"389":{"position":[[45,4],[496,3]]},"393":{"position":[[997,3],[1266,5],[3070,4]]},"398":{"position":[[1562,3],[1810,4],[2518,5],[3794,5],[3838,3],[3893,5]]},"402":{"position":[[109,5],[1894,3],[2005,3]]},"404":{"position":[[148,3],[542,3]]},"406":{"position":[[218,5],[316,5],[385,5],[421,5],[487,5],[549,5],[594,4],[634,5]]},"414":{"position":[[171,3]]},"420":{"position":[[478,3],[1405,6],[2657,5]]},"422":{"position":[[46,4]]},"430":{"position":[[60,5]]},"434":{"position":[[706,4],[1234,3],[1351,5],[1382,3],[1771,3],[2167,5],[2553,4],[3160,3],[3344,3],[3576,4],[4131,3]]},"436":{"position":[[20,3],[357,3],[590,3]]},"438":{"position":[[90,3],[323,3]]},"442":{"position":[[266,5],[935,3],[1036,3],[1452,3],[1486,5],[1615,5],[1683,3],[1904,3]]},"446":{"position":[[166,5]]},"448":{"position":[[724,5],[1184,5],[1270,3],[1535,4],[2167,3],[2411,3]]},"471":{"position":[[495,5]]},"473":{"position":[[226,4]]},"475":{"position":[[28,4]]}}}],["usag",{"_index":654,"t":{"63":{"position":[[53,5]]},"77":{"position":[[1673,5]]},"206":{"position":[[1551,5]]},"210":{"position":[[554,5]]},"236":{"position":[[1925,5]]},"238":{"position":[[800,5]]},"345":{"position":[[414,5]]},"368":{"position":[[1599,6]]},"374":{"position":[[698,5]]},"430":{"position":[[591,5],[626,5]]}}}],["user",{"_index":525,"t":{"39":{"position":[[6,5]]},"45":{"position":[[6,5]]},"57":{"position":[[6,5],[360,4]]},"59":{"position":[[95,4]]},"66":{"position":[[264,6]]},"73":{"position":[[359,6]]},"77":{"position":[[1341,5],[2053,4],[2069,5],[2554,7],[2733,7]]},"79":{"position":[[1109,7]]},"86":{"position":[[734,6]]},"88":{"position":[[26,4],[197,6]]},"94":{"position":[[174,4],[308,4]]},"122":{"position":[[590,4],[631,5],[732,6],[1359,4],[1532,4],[2247,7],[2885,7]]},"154":{"position":[[460,4]]},"170":{"position":[[926,4],[1557,4]]},"188":{"position":[[102,5],[175,5],[197,4],[250,4],[265,4],[429,5],[616,4],[635,4],[790,4],[805,4],[849,5],[926,4],[992,4],[1011,4],[1054,4],[1104,4],[1238,4],[1282,4],[1310,4]]},"194":{"position":[[747,6]]},"196":{"position":[[307,7],[599,7]]},"222":{"position":[[1512,6],[2112,4]]},"234":{"position":[[155,4],[175,4]]},"246":{"position":[[68,4]]},"265":{"position":[[774,5]]},"267":{"position":[[171,5]]},"272":{"position":[[49,5],[84,4]]},"313":{"position":[[4,4],[378,4],[397,5]]},"315":{"position":[[227,7],[406,4],[717,7],[761,4]]},"319":{"position":[[183,7]]},"347":{"position":[[829,4],[1140,4],[1298,4],[2273,4],[2322,4],[2717,4]]},"362":{"position":[[1024,4]]},"364":{"position":[[26,4]]},"368":{"position":[[3230,4],[3437,4]]},"374":{"position":[[1098,7]]},"380":{"position":[[350,4]]},"383":{"position":[[592,4],[672,4],[1099,5]]},"385":{"position":[[856,4]]},"391":{"position":[[207,5],[1963,4]]},"398":{"position":[[3143,4]]},"406":{"position":[[296,5]]},"422":{"position":[[159,4]]},"426":{"position":[[60,4],[108,4],[206,4]]},"434":{"position":[[2439,4],[2838,5],[2958,4]]},"448":{"position":[[873,5]]}}}],["user/password",{"_index":2046,"t":{"347":{"position":[[3105,13],[3353,13]]}}}],["user:group",{"_index":2131,"t":{"368":{"position":[[3200,10]]}}}],["usera",{"_index":1422,"t":{"212":{"position":[[252,7]]}}}],["userb",{"_index":1425,"t":{"212":{"position":[[336,7]]}}}],["usernam",{"_index":254,"t":{"13":{"position":[[5099,11]]},"31":{"position":[[1294,11]]},"35":{"position":[[435,8]]},"37":{"position":[[156,8],[360,11],[651,11]]},"59":{"position":[[147,8],[398,11],[709,11]]},"116":{"position":[[282,8]]},"120":{"position":[[210,8],[396,11],[631,11]]},"122":{"position":[[382,8],[491,8],[1647,9],[1737,9]]},"124":{"position":[[215,8]]},"128":{"position":[[172,8],[341,11],[598,11]]},"130":{"position":[[779,11],[1070,11]]},"156":{"position":[[436,11],[747,11]]},"188":{"position":[[1788,9],[1870,9]]},"236":{"position":[[416,9]]},"434":{"position":[[492,8]]},"442":{"position":[[1606,8]]}}}],["usersallow",{"_index":758,"t":{"77":{"position":[[1822,13],[1992,13],[2618,13]]},"79":{"position":[[669,13],[823,13],[1173,13]]},"122":{"position":[[637,11],[2343,13],[2949,13]]},"188":{"position":[[439,10],[708,10],[855,13],[1120,13],[2390,13],[2936,13]]},"194":{"position":[[652,10]]},"196":{"position":[[355,13],[647,13]]}}}],["usersblock",{"_index":1112,"t":{"122":{"position":[[2385,13],[2994,13]]},"188":{"position":[[2435,13],[2981,13]]}}}],["usual",{"_index":1813,"t":{"282":{"position":[[1880,8]]}}}],["v",{"_index":1000,"t":{"108":{"position":[[1313,1],[1344,1]]},"368":{"position":[[1809,1],[1846,1]]},"370":{"position":[[644,1],[799,1]]}}}],["v18.19.1",{"_index":1988,"t":{"339":{"position":[[26,8]]}}}],["valid",{"_index":211,"t":{"13":{"position":[[4003,10]]},"73":{"position":[[69,5]]},"190":{"position":[[1266,5],[1479,5]]},"228":{"position":[[196,5]]},"347":{"position":[[820,8],[1243,8],[1447,8],[2561,6],[2698,5]]},"383":{"position":[[98,5],[1189,5],[1679,5]]},"398":{"position":[[2292,5],[2329,5]]},"409":{"position":[[330,6]]},"434":{"position":[[611,5]]}}}],["valkey",{"_index":368,"t":{"23":{"position":[[728,6],[1485,6],[2118,6],[2398,9],[2601,6],[3022,6],[3069,6],[3107,6],[3260,7],[3495,6],[3646,6],[3824,9]]},"265":{"position":[[1630,6]]}}}],["valkey/valkey",{"_index":398,"t":{"23":{"position":[[3275,13]]}}}],["valkeydata",{"_index":401,"t":{"23":{"position":[[3326,11]]}}}],["valkeydata:/data",{"_index":400,"t":{"23":{"position":[[3300,16]]}}}],["valu",{"_index":280,"t":{"17":{"position":[[421,5],[1279,6],[1432,5]]},"23":{"position":[[834,7],[1591,7],[2215,7]]},"39":{"position":[[430,5]]},"45":{"position":[[326,6]]},"49":{"position":[[176,5]]},"53":{"position":[[488,5]]},"66":{"position":[[412,6]]},"73":{"position":[[550,6]]},"92":{"position":[[254,6],[309,6]]},"94":{"position":[[613,5]]},"96":{"position":[[1279,5]]},"102":{"position":[[107,5],[281,6],[552,5],[757,5],[798,5]]},"104":{"position":[[96,5]]},"112":{"position":[[1042,5]]},"118":{"position":[[289,6]]},"122":{"position":[[310,5]]},"126":{"position":[[285,6]]},"150":{"position":[[99,5],[162,5]]},"162":{"position":[[642,6]]},"170":{"position":[[1129,7],[1693,5]]},"194":{"position":[[200,5]]},"204":{"position":[[202,6]]},"206":{"position":[[926,6]]},"222":{"position":[[791,5]]},"224":{"position":[[96,5]]},"238":{"position":[[688,5],[862,5],[917,6]]},"242":{"position":[[210,5],[272,6]]},"250":{"position":[[1038,6]]},"282":{"position":[[5252,5]]},"289":{"position":[[745,6]]},"319":{"position":[[399,5]]},"347":{"position":[[468,5]]},"434":{"position":[[226,6],[823,6],[2602,6]]},"436":{"position":[[443,5],[945,5],[1088,5],[1230,5],[1368,5]]},"438":{"position":[[176,5]]},"440":{"position":[[162,5],[305,5],[447,5],[585,5]]},"442":{"position":[[675,5],[700,6],[1080,6],[1940,6],[1973,6]]}}}],["var/run/avahi",{"_index":1002,"t":{"108":{"position":[[1346,14]]}}}],["var/run/dbus:/var/run/dbu",{"_index":1001,"t":{"108":{"position":[[1315,27]]}}}],["vari",{"_index":2309,"t":{"393":{"position":[[460,7]]}}}],["variabl",{"_index":108,"t":{"13":{"position":[[62,9],[342,9],[1033,9],[1234,9],[1249,8],[2894,9],[2909,8]]},"17":{"position":[[84,9],[448,8],[726,10],[1188,8],[1567,8],[1739,8]]},"23":{"position":[[864,8],[1621,8],[2245,8],[2741,8],[3588,8]]},"37":{"position":[[43,8]]},"43":{"position":[[43,8]]},"51":{"position":[[43,8],[162,9]]},"55":{"position":[[43,8]]},"59":{"position":[[43,8]]},"66":{"position":[[462,8]]},"73":{"position":[[600,8]]},"98":{"position":[[27,8]]},"104":{"position":[[27,8]]},"110":{"position":[[122,8]]},"114":{"position":[[27,8]]},"120":{"position":[[43,8]]},"122":{"position":[[1225,8]]},"128":{"position":[[43,8]]},"130":{"position":[[440,9]]},"136":{"position":[[43,8]]},"140":{"position":[[53,9]]},"144":{"position":[[53,9]]},"152":{"position":[[43,8]]},"156":{"position":[[53,9]]},"160":{"position":[[53,9]]},"172":{"position":[[43,8]]},"176":{"position":[[43,8]]},"180":{"position":[[43,8]]},"186":{"position":[[242,9]]},"188":{"position":[[1589,8]]},"192":{"position":[[43,8]]},"196":{"position":[[43,8]]},"204":{"position":[[1502,9]]},"208":{"position":[[43,8]]},"216":{"position":[[43,8]]},"220":{"position":[[43,8]]},"224":{"position":[[43,8]]},"368":{"position":[[3066,8],[3373,9]]},"374":{"position":[[1362,9]]},"402":{"position":[[1515,8]]},"432":{"position":[[420,9]]}}}],["variou",{"_index":1627,"t":{"242":{"position":[[932,8],[975,8]]},"313":{"position":[[284,7]]},"315":{"position":[[316,8]]},"330":{"position":[[33,8]]}}}],["veri",{"_index":128,"t":{"13":{"position":[[547,4]]},"25":{"position":[[262,4]]},"398":{"position":[[3863,4]]}}}],["verifi",{"_index":79,"t":{"9":{"position":[[656,8]]},"17":{"position":[[1694,6],[1854,6]]},"61":{"position":[[1430,10]]},"206":{"position":[[293,6],[492,6]]},"398":{"position":[[3226,8]]}}}],["version",{"_index":838,"t":{"86":{"position":[[1053,7]]},"226":{"position":[[556,8]]},"244":{"position":[[921,8],[976,8]]},"313":{"position":[[250,8]]},"315":{"position":[[290,9]]},"324":{"position":[[26,8],[89,9]]},"339":{"position":[[170,8],[370,7]]},"374":{"position":[[193,7]]},"391":{"position":[[1859,7],[1928,7],[1991,8]]},"471":{"position":[[164,7],[473,7],[550,8]]}}}],["via",{"_index":50,"t":{"9":{"position":[[98,3],[445,3],[665,3]]},"31":{"position":[[767,3],[1120,3]]},"124":{"position":[[188,3]]},"337":{"position":[[313,3]]},"368":{"position":[[1400,3]]},"434":{"position":[[1621,3],[1793,3]]}}}],["view",{"_index":575,"t":{"53":{"position":[[168,4]]},"68":{"position":[[134,7],[1441,4],[1632,4]]},"198":{"position":[[106,7]]},"204":{"position":[[649,4]]},"368":{"position":[[1028,4],[1067,4],[2638,4],[2738,4]]},"430":{"position":[[514,7]]},"442":{"position":[[352,4]]}}}],["vinyl",{"_index":1901,"t":{"289":{"position":[[1782,5]]}}}],["violat",{"_index":907,"t":{"100":{"position":[[85,9]]}}}],["visibl",{"_index":2301,"t":{"391":{"position":[[1945,10]]}}}],["visit",{"_index":536,"t":{"41":{"position":[[257,5]]},"47":{"position":[[257,5]]},"190":{"position":[[4262,5]]},"222":{"position":[[5215,5]]},"347":{"position":[[2336,5]]},"434":{"position":[[1106,5],[3994,5]]},"444":{"position":[[375,5]]},"462":{"position":[[278,8],[355,5]]}}}],["vite",{"_index":2165,"t":{"374":{"position":[[611,7]]}}}],["vitej",{"_index":1986,"t":{"337":{"position":[[284,6]]}}}],["vlc",{"_index":812,"t":{"83":{"position":[[906,3]]},"172":{"position":[[442,6],[670,6]]},"206":{"position":[[21,3],[91,4],[488,3],[650,3],[693,3],[746,3],[791,3],[830,3],[892,3],[1030,3],[1282,3],[1932,3],[1976,3],[2130,3]]},"208":{"position":[[481,5]]},"236":{"position":[[1657,3]]},"418":{"position":[[61,3],[88,3]]},"448":{"position":[[454,3]]}}}],["vlc.json",{"_index":1597,"t":{"236":{"position":[[1674,8]]}}}],["vlc_password",{"_index":1405,"t":{"208":{"position":[[108,12]]}}}],["vlc_url",{"_index":1403,"t":{"208":{"position":[[82,7]]}}}],["vldjjo",{"_index":1637,"t":{"244":{"position":[[731,8]]}}}],["volum",{"_index":399,"t":{"23":{"position":[[3289,8],[3317,8]]},"170":{"position":[[1225,8]]},"256":{"position":[[1013,8]]},"278":{"position":[[2093,8]]},"368":{"position":[[1191,8],[1969,8]]},"370":{"position":[[1393,8]]},"432":{"position":[[457,8]]}}}],["volume/bind",{"_index":364,"t":{"23":{"position":[[549,11],[1306,11]]}}}],["vote",{"_index":1736,"t":{"265":{"position":[[780,6]]},"267":{"position":[[177,6]]}}}],["vpn",{"_index":1418,"t":{"210":{"position":[[721,3]]}}}],["vs",{"_index":1677,"t":{"248":{"position":[[540,3]]},"250":{"position":[[838,3]]}}}],["vscode",{"_index":1997,"t":{"341":{"position":[[65,7],[321,6]]}}}],["vulfpeck",{"_index":2442,"t":{"420":{"position":[[1878,8]]}}}],["w+.com)/i",{"_index":1955,"t":{"317":{"position":[[669,17]]}}}],["wait",{"_index":736,"t":{"77":{"position":[[458,4],[833,4]]},"86":{"position":[[339,5]]},"222":{"position":[[4186,4]]},"402":{"position":[[65,5]]}}}],["want",{"_index":162,"t":{"13":{"position":[[1507,4],[1630,4],[1681,4],[3190,4],[3313,4],[3364,4],[3448,4]]},"17":{"position":[[1874,4]]},"75":{"position":[[14,4],[265,4],[748,4]]},"122":{"position":[[700,4]]},"150":{"position":[[125,5]]},"188":{"position":[[647,4]]},"210":{"position":[[238,5]]},"222":{"position":[[2245,5]]},"238":{"position":[[777,4]]},"263":{"position":[[26,4],[119,4]]},"265":{"position":[[1563,4]]},"280":{"position":[[68,4]]},"287":{"position":[[341,4],[1740,4]]},"289":{"position":[[348,4],[1213,4]]},"298":{"position":[[127,4]]},"307":{"position":[[14,4],[85,4]]},"311":{"position":[[101,4],[198,4]]},"434":{"position":[[3194,4]]},"436":{"position":[[349,4]]},"438":{"position":[[82,4]]}}}],["wantedby=default.target",{"_index":2484,"t":{"424":{"position":[[416,23]]}}}],["warn",{"_index":220,"t":{"13":{"position":[[4161,7],[4950,7],[5174,7]]},"17":{"position":[[1502,7],[1510,5],[1591,4]]},"27":{"position":[[182,7]]},"31":{"position":[[776,4],[971,7],[1129,4],[1369,7]]},"100":{"position":[[0,7]]},"170":{"position":[[1295,7]]},"222":{"position":[[0,7],[1346,7],[4740,7]]},"282":{"position":[[6038,7]]},"409":{"position":[[71,4]]}}}],["wax",{"_index":2448,"t":{"420":{"position":[[1982,3]]}}}],["way",{"_index":1061,"t":{"112":{"position":[[1754,3]]},"170":{"position":[[815,3]]},"234":{"position":[[80,3]]},"265":{"position":[[366,3],[1239,3]]},"269":{"position":[[143,3]]},"287":{"position":[[263,3]]},"294":{"position":[[321,4]]},"347":{"position":[[2931,3]]},"406":{"position":[[777,3]]},"420":{"position":[[673,3]]},"436":{"position":[[397,3]]},"438":{"position":[[130,3]]},"448":{"position":[[2284,3]]}}}],["web",{"_index":428,"t":{"27":{"position":[[146,3]]},"41":{"position":[[344,3]]},"47":{"position":[[344,3]]},"68":{"position":[[130,3]]},"94":{"position":[[403,3]]},"96":{"position":[[1088,3]]},"112":{"position":[[851,3]]},"116":{"position":[[70,3]]},"122":{"position":[[101,3]]},"124":{"position":[[72,3]]},"190":{"position":[[3070,3],[4272,3]]},"198":{"position":[[102,3]]},"206":{"position":[[35,3],[285,3]]},"222":{"position":[[2208,3]]},"337":{"position":[[142,3]]},"349":{"position":[[426,3]]},"374":{"position":[[564,3],[1273,3]]},"380":{"position":[[50,3]]},"402":{"position":[[2023,3]]},"404":{"position":[[182,3],[200,3],[484,3]]},"406":{"position":[[529,3]]},"448":{"position":[[921,3]]},"452":{"position":[[124,3]]}}}],["webhook",{"_index":239,"t":{"13":{"position":[[4802,11]]},"29":{"position":[[37,8]]},"31":{"position":[[0,8],[187,8],[249,7],[286,8],[322,7],[402,11]]},"210":{"position":[[101,7],[282,8]]},"347":{"position":[[1692,8]]},"380":{"position":[[1023,8]]},"446":{"position":[[327,8]]},"448":{"position":[[730,8]]}}}],["webscrobbl",{"_index":430,"t":{"27":{"position":[[233,14]]},"83":{"position":[[869,12]]},"210":{"position":[[21,12],[314,12],[644,12]]},"212":{"position":[[31,12]]},"214":{"position":[[301,12]]},"216":{"position":[[200,12],[289,12],[708,14]]},"368":{"position":[[2167,14]]},"398":{"position":[[251,14],[1193,13]]},"402":{"position":[[79,12],[409,14],[434,14],[664,14],[689,14],[2425,13]]},"448":{"position":[[441,12]]}}}],["webscrobbler.json",{"_index":1419,"t":{"212":{"position":[[161,17]]}}}],["webscrobbler/lfm",{"_index":2392,"t":{"402":{"position":[[1697,16]]}}}],["websit",{"_index":668,"t":{"66":{"position":[[189,7]]},"68":{"position":[[1424,8]]},"214":{"position":[[101,7],[128,8]]},"420":{"position":[[191,8]]},"436":{"position":[[566,7]]},"438":{"position":[[299,7]]}}}],["websocket",{"_index":879,"t":{"96":{"position":[[472,11],[644,10]]},"178":{"position":[[49,9]]},"347":{"position":[[1887,9]]}}}],["weight",{"_index":1908,"t":{"289":{"position":[[2388,6],[2730,7],[2774,7]]}}}],["well",{"_index":205,"t":{"13":{"position":[[3570,4]]},"21":{"position":[[110,4]]},"31":{"position":[[1520,4]]},"282":{"position":[[6323,4],[6425,4]]},"292":{"position":[[776,5]]},"298":{"position":[[97,4]]},"347":{"position":[[167,4],[1571,4]]},"412":{"position":[[119,5]]},"446":{"position":[[36,4]]},"462":{"position":[[165,4]]}}}],["went",{"_index":2461,"t":{"420":{"position":[[3021,4]]}}}],["wgxl6bsuq343",{"_index":1496,"t":{"222":{"position":[[2716,16],[3945,17]]}}}],["whatev",{"_index":498,"t":{"35":{"position":[[554,8]]},"210":{"position":[[224,9]]},"222":{"position":[[2232,8]]},"311":{"position":[[238,8]]},"442":{"position":[[1721,8]]}}}],["whatever.tld/subdir/api",{"_index":1504,"t":{"222":{"position":[[3585,26]]}}}],["wheatu",{"_index":1681,"t":{"248":{"position":[[772,10],[954,10]]},"282":{"position":[[3058,10],[4525,10],[4689,7],[4730,8],[4937,10],[5475,10],[5537,9],[5695,10]]},"294":{"position":[[675,10],[921,10]]}}}],["when/if",{"_index":2420,"t":{"420":{"position":[[349,7]]}}}],["whether",{"_index":1598,"t":{"238":{"position":[[23,7]]},"398":{"position":[[2676,7]]}}}],["whistl",{"_index":2179,"t":{"380":{"position":[[146,9]]}}}],["whitelist",{"_index":1188,"t":{"164":{"position":[[263,9]]},"172":{"position":[[427,12],[655,12]]},"216":{"position":[[443,12],[664,12]]}}}],["whitelistedapp",{"_index":1047,"t":{"110":{"position":[[771,18],[1014,18]]}}}],["whitelisteddevic",{"_index":1045,"t":{"110":{"position":[[722,21],[965,21]]}}}],["wider",{"_index":1738,"t":{"265":{"position":[[824,5]]},"267":{"position":[[221,5]]}}}],["window",{"_index":925,"t":{"102":{"position":[[356,7]]},"106":{"position":[[509,6]]},"108":{"position":[[996,7]]},"206":{"position":[[196,6]]}}}],["wish",{"_index":386,"t":{"23":{"position":[[2053,4]]},"164":{"position":[[7,4]]},"256":{"position":[[161,4]]},"278":{"position":[[329,4],[1052,4]]},"347":{"position":[[607,4]]},"398":{"position":[[1554,4]]},"420":{"position":[[1992,4]]},"434":{"position":[[2937,4],[3090,4]]}}}],["within",{"_index":276,"t":{"17":{"position":[[323,6],[1286,6]]},"23":{"position":[[2871,6]]},"106":{"position":[[500,6]]},"148":{"position":[[988,6]]},"214":{"position":[[290,6]]},"230":{"position":[[305,6]]},"234":{"position":[[521,6]]},"236":{"position":[[1944,6]]},"242":{"position":[[7,6],[32,6]]},"282":{"position":[[6728,6]]}}}],["without",{"_index":897,"t":{"98":{"position":[[91,7]]},"110":{"position":[[214,7]]},"136":{"position":[[133,7]]},"152":{"position":[[131,7]]},"166":{"position":[[289,7]]},"190":{"position":[[3700,7]]},"216":{"position":[[122,7]]},"282":{"position":[[6018,7]]},"289":{"position":[[477,7]]},"292":{"position":[[45,7]]},"296":{"position":[[162,7]]},"339":{"position":[[391,7]]},"347":{"position":[[2638,7]]},"360":{"position":[[499,7]]},"398":{"position":[[2646,7]]},"414":{"position":[[538,7]]},"448":{"position":[[1739,7],[1836,7]]}}}],["won't",{"_index":1923,"t":{"294":{"position":[[352,5]]}}}],["work",{"_index":296,"t":{"17":{"position":[[1262,5]]},"33":{"position":[[150,7]]},"61":{"position":[[185,5]]},"68":{"position":[[267,5]]},"100":{"position":[[247,4]]},"106":{"position":[[695,6]]},"162":{"position":[[333,5]]},"182":{"position":[[303,4]]},"190":{"position":[[1214,5]]},"198":{"position":[[382,4]]},"210":{"position":[[491,4]]},"222":{"position":[[133,7],[194,5],[1541,7],[1631,5],[4807,4]]},"265":{"position":[[1473,4]]},"269":{"position":[[377,4]]},"289":{"position":[[1989,4]]},"339":{"position":[[237,7]]},"374":{"position":[[58,7]]},"385":{"position":[[885,4]]},"393":{"position":[[663,4]]},"404":{"position":[[429,5]]},"406":{"position":[[350,8]]},"412":{"position":[[166,5],[226,5]]}}}],["workingdirectory=/path/to/multi",{"_index":2480,"t":{"424":{"position":[[319,31]]}}}],["workspac",{"_index":1996,"t":{"341":{"position":[[25,9]]}}}],["world",{"_index":2453,"t":{"420":{"position":[[2087,5]]}}}],["worldwid",{"_index":1869,"t":{"287":{"position":[[1084,11]]},"292":{"position":[[571,9],[984,9]]}}}],["worri",{"_index":2358,"t":{"398":{"position":[[2664,5]]}}}],["wrapped.baileytownsend.dev",{"_index":684,"t":{"68":{"position":[[1482,26]]}}}],["write",{"_index":2456,"t":{"420":{"position":[[2488,5]]}}}],["written",{"_index":1979,"t":{"337":{"position":[[19,7]]}}}],["wrong",{"_index":1931,"t":{"294":{"position":[[1842,6]]},"300":{"position":[[69,5]]}}}],["ws",{"_index":1428,"t":{"214":{"position":[[66,2]]},"216":{"position":[[119,2]]}}}],["ws://192.168.0.101",{"_index":881,"t":{"96":{"position":[[735,20]]},"98":{"position":[[451,21],[735,21]]}}}],["ws://192.168.0.101/api/live/nowplaying/websocket",{"_index":882,"t":{"96":{"position":[[759,48]]}}}],["ws://192.168.0.101:3456/mopidy/w",{"_index":1182,"t":{"162":{"position":[[1180,34]]}}}],["ws://azura.mydomain.com",{"_index":883,"t":{"96":{"position":[[808,25]]}}}],["ws://azura.mydomain.com.com/api/live/nowplaying/websocket",{"_index":884,"t":{"96":{"position":[[837,57]]}}}],["ws://localhost:6680/mopidy/w",{"_index":1176,"t":{"162":{"position":[[542,29],[1070,29]]}}}],["ws://localhost:7905",{"_index":1253,"t":{"178":{"position":[[469,19]]},"180":{"position":[[92,19],[279,22],[529,22]]}}}],["ws://mopidy.mydomain.com:6680/mopidy/w",{"_index":1181,"t":{"162":{"position":[[1120,40]]}}}],["ws://mopidy.mydomain.com:80/mopw",{"_index":1184,"t":{"162":{"position":[[1244,33]]}}}],["ws_blacklist",{"_index":1432,"t":{"216":{"position":[[246,12]]}}}],["ws_enabl",{"_index":1430,"t":{"216":{"position":[[82,9]]}}}],["ws_whitelist",{"_index":1431,"t":{"216":{"position":[[159,12]]}}}],["wss://mydomain.com/custom/azura/w",{"_index":885,"t":{"96":{"position":[[895,36],[935,34]]}}}],["ws|wss]://host:[port",{"_index":878,"t":{"96":{"position":[[401,22]]},"178":{"position":[[241,22]]}}}],["wtf",{"_index":720,"t":{"75":{"position":[[472,4]]}}}],["x",{"_index":903,"t":{"98":{"position":[[348,1]]},"387":{"position":[[840,1]]},"420":{"position":[[3119,2],[3180,2],[3196,1]]}}}],["x11",{"_index":2375,"t":{"402":{"position":[[543,5],[754,5]]}}}],["x86",{"_index":2100,"t":{"368":{"position":[[36,3]]}}}],["x86/arm",{"_index":2536,"t":{"448":{"position":[[1208,7]]}}}],["x86_64",{"_index":2376,"t":{"402":{"position":[[555,7],[766,7]]}}}],["xw",{"_index":1868,"t":{"287":{"position":[[1066,2]]},"292":{"position":[[615,6],[1028,7]]},"305":{"position":[[397,7]]},"309":{"position":[[494,7]]}}}],["xxx",{"_index":2159,"t":{"374":{"position":[[355,5],[378,5]]}}}],["y",{"_index":2077,"t":{"360":{"position":[[486,1]]},"420":{"position":[[3122,2],[3188,2]]}}}],["y4j3",{"_index":709,"t":{"73":{"position":[[960,5],[1211,5]]},"204":{"position":[[960,6],[1169,6],[1399,6],[1864,6],[2179,6]]}}}],["yamaha",{"_index":813,"t":{"83":{"position":[[934,6]]},"448":{"position":[[458,6]]}}}],["ye",{"_index":407,"t":{"23":{"position":[[3642,3],[3695,3]]},"37":{"position":[[94,3],[141,3]]},"43":{"position":[[97,3],[145,3]]},"55":{"position":[[93,3],[142,3]]},"59":{"position":[[91,3],[135,3]]},"66":{"position":[[516,3],[610,3]]},"73":{"position":[[657,3],[760,3]]},"98":{"position":[[73,3],[123,3],[183,3]]},"104":{"position":[[77,3]]},"114":{"position":[[78,3]]},"120":{"position":[[92,3]]},"122":{"position":[[1277,3],[1351,3]]},"128":{"position":[[90,3]]},"180":{"position":[[157,3]]},"188":{"position":[[1637,3],[1705,3]]},"192":{"position":[[100,3],[126,3]]},"196":{"position":[[96,3],[118,3],[135,3]]},"208":{"position":[[121,3]]},"220":{"position":[[92,3]]},"448":{"position":[[2154,4]]}}}],["year",{"_index":1735,"t":{"265":{"position":[[754,4]]},"267":{"position":[[151,4]]}}}],["you'll",{"_index":1559,"t":{"230":{"position":[[0,6]]}}}],["you'r",{"_index":2525,"t":{"444":{"position":[[251,6]]}}}],["you'v",{"_index":1551,"t":{"228":{"position":[[125,6]]}}}],["young",{"_index":1717,"t":{"261":{"position":[[172,7]]}}}],["yourappnam",{"_index":1514,"t":{"222":{"position":[[4498,13]]}}}],["yourconnectionstringher",{"_index":389,"t":{"23":{"position":[[2422,26]]}}}],["yourhostip:yourport",{"_index":1383,"t":{"206":{"position":[[807,19]]}}}],["yourmultiscrobblerinstance]/api/webscrobbl",{"_index":1408,"t":{"210":{"position":[[118,45]]}}}],["yourmusic.com",{"_index":1956,"t":{"317":{"position":[[729,17]]}}}],["yourmusicsource.com",{"_index":1542,"t":{"226":{"position":[[421,21]]}}}],["yourpassword",{"_index":1348,"t":{"196":{"position":[[339,15],[631,15]]}}}],["yourport",{"_index":1384,"t":{"206":{"position":[[846,8]]}}}],["yourself",{"_index":711,"t":{"75":{"position":[[41,8]]},"190":{"position":[[3866,9]]},"222":{"position":[[2086,8]]},"398":{"position":[[353,8]]}}}],["yourus",{"_index":1347,"t":{"196":{"position":[[315,11],[371,10],[607,11],[663,10]]}}}],["youtub",{"_index":716,"t":{"75":{"position":[[239,7]]},"81":{"position":[[152,7]]},"83":{"position":[[975,7]]},"448":{"position":[[475,7]]},"452":{"position":[[204,7]]}}}],["youtube.js/wiki/how",{"_index":1455,"t":{"222":{"position":[[642,19]]}}}],["youtubetv",{"_index":1453,"t":{"222":{"position":[[570,9],[4767,9]]},"406":{"position":[[224,9],[322,9]]}}}],["yt",{"_index":482,"t":{"33":{"position":[[675,2]]},"222":{"position":[[27,2],[185,2],[4975,2],[5381,2]]}}}],["ytm",{"_index":1448,"t":{"222":{"position":[[300,3],[1431,3],[1472,3],[1663,3]]},"224":{"position":[[330,3]]},"406":{"position":[[41,3],[151,3],[622,3],[803,3],[1162,3]]},"420":{"position":[[15,3],[141,3],[187,3],[513,3],[1067,3],[1211,3],[1302,3],[1454,3],[1692,3],[2292,3],[2494,3],[2663,3]]}}}],["ytm_client_id",{"_index":1526,"t":{"224":{"position":[[128,13]]}}}],["ytm_client_secret",{"_index":1528,"t":{"224":{"position":[[179,17]]}}}],["ytm_cooki",{"_index":1525,"t":{"224":{"position":[[82,10]]}}}],["ytm_log_diff",{"_index":1530,"t":{"224":{"position":[[304,12]]}}}],["ytm_log_diff=tru",{"_index":2435,"t":{"420":{"position":[[1632,17]]}}}],["ytm_redirect_uri",{"_index":1529,"t":{"224":{"position":[[238,16]]}}}],["ytmusic",{"_index":772,"t":{"77":{"position":[[2831,10]]},"222":{"position":[[1034,10],[2581,10],[2828,7],[3810,10],[4294,7]]},"224":{"position":[[990,9]]},"420":{"position":[[1534,10],[1729,8],[2369,10],[2539,7]]}}}],["ytmusic.json",{"_index":1464,"t":{"222":{"position":[[982,12],[2537,12],[3406,12]]},"420":{"position":[[1472,14]]}}}],["ytmusic/callback",{"_index":1505,"t":{"222":{"position":[[3627,16]]}}}],["z",{"_index":2463,"t":{"420":{"position":[[3130,2],[3210,2]]}}}]],"pipeline":["stemmer"]}}]
+3 -3
search/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Search the documentation</title><meta data-rh="true" property="og:title" content="Multi-Scrobbler"><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/search/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="robots" content="noindex, follow"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/search/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/search/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/search/" hreflang="x-default"><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
+1 -1
sitemap.xml
··· 1 - <?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://foxxmd.github.io/multi-scrobbler/playground/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/search/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/category/development/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/category/updating/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/koito/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/listenbrainz/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/maloja/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/rocksky/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/tealfm/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/kitchensink/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/azuracast/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/deezer/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/google-cast/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/icecast/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/jellyfin/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/jriver/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/kodi/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/koito-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-endpoint/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-endpoint/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/maloja/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/mopidy/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpd/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpris/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/musikcube/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/plex/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/rocksky-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/subsonic/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/tealfm-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/vlc/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/webscrobbler/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/yamaha-musiccast/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/youtube-music/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/transforms/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/transforms/musicbrainz/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/transforms/native/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/transforms/user/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/development/dev-client/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/development/dev-common/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/development/dev-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/development/flatpak/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/FAQ/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/installation/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/installation/service/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/quickstart/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/updating/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url></urlset> 1 + <?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://foxxmd.github.io/multi-scrobbler/playground/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/search/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/category/development/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/category/updating/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/koito/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/lastfm/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/librefm/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/listenbrainz/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/maloja/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/rocksky/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/clients/tealfm/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/kitchensink/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/azuracast/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/deezer/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/google-cast/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/icecast/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/jellyfin/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/jriver/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/kodi/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/koito-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-endpoint/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/lastfm-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/librefm-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-endpoint/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/listenbrainz-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/maloja/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/mopidy/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpd/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/mpris/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/musikcube/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/plex/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/rocksky-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/spotify/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/subsonic/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/tealfm-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/vlc/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/webscrobbler/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/yamaha-musiccast/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/sources/youtube-music/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/transforms/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/transforms/musicbrainz/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/transforms/native/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/configuration/transforms/user/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/development/dev-client/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/development/dev-common/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/development/dev-source/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/development/flatpak/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/FAQ/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/installation/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/installation/service/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/quickstart/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/updating/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://foxxmd.github.io/multi-scrobbler/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url></urlset>
+1 -1
source.json
··· 1 - {"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"$ref":"#/definitions/SpotifySourceConfig"},{"$ref":"#/definitions/PlexSourceConfig"},{"$ref":"#/definitions/PlexApiSourceConfig"},{"$ref":"#/definitions/TautulliSourceConfig"},{"$ref":"#/definitions/DeezerSourceConfig"},{"$ref":"#/definitions/DeezerInternalSourceConfig"},{"$ref":"#/definitions/ListenbrainzEndpointSourceConfig"},{"$ref":"#/definitions/LastFMEndpointSourceConfig"},{"$ref":"#/definitions/SubSonicSourceConfig"},{"$ref":"#/definitions/JellySourceConfig"},{"$ref":"#/definitions/JellyApiSourceConfig"},{"$ref":"#/definitions/LastfmSourceConfig"},{"$ref":"#/definitions/YTMusicSourceConfig"},{"$ref":"#/definitions/MPRISSourceConfig"},{"$ref":"#/definitions/MopidySourceConfig"},{"$ref":"#/definitions/ListenBrainzSourceConfig"},{"$ref":"#/definitions/JRiverSourceConfig"},{"$ref":"#/definitions/KodiSourceConfig"},{"$ref":"#/definitions/WebScrobblerSourceConfig"},{"$ref":"#/definitions/ChromecastSourceConfig"},{"$ref":"#/definitions/MalojaSourceConfig"},{"$ref":"#/definitions/MusikcubeSourceConfig"},{"$ref":"#/definitions/MusicCastSourceConfig"},{"$ref":"#/definitions/MPDSourceConfig"},{"$ref":"#/definitions/VLCSourceConfig"},{"$ref":"#/definitions/IcecastSourceConfig"},{"$ref":"#/definitions/AzuracastSourceConfig"},{"$ref":"#/definitions/KoitoSourceConfig"},{"$ref":"#/definitions/TealSourceConfig"},{"$ref":"#/definitions/RockskySourceConfig"}],"definitions":{"SpotifySourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SpotifySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"SpotifySourceConfig"},"SpotifySourceData":{"type":"object","properties":{"interval":{"type":"number","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","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"spotify client id","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"clientSecret":{"type":"string","description":"spotify client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"spotify redirect URI -- required only if not the default shown here. URI must end in \"callback\"","default":"http://localhost:9078/callback","examples":["http://localhost:9078/callback"]}},"required":["clientId","clientSecret"],"title":"SpotifySourceData"},"CommonSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonSourceOptions"},"LogLevel":{"type":"string","enum":["silent","fatal","error","warn","info","log","verbose","debug"],"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.","title":"LogLevel"},"FileLogOptions":{"type":"object","properties":{"timestamp":{"type":"string","enum":["unix","iso","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","default":"auto"},"size":{"type":["number","string"],"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.","default":"10MB"},"frequency":{"anyOf":[{"type":"string","enum":["daily"]},{"type":"string","enum":["hourly"]},{"type":"number"}],"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.","default":"daily"},"path":{"anyOf":[{"type":"string"},{"$comment":"() => string"}],"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","default":"./logs/app.log"},"level":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false}],"description":"Specify the minimum log level to output to rotating files. If `false` no log files will be created."}},"title":"FileLogOptions"},"ScrobbleThresholds":{"type":"object","properties":{"duration":{"type":["number","null"],"description":"The number of seconds a track has been listened to before it should be considered scrobbled.\n\nSet to null to disable.","default":240,"examples":[240]},"percent":{"type":["number","null"],"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.","default":50,"examples":[50]}},"title":"ScrobbleThresholds"},"PlayTransformOptions":{"type":"object","properties":{"log":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["all"]}]},"preCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"},"compare":{"type":"object","properties":{"candidate":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"},"existing":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"}}},"postCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%3E"}},"title":"PlayTransformOptions"},"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm)>":{"anyOf":[{"$ref":"#/definitions/PlayTransformPartsArray%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"}],"description":"Represents the weakly-defined user config. May be an array of parts or one parts object","title":"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm)>"},"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>":{"type":"array","items":{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4914%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},"title":"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>"},"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>":{"anyOf":[{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeMetadata"},"name":{"type":"string"},"score":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeUser"},"name":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string","enum":["native"]},"name":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"name":{"type":"string"}}},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{},"artists":{},"albumArtists":{},"album":{},"duration":{},"meta":{},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"}},"required":["type"]}],"title":"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4914[]|ExternalMetadataTerm),MaybeStageTyped>"},"WhenConditionsConfig":{"$ref":"#/definitions/WhenConditions%3Cstring%3E","title":"WhenConditionsConfig"},"WhenConditions<string>":{"type":"array","items":{"$ref":"#/definitions/WhenParts%3Cstring%3E"},"title":"WhenConditions<string>"},"WhenParts<string>":{"$ref":"#/definitions/PlayTransformPartsAtomic%3Cstring%3E","title":"WhenParts<string>"},"PlayTransformPartsAtomic<string>":{"type":"object","properties":{"title":{"type":"string"},"artists":{"type":"string"},"albumArtists":{"type":"string"},"album":{"type":"string"},"duration":{"type":"string"},"meta":{"type":"string"}},"title":"PlayTransformPartsAtomic<string>"},"Whennable":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"}},"title":"Whennable"},"FlowControlTerm":{"type":"string","enum":["continue","stop"],"title":"FlowControlTerm"},"StageTypeMetadata":{"type":"string","enum":["spotify","musicbrainz","native"],"title":"StageTypeMetadata"},"SearchAndReplaceTerm":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ConditionalSearchAndReplaceTerm"}],"title":"SearchAndReplaceTerm"},"ConditionalSearchAndReplaceTerm":{"$ref":"#/definitions/ConditionalSearchAndReplaceRegExp","title":"ConditionalSearchAndReplaceTerm"},"ConditionalSearchAndReplaceRegExp":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["replace","search"],"title":"ConditionalSearchAndReplaceRegExp"},"SearchAndReplaceRegExp":{"type":"object","properties":{"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["search","replace"],"title":"SearchAndReplaceRegExp"},"ExternalMetadataTerm":{"anyOf":[{"type":"boolean"},{"not":{}},{"$ref":"#/definitions/Whennable"}],"title":"ExternalMetadataTerm"},"StageTypeUser":{"type":"string","enum":["user"],"title":"StageTypeUser"},"PlexSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"PlexSourceConfig"},"PlexSourceData":{"type":"object","properties":{"user":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"libraries":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"servers":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"PlexSourceData"},"PlexApiSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/PlexApiOptions"}},"required":["data","options"],"title":"PlexApiSourceConfig"},"PlexApiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"token":{"type":"string"},"url":{"type":"string","description":"http(s)://HOST:PORT of the Plex server to connect to"},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"}},"required":["url"],"title":"PlexApiData"},"PlexApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"ignoreInvalidCert":{"type":"boolean","description":"Ignore invalid cert errors when connecting to Plex\n\nUseful for Plex servers using \"Required\" Secure Connections with self-signed certificates\n\nDo not enable unless you know you need this.","default":false}},"title":"PlexApiOptions"},"TautulliSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"TautulliSourceConfig"},"DeezerSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"DeezerSourceConfig"},"DeezerData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"deezer client id","examples":["a89cba1569901a0671d5a9875fed4be1"]},"clientSecret":{"type":"string","description":"deezer client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"deezer redirect URI -- required only if not the default shown here. URI must end in \"callback\"","default":"http://localhost:9078/deezer/callback","examples":["http://localhost:9078/deezer/callback"]}},"required":["clientId","clientSecret"],"title":"DeezerData"},"DeezerInternalSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerInternalData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/DeezerInternalSourceOptions"}},"required":["data"],"title":"DeezerInternalSourceConfig"},"DeezerInternalData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"arl":{"type":"string","description":"ARL retrieved from Deezer response header"},"userAgent":{"type":"string","description":"User agent","default":"Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0"}},"required":["arl"],"title":"DeezerInternalData"},"DeezerInternalSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"fuzzyDiscoveryIgnore":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["aggressive"]}]}},"title":"DeezerInternalSourceOptions"},"ListenbrainzEndpointSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenbrainzEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"title":"ListenbrainzEndpointSourceConfig"},"ListenbrainzEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\n\nIf you are using multiple Listenbrainz endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/listenbrainz/usera\n* slug: 'originb' => API URL: http://localhost:9078/api/listenbrainz/originb\n\nIf no slug is found from an extension's incoming webhook event the first Listenbrainz source without a slug will be used"},"token":{"type":["string","null"],"description":"If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source\n\nSee: https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#add-the-user-token-to-your-requests"}},"title":"ListenbrainzEndpointData"},"LastFMEndpointSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFMEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"title":"LastFMEndpointSourceConfig"},"LastFMEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\n\nIf you are using multiple Last.fm endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/lastfm/usera\n* slug: 'originb' => API URL: http://localhost:9078/api/lastfm/originb\n\nIf no slug is found from an extension's incoming webhook event the first Last.fm source without a slug will be used"}},"title":"LastFMEndpointData"},"SubSonicSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SubsonicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"SubSonicSourceConfig"},"SubsonicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL of the subsonic media server to query","examples":["http://airsonic.local"]},"user":{"type":"string","description":"Username to login to the server with","examples":[["MyUser"]]},"password":{"type":"string","description":"Password for the user to login to the server with","examples":["MyPassword"]},"ignoreTlsErrors":{"type":"boolean","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.","default":false},"legacyAuthentication":{"type":"boolean","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","default":false},"usersAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf undefined or an empty string/list MS will scrobble activity from all users"}},"required":["url","user","password"],"title":"SubsonicData"},"JellySourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"JellySourceConfig"},"JellyData":{"type":"object","properties":{"users":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"servers":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"JellyData"},"JellyApiSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/JellyApiOptions"}},"required":["data","options"],"title":"JellyApiSourceConfig"},"JellyApiData":{"type":"object","properties":{"url":{"type":"string","description":"HOST:PORT of the Jellyfin server to connect to"},"user":{"type":"string","description":"The username of the user to authenticate for or track scrobbles for"},"password":{"type":"string","description":"Password of the username to authenticate for\n\nRequired if `apiKey` is not provided."},"apiKey":{"type":"string","description":"API Key to authenticate with.\n\nRequired if `password` is not provided."},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"},"additionalAllowedLibraryTypes":{"type":"array","items":{},"description":"Allow MS to scrobble audio media in libraries classified other than 'music'\n\n`librariesAllow` will achieve the same result as this but this is more convenient if you do not want to explicitly list every library name or are only using `librariesBlock`"},"allowUnknown":{"type":"boolean","description":"Force media with a type of \"Unknown\" to be counted as Audio","default":false},"frontendUrlOverride":{"type":"string","description":"HOST:PORT of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from)\nIf unspecified it will use the normal server HOST and PORT from the `url`\nNecessary if you are using a reverse proxy or other network configuration that prevents the frontend from accessing the server directly\n\nENV: JELLYFIN_FRONTEND_URL_OVERRIDE"}},"required":["url","user"],"title":"JellyApiData"},"JellyApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"JellyApiOptions"},"LastfmSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFmSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `lastfm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"LastfmSourceConfig"},"LastFmSourceData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]},"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"}},"required":["apiKey","secret"],"title":"LastFmSourceData"},"YTMusicSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/YTMusicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"type":"object","properties":{"logAuth":{"type":"boolean","description":"When true MS will log to DEBUG all of the credentials data it receives from YTM"},"logDiff":{"type":"boolean","description":"Always log history diff\n\nBy default MS will log to `WARN` if history diff is inconsistent but does not log if diff is expected (on new tracks found)\nSet this to `true` to ALWAYS log diff on new tracks. Expected diffs will log to `DEBUG` and inconsistent diffs will continue to log to `WARN`","default":false},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}}}},"title":"YTMusicSourceConfig"},"YTMusicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"cookie":{"type":"string","description":"The cookie retrieved from the Request Headers of music.youtube.com after logging in.\n\nSee https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers for how to retrieve this value.","examples":["VISITOR_INFO1_LIVE=jMp2xA1Xz2_PbVc; __Secure-3PAPISID=3AxsXpy0M/AkISpjek; ..."]},"clientId":{"type":"string","description":"Google Cloud Console project OAuth Client ID\n\nGenerated from a custom OAuth Client, see docs"},"clientSecret":{"type":"string","description":"Google Cloud Console project OAuth Client Secret\n\nGenerated from a custom OAuth Client, see docs"},"redirectUri":{"type":"string","description":"Google Cloud Console project OAuth Client Authorized redirect URI\n\nGenerated from a custom OAuth Client, see docs. multi-scrobbler will generate a default based on BASE_URL.\nOnly specify this if the default does not work for you."},"innertubeOptions":{"$ref":"#/definitions/InnertubeOptions","description":"Additional options for authorization and tailoring YTM client"}},"title":"YTMusicData"},"InnertubeOptions":{"type":"object","properties":{"po_token":{"type":"string","description":"Proof of Origin token\n\nMay be required if YTM starts returning 403"},"visitor_data":{"type":"string","description":"Visitor ID value found in VISITOR_INFO1_LIVE or visitorData cookie\n\nMay be required if YTM starts returning 403"},"account_index":{"type":"number","description":"If account login results in being able to choose multiple account, use a zero-based index to choose which one to monitor","examples":[0,1]},"location":{"type":"string"},"lang":{"type":"string"},"generate_session_locally":{"type":"boolean"},"device_category":{"type":"string"},"client_type":{"type":"string"},"timezone":{"type":"string"}},"title":"InnertubeOptions"},"MPRISSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPRISData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"MPRISSourceConfig"},"MPRISData":{"type":"object","properties":{"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any players that START WITH these values, case-insensitive","examples":[["spotify","vlc"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"MPRISData"},"MopidySourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MopidyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"MopidySourceConfig"},"MopidyData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"ws://localhost:6680/mopidy/ws/"},"uriBlacklist":{"type":"array","items":{"type":"string"},"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."},"uriWhitelist":{"type":"array","items":{"type":"string"},"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."},"albumBlacklist":{"type":"array","items":{"type":"string"},"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"]],"default":["Soundcloud"]}},"title":"MopidyData"},"ListenBrainzSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenBrainzSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `listenbrainz.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"ListenBrainzSourceConfig"},"ListenBrainzSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzSourceData"},"JRiverSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JRiverData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"JRiverSourceConfig"},"JRiverData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"http://localhost:52199/MCWS/v1/"},"username":{"type":"string","description":"If you have enabled authentication, the username you set"},"password":{"type":"string","description":"If you have enabled authentication, the password you set"}},"required":["url"],"title":"JRiverData"},"KodiSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KodiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"KodiSourceConfig"},"KodiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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"],"default":"http://localhost:8080/jsonrpc"},"username":{"type":"string","description":"The username set for Remote Control via Web Sever"},"password":{"type":"string","description":"The password set for Remote Control via Web Sever"}},"required":["url","username","password"],"title":"KodiData"},"WebScrobblerSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/WebScrobblerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"title":"WebScrobblerSourceConfig"},"WebScrobblerData":{"type":"object","properties":{"slug":{"type":["string","null"],"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"},"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Block scrobbling from specific WebScrobbler Connectors","examples":[["youtube"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only allow scrobbling from specific WebScrobbler Connectors","examples":[["mixcloud","soundcloud","bandcamp"]]}},"title":"WebScrobblerData"},"ChromecastSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ChromecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"ChromecastSourceConfig"},"ChromecastData":{"type":"object","properties":{"blacklistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"whitelistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"blacklistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any application that START WITH these values, case-insensitive","examples":[["spotify","pandora"]]},"whitelistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"useAvahi":{"type":"boolean","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.","default":false},"useAutoDiscovery":{"type":"boolean","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"},"devices":{"type":"array","items":{"$ref":"#/definitions/ChromecastDeviceInfo"},"description":"A list of Google Cast devices to monitor\n\nIf this is used then `useAutoDiscovery` is set to FALSE, if not explicitly set"},"allowUnknownMedia":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"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","default":false},"forceMediaRecognitionOn":{"type":"array","items":{"type":"string"},"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"}},"title":"ChromecastData"},"ChromecastDeviceInfo":{"type":"object","properties":{"name":{"type":"string","description":"A friendly name to identify this device","examples":["MySmartTV"]},"address":{"type":"string","description":"The IP address of the device","examples":["192.168.0.115"]}},"required":["name","address"],"title":"ChromecastDeviceInfo"},"MalojaSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MalojaSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `maloja.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"MalojaSourceConfig"},"MalojaSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaSourceData"},"MusikcubeSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusikcubeData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"MusikcubeSourceConfig"},"MusikcubeData":{"type":"object","properties":{"url":{"type":"string","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"],"default":"ws://localhost:7905"},"password":{"type":"string","description":"Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation\n\n* musikcube -> settings -> server setup -> password"},"device_id":{"type":"string"}},"required":["password"],"title":"MusikcubeData"},"MusicCastSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusicCastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"MusicCastSourceConfig"},"MusicCastData":{"type":"object","properties":{"url":{"type":"string","description":"The host or URL of the YamahaExtendedControl endpoint to use","examples":[["192.168.0.101","http://192.168.0.101/YamahaExtendedControl"]]}},"required":["url"],"title":"MusicCastData"},"MPDSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPDData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/MPDSourceOptions"}},"required":["data","options"],"title":"MPDSourceConfig"},"MPDData":{"type":"object","properties":{"url":{"type":"string","description":"URL:PORT of the MPD server to connect to\n\nTo use this you must have TCP connections enabled for your MPD server https://mpd.readthedocs.io/en/stable/user.html#client-connections","examples":["localhost:6600"],"default":"localhost:6600"},"path":{"type":"string","description":"If using socket specify the path instead of url.\n\ntrailing `~` is replaced by your home directory"},"password":{"type":"string","description":"Password for the server, if set https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords"}},"title":"MPDData"},"MPDSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"MPDSourceOptions"},"VLCSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/VLCData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/VLCSourceOptions"}},"required":["data"],"title":"VLCSourceConfig"},"VLCData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL:PORT of the VLC server to connect to\n\nTo use this you must have the Web (http) interface module enabled and a password set https://foxxmd.github.io/multi-scrobbler/docs/configuration#vlc","examples":["localhost:8080"],"default":"localhost:8080"},"password":{"type":"string","description":"Password for the server"}},"required":["password"],"title":"VLCData"},"VLCSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"filenamePatterns":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"A list of regular expressions to use to extract metadata (title, album, artist) from a filename\n\nUsed when VLC reports only the filename for the current audio track"},"logFilenamePatterns":{"type":"boolean","description":"Log to DEBUG when a filename-only track is matched or not matched by filenamePatterns","default":false},"dumpVlcMetadata":{"type":"boolean","description":"Dump all the metadata VLC reports for an audio track to DEBUG.\n\nUse this if reporting an issue with VLC not correctly capturing metadata for a track.","default":false}},"title":"VLCSourceOptions"},"IcecastSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/IcecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/IcecastSourceOptions"}},"required":["data"],"title":"IcecastSourceConfig"},"IcecastData":{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/definitions/IcecastSource"}},"icestatsEndpoint":{"type":"string"},"statsEndpoint":{"type":"string"},"nextsongsEndpoint":{"type":"string"},"sevenhtmlEndpoint":{"type":"string"},"icyMetaInt":{"type":"number"},"url":{"type":"string","description":"The Icecast stream URL"}},"required":["url"],"title":"IcecastData"},"IcecastSource":{"type":"string","enum":["icy","ogg","icestats","stats","sevenhtml","nextsongs"],"title":"IcecastSource"},"IcecastSourceOptions":{"type":"object","properties":{"systemScrobble":{"type":"boolean","description":"For Sources that support manual listening, should MS default to scrobbling when no user interaction has occurred?\n\nIf not specified MS will use a Source's specific behavior, see Source's documentation."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"IcecastSourceOptions"},"AzuracastSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/AzuracastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"AzuracastSourceConfig"},"AzuracastData":{"type":"object","properties":{"url":{"type":"string","description":"Base URL of the Azuracast instance\n\nThis does NOT include the station. If a station is included it will be ignored. Use `station` field to specify station, if necessary","examples":["https://radio.mydomain.tld","http://localhost:80"]},"station":{"type":"string","description":"The specific station to monitor\n\nScrobbling will only occur if any of the monitor conditions are met AND the station is ONLINE.\n\nTo monitor multiple stations create a Source for each station.","examples":["my-station-1"]},"monitorWhenListeners":{"type":["boolean","number"],"description":"Only activate scrobble monitoring if station\n\n* `true` => has any current listeners\n* `number` => has EQUAL TO or MORE THAN X number of listeners"},"monitorWhenLive":{"type":"boolean","description":"Only activate scrobble monitoring if station has a live DJ/Streamer","default":true},"apiKey":{"type":"string","description":"API Key used to access data about private streams\n\nhttps://www.azuracast.com/docs/developers/apis/#api-authentication"}},"required":["url","station"],"title":"AzuracastData"},"KoitoSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KoitoSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `koito.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"KoitoSourceConfig"},"KoitoSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoSourceData"},"TealSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/TealSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/TealSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"Should always be `souce` when using Tealfm as a Source","default":"source","examples":["source"]}},"required":["data"],"title":"TealSourceConfig"},"TealSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\n\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\n\n* For **App Password** Auth - your email\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\n\nThis is created under https://bsky.app/settings/app-passwords\n\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"},"serviceAllow":{"type":"array","items":{"type":"string"}},"serviceDeny":{"type":"array","items":{"type":"string"}}},"required":["identifier"],"title":"TealSourceData"},"TealSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealSourceOptions"},"RockskySourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/RockskySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/RockskySourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `rocksky.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"RockskySourceConfig"},"RockskySourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\n\n* alice.bsky.social\n* foxxmd.com\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockskySourceData"},"RockskySourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockskySourceOptions"}}} 1 + {"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"$ref":"#/definitions/SpotifySourceConfig"},{"$ref":"#/definitions/PlexApiSourceConfig"},{"$ref":"#/definitions/DeezerSourceConfig"},{"$ref":"#/definitions/DeezerInternalSourceConfig"},{"$ref":"#/definitions/ListenbrainzEndpointSourceConfig"},{"$ref":"#/definitions/LastFMEndpointSourceConfig"},{"$ref":"#/definitions/SubSonicSourceConfig"},{"$ref":"#/definitions/JellyApiSourceConfig"},{"$ref":"#/definitions/LastfmSourceConfig"},{"$ref":"#/definitions/LibrefmSourceConfig"},{"$ref":"#/definitions/YTMusicSourceConfig"},{"$ref":"#/definitions/MPRISSourceConfig"},{"$ref":"#/definitions/MopidySourceConfig"},{"$ref":"#/definitions/ListenBrainzSourceConfig"},{"$ref":"#/definitions/JRiverSourceConfig"},{"$ref":"#/definitions/KodiSourceConfig"},{"$ref":"#/definitions/WebScrobblerSourceConfig"},{"$ref":"#/definitions/ChromecastSourceConfig"},{"$ref":"#/definitions/MalojaSourceConfig"},{"$ref":"#/definitions/MusikcubeSourceConfig"},{"$ref":"#/definitions/MusicCastSourceConfig"},{"$ref":"#/definitions/MPDSourceConfig"},{"$ref":"#/definitions/VLCSourceConfig"},{"$ref":"#/definitions/IcecastSourceConfig"},{"$ref":"#/definitions/AzuracastSourceConfig"},{"$ref":"#/definitions/KoitoSourceConfig"},{"$ref":"#/definitions/TealSourceConfig"},{"$ref":"#/definitions/RockskySourceConfig"}],"definitions":{"SpotifySourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SpotifySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"SpotifySourceConfig"},"SpotifySourceData":{"type":"object","properties":{"interval":{"type":"number","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","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"spotify client id","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"clientSecret":{"type":"string","description":"spotify client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"spotify redirect URI -- required only if not the default shown here. URI must end in \"callback\"","default":"http://localhost:9078/callback","examples":["http://localhost:9078/callback"]}},"required":["clientId","clientSecret"],"title":"SpotifySourceData"},"CommonSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"CommonSourceOptions"},"LogLevel":{"type":"string","enum":["silent","fatal","error","warn","info","log","verbose","debug"],"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.","title":"LogLevel"},"FileLogOptions":{"type":"object","properties":{"timestamp":{"type":"string","enum":["unix","iso","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","default":"auto"},"size":{"type":["number","string"],"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.","default":"10MB"},"frequency":{"anyOf":[{"type":"string","enum":["daily"]},{"type":"string","enum":["hourly"]},{"type":"number"}],"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.","default":"daily"},"path":{"anyOf":[{"type":"string"},{"$comment":"() => string"}],"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","default":"./logs/app.log"},"level":{"anyOf":[{"$ref":"#/definitions/LogLevel"},{"type":"boolean","const":false}],"description":"Specify the minimum log level to output to rotating files. If `false` no log files will be created."}},"title":"FileLogOptions"},"ScrobbleThresholds":{"type":"object","properties":{"duration":{"type":["number","null"],"description":"The number of seconds a track has been listened to before it should be considered scrobbled.\n\nSet to null to disable.","default":240,"examples":[240]},"percent":{"type":["number","null"],"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.","default":50,"examples":[50]}},"title":"ScrobbleThresholds"},"PlayTransformOptions":{"type":"object","properties":{"log":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["all"]}]},"preCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"},"compare":{"type":"object","properties":{"candidate":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"},"existing":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"}}},"postCompare":{"$ref":"#/definitions/PlayTransformPartsConfig%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%3E"}},"title":"PlayTransformOptions"},"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm)>":{"anyOf":[{"$ref":"#/definitions/PlayTransformPartsArray%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"}],"description":"Represents the weakly-defined user config. May be an array of parts or one parts object","title":"PlayTransformPartsConfig<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm)>"},"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>":{"type":"array","items":{"$ref":"#/definitions/PlayTransformParts%3C(def-alias-617285649-262-339-617285649-0-4937%5B%5D%7CExternalMetadataTerm)%2CMaybeStageTyped%3E"},"title":"PlayTransformPartsArray<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>"},"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>":{"anyOf":[{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeMetadata"},"name":{"type":"string"},"stageHash":{"type":"string"},"score":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"$ref":"#/definitions/StageTypeUser"},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"artists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"albumArtists":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"album":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"duration":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"meta":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/Whennable"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string","enum":["native"]},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"albumArtists":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"album":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"duration":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"meta":{"anyOf":[{"type":"array","items":{"$ref":"#/definitions/SearchAndReplaceTerm"}},{"$ref":"#/definitions/ExternalMetadataTerm"}]},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"name":{"type":"string"}}},{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"title":{},"artists":{},"albumArtists":{},"album":{},"duration":{},"meta":{},"onSuccess":{"$ref":"#/definitions/FlowControlTerm"},"onFailure":{"$ref":"#/definitions/FlowControlTerm"},"onSkip":{"$ref":"#/definitions/FlowControlTerm"},"failureReturnPartial":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"},"stageHash":{"type":"string"}},"required":["type"]}],"title":"PlayTransformParts<(def-alias-617285649-262-339-617285649-0-4937[]|ExternalMetadataTerm),MaybeStageTyped>"},"WhenConditionsConfig":{"$ref":"#/definitions/WhenConditions%3Cstring%3E","title":"WhenConditionsConfig"},"WhenConditions<string>":{"type":"array","items":{"$ref":"#/definitions/WhenParts%3Cstring%3E"},"title":"WhenConditions<string>"},"WhenParts<string>":{"$ref":"#/definitions/PlayTransformPartsAtomic%3Cstring%3E","title":"WhenParts<string>"},"PlayTransformPartsAtomic<string>":{"type":"object","properties":{"title":{"type":"string"},"artists":{"type":"string"},"albumArtists":{"type":"string"},"album":{"type":"string"},"duration":{"type":"string"},"meta":{"type":"string"}},"title":"PlayTransformPartsAtomic<string>"},"Whennable":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"}},"title":"Whennable"},"FlowControlTerm":{"type":"string","enum":["continue","stop"],"title":"FlowControlTerm"},"StageTypeMetadata":{"type":"string","enum":["spotify","musicbrainz","native"],"title":"StageTypeMetadata"},"SearchAndReplaceTerm":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ConditionalSearchAndReplaceTerm"}],"title":"SearchAndReplaceTerm"},"ConditionalSearchAndReplaceTerm":{"$ref":"#/definitions/ConditionalSearchAndReplaceRegExp","title":"ConditionalSearchAndReplaceTerm"},"ConditionalSearchAndReplaceRegExp":{"type":"object","properties":{"when":{"$ref":"#/definitions/WhenConditionsConfig"},"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["replace","search"],"title":"ConditionalSearchAndReplaceRegExp"},"SearchAndReplaceRegExp":{"type":"object","properties":{"search":{"anyOf":[{"type":"string"},{"type":"string","format":"regex"}],"description":"The search value to test for\n\nCan be a normal string (converted to a case-sensitive literal) or a valid regular expression as a string, or an actual RegExp object","examples":[["find this string","/some string*/ig"]]},"replace":{"type":"string","description":"The replacement string/value to use when search is found\n\nThis can be a literal string like `'replace with this`, an empty string to remove the search value (`''`), or a special regex value\n\nSee replacement here for more information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace"},"test":{"$comment":"(obj: SearchAndReplaceRegExp) => boolean","type":"object","properties":{"namedArgs":{"type":"object","properties":{"obj":{"$ref":"#/definitions/SearchAndReplaceRegExp"}},"required":["obj"],"additionalProperties":false}},"description":"An optional function to execute before running this search-and-replace that decides if it should run at all"}},"required":["search","replace"],"title":"SearchAndReplaceRegExp"},"ExternalMetadataTerm":{"anyOf":[{"type":"boolean"},{"not":{}},{"$ref":"#/definitions/Whennable"}],"title":"ExternalMetadataTerm"},"StageTypeUser":{"type":"string","enum":["user"],"title":"StageTypeUser"},"PlexApiSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/PlexApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/PlexApiOptions"}},"required":["data"],"title":"PlexApiSourceConfig"},"PlexApiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"token":{"type":"string"},"url":{"type":"string","description":"http(s)://HOST:PORT of the Plex server to connect to"},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"}},"required":["url"],"title":"PlexApiData"},"PlexApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"ignoreInvalidCert":{"type":"boolean","description":"Ignore invalid cert errors when connecting to Plex\n\nUseful for Plex servers using \"Required\" Secure Connections with self-signed certificates\n\nDo not enable unless you know you need this.","default":false}},"title":"PlexApiOptions"},"DeezerSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"DeezerSourceConfig"},"DeezerData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"clientId":{"type":"string","description":"deezer client id","examples":["a89cba1569901a0671d5a9875fed4be1"]},"clientSecret":{"type":"string","description":"deezer client secret","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"redirectUri":{"type":"string","description":"deezer redirect URI -- required only if not the default shown here. URI must end in \"callback\"","default":"http://localhost:9078/deezer/callback","examples":["http://localhost:9078/deezer/callback"]}},"required":["clientId","clientSecret"],"title":"DeezerData"},"DeezerInternalSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/DeezerInternalData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/DeezerInternalSourceOptions"}},"required":["data"],"title":"DeezerInternalSourceConfig"},"DeezerInternalData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"arl":{"type":"string","description":"ARL retrieved from Deezer response header"},"userAgent":{"type":"string","description":"User agent","default":"Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0"}},"required":["arl"],"title":"DeezerInternalData"},"DeezerInternalSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"fuzzyDiscoveryIgnore":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["aggressive"]}]}},"title":"DeezerInternalSourceOptions"},"ListenbrainzEndpointSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenbrainzEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"title":"ListenbrainzEndpointSourceConfig"},"ListenbrainzEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\n\nIf you are using multiple Listenbrainz endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/listenbrainz/usera\n* slug: 'originb' => API URL: http://localhost:9078/api/listenbrainz/originb\n\nIf no slug is found from an extension's incoming webhook event the first Listenbrainz source without a slug will be used"},"token":{"type":["string","null"],"description":"If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source\n\nSee: https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#add-the-user-token-to-your-requests"}},"title":"ListenbrainzEndpointData"},"LastFMEndpointSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFMEndpointData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"title":"LastFMEndpointSourceConfig"},"LastFMEndpointData":{"type":"object","properties":{"slug":{"type":["string","null"],"description":"The URL ending that should be used to identify scrobbles for this source\n\nIf you are using multiple Last.fm endpoint sources (scrobbles for many users) you can use a slug to match Sources with individual users/origins\n\nExample:\n\n* slug: 'usera' => API URL: http://localhost:9078/api/lastfm/usera\n* slug: 'originb' => API URL: http://localhost:9078/api/lastfm/originb\n\nIf no slug is found from an extension's incoming webhook event the first Last.fm source without a slug will be used"}},"title":"LastFMEndpointData"},"SubSonicSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/SubsonicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"SubSonicSourceConfig"},"SubsonicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL of the subsonic media server to query","examples":["http://airsonic.local"]},"user":{"type":"string","description":"Username to login to the server with","examples":[["MyUser"]]},"password":{"type":"string","description":"Password for the user to login to the server with","examples":["MyPassword"]},"ignoreTlsErrors":{"type":"boolean","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.","default":false},"legacyAuthentication":{"type":"boolean","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","default":false},"usersAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf undefined or an empty string/list MS will scrobble activity from all users"}},"required":["url","user","password"],"title":"SubsonicData"},"JellyApiSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JellyApiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/JellyApiOptions"}},"required":["data","options"],"title":"JellyApiSourceConfig"},"JellyApiData":{"type":"object","properties":{"url":{"type":"string","description":"HOST:PORT of the Jellyfin server to connect to"},"user":{"type":"string","description":"The username of the user to authenticate for or track scrobbles for"},"password":{"type":"string","description":"Password of the username to authenticate for\n\nRequired if `apiKey` is not provided."},"apiKey":{"type":"string","description":"API Key to authenticate with.\n\nRequired if `password` is not provided."},"usersAllow":{"anyOf":[{"type":"string"},{"type":"boolean","enum":[true]},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble for specific users (case-insensitive)\n\nIf `true` MS will scrobble activity from all users"},"usersBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble for these users (case-insensitive)"},"devicesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if device or application name contains strings from this list (case-insensitive)"},"devicesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if device or application name contains strings from this list (case-insensitive)"},"librariesAllow":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only scrobble if library name contains string from this list (case-insensitive)"},"librariesBlock":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Do not scrobble if library name contains strings from this list (case-insensitive)"},"additionalAllowedLibraryTypes":{"type":"array","items":{},"description":"Allow MS to scrobble audio media in libraries classified other than 'music'\n\n`librariesAllow` will achieve the same result as this but this is more convenient if you do not want to explicitly list every library name or are only using `librariesBlock`"},"allowUnknown":{"type":"boolean","description":"Force media with a type of \"Unknown\" to be counted as Audio","default":false},"frontendUrlOverride":{"type":"string","description":"HOST:PORT of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from)\nIf unspecified it will use the normal server HOST and PORT from the `url`\nNecessary if you are using a reverse proxy or other network configuration that prevents the frontend from accessing the server directly\n\nENV: JELLYFIN_FRONTEND_URL_OVERRIDE"}},"required":["url","user"],"title":"JellyApiData"},"JellyApiOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"JellyApiOptions"},"LastfmSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LastFmSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `lastfm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"LastfmSourceConfig"},"LastFmSourceData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"API Key generated from Last.fm/Libre.fm account","examples":["787c921a2a2ab42320831aba0c8f2fc2"]},"secret":{"type":"string","description":"Secret generated from Last.fm/Libre.fm account","examples":["ec42e09d5ae0ee0f0816ca151008412a"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"redirectUri":{"type":"string","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.","default":"http://localhost:9078/lastfm/callback","examples":["http://localhost:9078/lastfm/callback"]},"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"}},"required":["apiKey","secret"],"title":"LastFmSourceData"},"LibrefmSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/LibrefmData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `librefm.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"LibrefmSourceConfig"},"LibrefmData":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"apiKey":{"type":"string","description":"Optional Secret for Libre.fm account\n\nThis can be anything, or it will be generated by multi-scrobbler","examples":["anyValue"]},"secret":{"type":"string","description":"Optional Secret for Libre.fm account\n\nThis can be anything, or it will be generated by multi-scrobbler","examples":["anyValue"]},"session":{"type":"string","description":"Optional session id returned from a completed auth flow"},"path":{"type":"string"},"urlBase":{"type":"string","description":"(Optional) The host and path prefix for your Libre.fm instance","default":"https://libre.fm/2.0/"},"redirectUri":{"type":"string","description":"Optional URI to use for callback. Specify this if callback should be different than the default. MUST have \"librefm/callback\" in the URL somewhere.","default":"http://localhost:9078/librefm/callback","examples":["http://localhost:9078/librefm/callback"]}},"title":"LibrefmData"},"YTMusicSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/YTMusicData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"type":"object","properties":{"logAuth":{"type":"boolean","description":"When true MS will log to DEBUG all of the credentials data it receives from YTM"},"logDiff":{"type":"boolean","description":"Always log history diff\n\nBy default MS will log to `WARN` if history diff is inconsistent but does not log if diff is expected (on new tracks found)\nSet this to `true` to ALWAYS log diff on new tracks. Expected diffs will log to `DEBUG` and inconsistent diffs will continue to log to `WARN`","default":false},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}}}},"title":"YTMusicSourceConfig"},"YTMusicData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"cookie":{"type":"string","description":"The cookie retrieved from the Request Headers of music.youtube.com after logging in.\n\nSee https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copy-authentication-headers for how to retrieve this value.","examples":["VISITOR_INFO1_LIVE=jMp2xA1Xz2_PbVc; __Secure-3PAPISID=3AxsXpy0M/AkISpjek; ..."]},"clientId":{"type":"string","description":"Google Cloud Console project OAuth Client ID\n\nGenerated from a custom OAuth Client, see docs"},"clientSecret":{"type":"string","description":"Google Cloud Console project OAuth Client Secret\n\nGenerated from a custom OAuth Client, see docs"},"redirectUri":{"type":"string","description":"Google Cloud Console project OAuth Client Authorized redirect URI\n\nGenerated from a custom OAuth Client, see docs. multi-scrobbler will generate a default based on BASE_URL.\nOnly specify this if the default does not work for you."},"innertubeOptions":{"$ref":"#/definitions/InnertubeOptions","description":"Additional options for authorization and tailoring YTM client"}},"title":"YTMusicData"},"InnertubeOptions":{"type":"object","properties":{"po_token":{"type":"string","description":"Proof of Origin token\n\nMay be required if YTM starts returning 403"},"visitor_data":{"type":"string","description":"Visitor ID value found in VISITOR_INFO1_LIVE or visitorData cookie\n\nMay be required if YTM starts returning 403"},"account_index":{"type":"number","description":"If account login results in being able to choose multiple account, use a zero-based index to choose which one to monitor","examples":[0,1]},"location":{"type":"string"},"lang":{"type":"string"},"generate_session_locally":{"type":"boolean"},"device_category":{"type":"string"},"client_type":{"type":"string"},"timezone":{"type":"string"}},"title":"InnertubeOptions"},"MPRISSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPRISData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"MPRISSourceConfig"},"MPRISData":{"type":"object","properties":{"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any players that START WITH these values, case-insensitive","examples":[["spotify","vlc"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"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":"MPRISData"},"MopidySourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MopidyData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"MopidySourceConfig"},"MopidyData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"ws://localhost:6680/mopidy/ws/"},"uriBlacklist":{"type":"array","items":{"type":"string"},"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."},"uriWhitelist":{"type":"array","items":{"type":"string"},"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."},"albumBlacklist":{"type":"array","items":{"type":"string"},"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"]],"default":["Soundcloud"]}},"title":"MopidyData"},"ListenBrainzSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ListenBrainzSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `listenbrainz.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"ListenBrainzSourceConfig"},"ListenBrainzSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the ListenBrainz server, if not using the default","examples":["https://api.listenbrainz.org/"],"default":"https://api.listenbrainz.org/"},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","username"],"title":"ListenBrainzSourceData"},"JRiverSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/JRiverData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"JRiverSourceConfig"},"JRiverData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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/"],"default":"http://localhost:52199/MCWS/v1/"},"username":{"type":"string","description":"If you have enabled authentication, the username you set"},"password":{"type":"string","description":"If you have enabled authentication, the password you set"}},"required":["url"],"title":"JRiverData"},"KodiSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KodiData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"KodiSourceConfig"},"KodiData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","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"],"default":"http://localhost:8080/jsonrpc"},"username":{"type":"string","description":"The username set for Remote Control via Web Sever"},"password":{"type":"string","description":"The password set for Remote Control via Web Sever"}},"required":["url","username","password"],"title":"KodiData"},"WebScrobblerSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/WebScrobblerData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"title":"WebScrobblerSourceConfig"},"WebScrobblerData":{"type":"object","properties":{"slug":{"type":["string","null"],"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"},"blacklist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Block scrobbling from specific WebScrobbler Connectors","examples":[["youtube"]]},"whitelist":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Only allow scrobbling from specific WebScrobbler Connectors","examples":[["mixcloud","soundcloud","bandcamp"]]}},"title":"WebScrobblerData"},"ChromecastSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/ChromecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"ChromecastSourceConfig"},"ChromecastData":{"type":"object","properties":{"blacklistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"whitelistDevices":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"blacklistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"DO NOT scrobble from any application that START WITH these values, case-insensitive","examples":[["spotify","pandora"]]},"whitelistApps":{"anyOf":[{"type":"string"},{"type":"array","items":{"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"]]},"useAvahi":{"type":"boolean","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.","default":false},"useAutoDiscovery":{"type":"boolean","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"},"devices":{"type":"array","items":{"$ref":"#/definitions/ChromecastDeviceInfo"},"description":"A list of Google Cast devices to monitor\n\nIf this is used then `useAutoDiscovery` is set to FALSE, if not explicitly set"},"allowUnknownMedia":{"anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"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","default":false},"forceMediaRecognitionOn":{"type":"array","items":{"type":"string"},"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"}},"title":"ChromecastData"},"ChromecastDeviceInfo":{"type":"object","properties":{"name":{"type":"string","description":"A friendly name to identify this device","examples":["MySmartTV"]},"address":{"type":"string","description":"The IP address of the device","examples":["192.168.0.115"]}},"required":["name","address"],"title":"ChromecastDeviceInfo"},"MalojaSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MalojaSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `maloja.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"MalojaSourceConfig"},"MalojaSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for maloja server","examples":["http://localhost:42010"]},"apiKey":{"type":"string","description":"API Key for Maloja server","examples":["myApiKey"]}},"required":["apiKey","url"],"title":"MalojaSourceData"},"MusikcubeSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusikcubeData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"MusikcubeSourceConfig"},"MusikcubeData":{"type":"object","properties":{"url":{"type":"string","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"],"default":"ws://localhost:7905"},"password":{"type":"string","description":"Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation\n\n* musikcube -> settings -> server setup -> password"},"device_id":{"type":"string"}},"required":["password"],"title":"MusikcubeData"},"MusicCastSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MusicCastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"MusicCastSourceConfig"},"MusicCastData":{"type":"object","properties":{"url":{"type":"string","description":"The host or URL of the YamahaExtendedControl endpoint to use","examples":[["192.168.0.101","http://192.168.0.101/YamahaExtendedControl"]]}},"required":["url"],"title":"MusicCastData"},"MPDSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/MPDData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/MPDSourceOptions"}},"required":["data","options"],"title":"MPDSourceConfig"},"MPDData":{"type":"object","properties":{"url":{"type":"string","description":"URL:PORT of the MPD server to connect to\n\nTo use this you must have TCP connections enabled for your MPD server https://mpd.readthedocs.io/en/stable/user.html#client-connections","examples":["localhost:6600"],"default":"localhost:6600"},"path":{"type":"string","description":"If using socket specify the path instead of url.\n\ntrailing `~` is replaced by your home directory"},"password":{"type":"string","description":"Password for the server, if set https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords"}},"title":"MPDData"},"MPDSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"MPDSourceOptions"},"VLCSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/VLCData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/VLCSourceOptions"}},"required":["data"],"title":"VLCSourceConfig"},"VLCData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"url":{"type":"string","description":"URL:PORT of the VLC server to connect to\n\nTo use this you must have the Web (http) interface module enabled and a password set https://foxxmd.github.io/multi-scrobbler/docs/configuration#vlc","examples":["localhost:8080"],"default":"localhost:8080"},"password":{"type":"string","description":"Password for the server"}},"required":["password"],"title":"VLCData"},"VLCSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"filenamePatterns":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"A list of regular expressions to use to extract metadata (title, album, artist) from a filename\n\nUsed when VLC reports only the filename for the current audio track"},"logFilenamePatterns":{"type":"boolean","description":"Log to DEBUG when a filename-only track is matched or not matched by filenamePatterns","default":false},"dumpVlcMetadata":{"type":"boolean","description":"Dump all the metadata VLC reports for an audio track to DEBUG.\n\nUse this if reporting an issue with VLC not correctly capturing metadata for a track.","default":false}},"title":"VLCSourceOptions"},"IcecastSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/IcecastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/IcecastSourceOptions"}},"required":["data"],"title":"IcecastSourceConfig"},"IcecastData":{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/definitions/IcecastSource"}},"icestatsEndpoint":{"type":"string"},"statsEndpoint":{"type":"string"},"nextsongsEndpoint":{"type":"string"},"sevenhtmlEndpoint":{"type":"string"},"icyMetaInt":{"type":"number"},"url":{"type":"string","description":"The Icecast stream URL"}},"required":["url"],"title":"IcecastData"},"IcecastSource":{"type":"string","enum":["icy","ogg","icestats","stats","sevenhtml","nextsongs"],"title":"IcecastSource"},"IcecastSourceOptions":{"type":"object","properties":{"systemScrobble":{"type":"boolean","description":"For Sources that support manual listening, should MS default to scrobbling when no user interaction has occurred?\n\nIf not specified MS will use a Source's specific behavior, see Source's documentation."},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"IcecastSourceOptions"},"AzuracastSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/AzuracastData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"}},"required":["data"],"title":"AzuracastSourceConfig"},"AzuracastData":{"type":"object","properties":{"url":{"type":"string","description":"Base URL of the Azuracast instance\n\nThis does NOT include the station. If a station is included it will be ignored. Use `station` field to specify station, if necessary","examples":["https://radio.mydomain.tld","http://localhost:80"]},"station":{"type":"string","description":"The specific station to monitor\n\nScrobbling will only occur if any of the monitor conditions are met AND the station is ONLINE.\n\nTo monitor multiple stations create a Source for each station.","examples":["my-station-1"]},"monitorWhenListeners":{"type":["boolean","number"],"description":"Only activate scrobble monitoring if station\n\n* `true` => has any current listeners\n* `number` => has EQUAL TO or MORE THAN X number of listeners"},"monitorWhenLive":{"type":"boolean","description":"Only activate scrobble monitoring if station has a live DJ/Streamer","default":true},"apiKey":{"type":"string","description":"API Key used to access data about private streams\n\nhttps://www.azuracast.com/docs/developers/apis/#api-authentication"}},"required":["url","station"],"title":"AzuracastData"},"KoitoSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/KoitoSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/CommonSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `koito.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"KoitoSourceConfig"},"KoitoSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"url":{"type":"string","description":"URL for the Koito server","examples":["http://192.168.0.100:4110"]},"token":{"type":"string","description":"User token for the user to scrobble for","examples":["pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"]},"username":{"type":"string","description":"Username of the user to scrobble for"}},"required":["token","url","username"],"title":"KoitoSourceData"},"TealSourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/TealSourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/TealSourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"Should always be `souce` when using Tealfm as a Source","default":"source","examples":["source"]}},"required":["data"],"title":"TealSourceConfig"},"TealSourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"baseUri":{"type":"string","description":"The base URI of the Multi-Scrobbler to use for ATProto OAuth\n\nOnly include this if you want to use OAuth. The URI must be a non-IP/non-local domain using https: protocol."},"identifier":{"type":"string","description":"Identify the account to login as\n\n* For **App Password** Auth - your email\n* For **Oauth** - your handle minus the @"},"appPassword":{"type":"string","description":"The [App Password](https://atproto.com/specs/xrpc#app-passwords) you created for your account\n\nThis is created under https://bsky.app/settings/app-passwords\n\n**Use this if you are self-hosting Multi-Scrobbler on localhost or accessed like http://IP:PORT**"},"serviceAllow":{"type":"array","items":{"type":"string"}},"serviceDeny":{"type":"array","items":{"type":"string"}}},"required":["identifier"],"title":"TealSourceData"},"TealSourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"}},"title":"TealSourceOptions"},"RockskySourceConfig":{"type":"object","properties":{"name":{"type":"string","description":"Unique identifier for this source."},"data":{"$ref":"#/definitions/RockskySourceData"},"enable":{"type":"boolean","description":"Should MS use this client/source? Defaults to true","default":true,"examples":[true]},"clients":{"type":"array","items":{"type":"string"},"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"]]},"options":{"$ref":"#/definitions/RockskySourceOptions"},"configureAs":{"type":"string","enum":["source"],"description":"When used in `rocksky.config` this tells multi-scrobbler whether to use this data to configure a source or client.","default":"source","examples":["source"]}},"required":["data"],"title":"RockskySourceConfig"},"RockskySourceData":{"type":"object","properties":{"interval":{"type":"number","description":"How long to wait before polling the source API for new tracks (in seconds)","default":10,"examples":[10]},"maxInterval":{"type":"number","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)","default":30,"examples":[30]},"staleAfter":{"type":"number","description":"Number of seconds after which A Player is considered Stale\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Stale. When the Player becomes Stale:\n\n* The current listening session is ended. If the Player becomes active again a new listening session is started (Player will miss `interval` seconds of listening)\n* If the player has an existing session w/ track then MS attempts to scrobble it\n\nThis option DOES NOT need to be set. It is automatically calculated as (`interval` * 3) when not defined."},"orphanedAfter":{"type":"number","description":"Number of seconds after which A Player is considered Orphaned\n\nWhen Polling the source does not recieve data about a specific Player after X seconds it becomes Orphaned. When the Player becomes Orphaned:\n\n* The current Player session is ended and the Player is removed from MS\n* MS attempts to scrobble, if the Player has an existing session w/ track\n\nA Player should become Orphaned EQUAL TO OR AFTER it becomes Stale.\n\n* This option DOES NOT need to be set. It is automatically calculated as (`interval` * 5) when not defined.\n* If it is set it must be equal to or larger than `staleAfter` or (`interval * 3`)"},"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"key":{"type":"string","description":"API Key generated from [API Applications](https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0) in Rocksky for your account","examples":["6794186bf-1157-4de6-80e5-uvb411f3ea2b"]},"handle":{"type":"string","description":"The **fully-qualified** handle for your ATPRoto/Bluesky account, like:\n\n* alice.bsky.social\n* foxxmd.com\n* mysuer.blacksky.app"}},"required":["handle","key"],"title":"RockskySourceData"},"RockskySourceOptions":{"type":"object","properties":{"maxRequestRetries":{"type":"number","description":"default # of http request retries a source/client can make before error is thrown","default":1,"examples":[1]},"retryMultiplier":{"type":"number","description":"default retry delay multiplier (retry attempt * multiplier = # of seconds to wait before retrying)","default":1.5,"examples":[1.5]},"maxPollRetries":{"type":"number","description":"default # of automatic polling restarts on error","default":5,"examples":[5]},"logPayload":{"type":"boolean","description":"* If this source has INGRESS to MS (sends a payload, rather than MS GETTING requesting a payload) then setting this option to true will make MS log the payload JSON to DEBUG output\n* If this source is POLLING then it will log the raw data for each unique track/response the first time it is seen","default":false,"examples":[false]},"logFilterFailure":{"type":["boolean","string"],"enum":[false,"debug","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.","default":"warn","examples":["warn"]},"logPlayerState":{"type":"boolean","description":"For Sources that track Player State (currently playing) this logs a simple player state/summary to DEBUG output","default":false,"examples":[false]},"logToFile":{"anyOf":[{"type":"boolean","enum":[true]},{"$ref":"#/definitions/LogLevel"},{"$ref":"#/definitions/FileLogOptions"}],"description":"**Exprimental:** Log to a separate file for this Source.\n\nUseful for debugging long-running Sources"},"scrobbleBacklog":{"type":"boolean","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","default":true,"examples":[true,false]},"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."},"scrobbleBacklogCount":{"type":"number","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"},"playTransform":{"$ref":"#/definitions/PlayTransformOptions"},"audioScrobblerUrl":{"type":"string","description":"URL for the Rocksky *Listenbrainz* endpoint, if not using the default","examples":["https://audioscrobbler.rocksky.app"],"default":"https://audioscrobbler.rocksky.app"},"apiUrl":{"type":"string","description":"URL for the Rocksky *API* endpoint, if not using the default","examples":["https://api.rocksky.app"],"default":"https://api.rocksky.app"}},"title":"RockskySourceOptions"}}}
+3 -3
updating/index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="generator" content="Docusaurus v3.8.1"> 6 6 <title data-rh="true">Overview | Multi-Scrobbler</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" name="twitter:image" content="https://foxxmd.github.io/multi-scrobbler/img/icon.png"><meta data-rh="true" property="og:url" content="https://foxxmd.github.io/multi-scrobbler/updating/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Overview | Multi-Scrobbler"><meta data-rh="true" name="description" content="Updating"><meta data-rh="true" property="og:description" content="Updating"><link data-rh="true" rel="icon" href="/multi-scrobbler/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://foxxmd.github.io/multi-scrobbler/updating/"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/updating/" hreflang="en"><link data-rh="true" rel="alternate" href="https://foxxmd.github.io/multi-scrobbler/updating/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Updating","item":"https://foxxmd.github.io/multi-scrobbler/category/updating"},{"@type":"ListItem","position":2,"name":"Overview","item":"https://foxxmd.github.io/multi-scrobbler/updating/"}]}</script><meta name="google-site-verification" content="8hqrPhw4yuoTBM6c3S10aC8L4tu4aIBe8Q-oSP3OES0"> 7 - <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.5e084d52.css"> 8 - <script src="/multi-scrobbler/assets/js/runtime~main.02b4bf18.js" defer="defer"></script> 9 - <script src="/multi-scrobbler/assets/js/main.5b56ee47.js" defer="defer"></script> 7 + <script src="https://ry.foxxmd.dev/api/script.js" defer="defer" data-site-id="3" data-session-replay="true"></script><link rel="stylesheet" href="/multi-scrobbler/assets/css/styles.c6d98630.css"> 8 + <script src="/multi-scrobbler/assets/js/runtime~main.3a0237cb.js" defer="defer"></script> 9 + <script src="/multi-scrobbler/assets/js/main.613e1b10.js" defer="defer"></script> 10 10 </head> 11 11 <body class="navigation-with-keyboard"> 12 12 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>